Wyniki egzaminu

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

Egzamin niezdany

Wynik: 17/40 punktów (42,5%)

Wymagane minimum: 20 punktów (50%)

Nowe
Analiza przebiegu egzaminu- sprawdź jak rozwiązywałeś pytania
Udostępnij swój wynik
Szczegółowe wyniki:
Pytanie 1

Jak nazywa się proces znajdowania i usuwania błędów w kodzie?

A. Interpretowanie
B. Kompilowanie
C. Kompensowanie
D. Debugowanie
Debugowanie to niezwykle istotny etap w procesie tworzenia oprogramowania, polegający na identyfikowaniu i eliminowaniu błędów w kodzie źródłowym. Jest to proces, który wymaga zrozumienia logiki programu oraz umiejętności analitycznych, aby skutecznie odnaleźć przyczynę problemu i ją usunąć. Debugowanie jest kluczowe dla zapewnienia, że aplikacja działa zgodnie z zamierzeniami i jest wolna od błędów, które mogłyby wpłynąć na jej funkcjonalność lub stabilność. W praktyce debugowanie może obejmować różne techniki, takie jak użycie narzędzi do śledzenia wykonania kodu, analizę logów czy testowanie jednostkowe. Programiści często korzystają z dedykowanych środowisk programistycznych (IDE), które oferują funkcje ułatwiające debugowanie, takie jak punkty przerwań czy inspekcja zmiennych. Dobrym przykładem jest Visual Studio, które umożliwia śledzenie wartości zmiennych w czasie rzeczywistym. Debugowanie jest również częścią dobrych praktyk programistycznych, które zakładają regularne testowanie i kontrolę jakości kodu. Dzięki temu możliwe jest nie tylko eliminowanie błędów, ale także poprawa wydajności i bezpieczeństwa aplikacji.

Pytanie 2

Zaprezentowany diagram ilustruje wyniki przeprowadzonych testów:

Informacje o stronie
Wyświetlenie po1.431 si
Pobieranie2.815 si
Całkowity czas wczytania4.395 si
Czas powtórnego wczytania1.609 si
Ilość przekierowań (wpisanego adresu)1i
Ilość żądań145i
Łącznie przesłane6.71 MBi
Pomijane przy powtórnym ładowaniu6.47 MB (96%)i
Rozmiar rzeczywisty8.29 MBi
A. wydajnościowych
B. ochrony
C. funkcjonalności
D. użyteczności
To właśnie są testy wydajnościowe – dokładnie takie parametry jak czasy ładowania, liczba żądań HTTP, rozmiar przesyłanych danych czy ilość przekierowań analizuje się w praktyce podczas oceny wydajności stron internetowych. Moim zdaniem ten typ testów jest absolutnie kluczowy w projektowaniu nowoczesnych aplikacji webowych, bo użytkownicy szybko rezygnują, jeśli strona się długo ładuje albo jest zbyt zasobożerna. W branży zwraca się obecnie ogromną uwagę na to, by strony były 'lekkie', szybkie i zoptymalizowane pod kątem przesyłu danych. Nawet Google premiuje szybkie serwisy w wynikach wyszukiwania, co niejeden programista już odczuł na własnej skórze. Testy wydajnościowe sprawdzają, jak aplikacja zachowuje się pod dużym obciążeniem i ile danych realnie pobierają użytkownicy. W praktyce polecam korzystać z narzędzi takich jak Google Lighthouse, WebPageTest czy nawet prosty DevTools w przeglądarce – pozwalają szybko wyłapać największe problemy z czasem ładowania. Warto też pamiętać, że optymalizacja wydajności to nie tylko lepsze wrażenia użytkownika, ale bardzo wymierne oszczędności na transferze i infrastrukturze. Dobry zwyczaj to cyklicznie monitorować te wskaźniki, nawet gdy wydaje się, że wszystko działa OK – bo sytuacja może się szybko zmienić po wdrożeniu nowych funkcjonalności lub zmianach w kodzie.

Pytanie 3

Który z algorytmów ma złożoność O(n²)?

A. Binary Search
B. Merge Sort
C. Dijkstra
D. Bubble Sort
Bubble Sort to algorytm o złożoności O(n²), co oznacza, że jego czas wykonania rośnie kwadratowo wraz ze wzrostem liczby elementów wejściowych. Algorytm porównuje sąsiadujące elementy i zamienia je miejscami, jeśli są w złej kolejności. Proces ten powtarza się wielokrotnie, aż do uzyskania pełnego posortowania tablicy. Ze względu na swoją prostotę, Bubble Sort jest często wykorzystywany do nauki podstaw algorytmiki, ale w praktyce rzadko stosuje się go do sortowania dużych zbiorów danych, ponieważ jest nieefektywny w porównaniu do bardziej zaawansowanych algorytmów, takich jak QuickSort czy Merge Sort.

Pytanie 4

Na podstawie zamieszczonego fragmentu kodu można stwierdzić, że element o nazwie rysunek jest

MojaKlasa obj1 = new MojaKlasa();
obj1.rysunek();
A. metodą w klasie
B. polem w klasie
C. konstruktorem
D. obiektem
W tym fragmencie kodu wywołujesz funkcję rysunek na obiekcie obj1, który jest instancją klasy MojaKlasa. To znaczy, że rysunek jest metodą tej klasy. Tak naprawdę, w programowaniu obiektowym korzystanie z metod to chleb powszedni – to one definiują zachowanie obiektu. W praktyce, metody są tym, co pozwala obiektom „robić” coś konkretnego, czyli realizować logikę biznesową albo odpowiadać na zdarzenia. Moim zdaniem warto pamiętać, że w standardach takich jak Java czy C#, notacja obj1.rysunek() jednoznacznie wskazuje na wywołanie metody (nawiasy są tu sygnałem, że chodzi o funkcję, a nie o dostęp do pola). To zresztą jest bardzo czytelna konwencja, spotykana praktycznie w każdym języku zorientowanym obiektowo. Dla przykładu, jeśli chciałbyś uzyskać dostęp do pola w obiekcie, nie używałbyś nawiasów, tylko napisałbyś obj1.nazwapola. W pracy nad większymi projektami warto też pamiętać o tzw. enkapsulacji – metody pozwalają „schować” szczegóły implementacji i udostępnić tylko to, co faktycznie powinno być dostępne z zewnątrz. W sumie, wywołanie obj1.rysunek(); dokładnie pokazuje, jak od strony praktycznej wyglądają interakcje z metodą klasy.

Pytanie 5

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

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

Pytanie 6

W jaki sposób można zmniejszyć liczbę danych zbieranych przez aplikacje mobilne?

A. Nie blokować aplikacjom dostępu do lokalizacji oraz kontaktów
B. Używać aplikacji bez sprawdzania ich źródła
C. Weryfikować i regulować uprawnienia aplikacji w ustawieniach
D. Udostępniać aplikacjom wszystkie niezbędne informacje
Dostosowanie uprawnień aplikacji w ustawieniach swojego telefonu to naprawdę dobry sposób na ograniczenie tego, co aplikacje mogą o nas wiedzieć. Wiele z nich, jak np. te do robienia zdjęć, prosi o dostęp do lokalizacji czy kontaktów, ale nie zawsze jest to potrzebne. Warto co jakiś czas sprawdzić, czy jakieś aplikacje nie mają za dużo uprawnień. Dzięki temu lepiej zabezpieczymy swoją prywatność i zmniejszymy ryzyko, że nasze dane wyciekną. Lepiej też unikać aplikacji z nieznanych źródeł, bo mogą one zbierać więcej informacji, niż byśmy chcieli.

Pytanie 7

Jakie jest zadanie interpretera?

A. tłumaczenie kodu na kod maszynowy
B. analiza składni całego programu przed jego uruchomieniem
C. wykonywanie skryptu krok po kroku
D. optymalizacja większej części kodu, aby przyspieszyć jego wykonanie
Zobacz, dlaczego niektóre odpowiedzi były błędne w przypadku interpretera. Przede wszystkim, optymalizacja kodu nie jest jego głównym zadaniem. Choć można powiedzieć, że interpreter czasem poprawia wydajność, to nie o to tutaj chodzi. I pamiętaj, tłumaczenie kodu na kod maszynowy to zadanie kompilatora. Kompilatory biorą cały program i przetwarzają go przed uruchomieniem, a interpreter działa trochę inaczej – wykonuje kod krok po kroku. Dlatego nie tworzy oddzielnego pliku do uruchomienia. Co więcej, mówiąc o analizie składni, to jasne, że interpreter to robi, ale nie jest to jego główny cel. Chodzi o to, żeby wykonać kod od razu, a nie analizować wszystko przed. Te różnice są ważne i pokazują, jak bardzo się różnią kompilatory od interpreterów oraz gdzie każdy z nich ma swoje miejsce.

Pytanie 8

Jakie z wymienionych narzędzi służy do emulacji mobilnych urządzeń podczas developowania aplikacji?

A. TensorFlow
B. Numpy
C. Postman
D. Genymotion
TensorFlow to biblioteka do uczenia maszynowego i analizy danych, ale nie jest narzędziem do emulacji urządzeń mobilnych. Postman to narzędzie do testowania API i komunikacji z serwerami, co jest przydatne w kontekście backendu, ale nie służy do emulacji urządzeń mobilnych. Numpy to biblioteka do obliczeń numerycznych w Pythonie, która nie ma związku z testowaniem aplikacji mobilnych na różnych urządzeniach. Genymotion wyróżnia się jako dedykowane narzędzie do symulacji środowiska mobilnego, umożliwiające testowanie w czasie rzeczywistym na wielu wirtualnych urządzeniach.

Pytanie 9

Zaprezentowany fragment kodu w języku C# tworzy hasło. Wskaż zdanie PRAWDZIWE dotyczące charakterystyki tego hasła:

var random = new Random();
string pulaZnakow = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";

int dlPuli = pulaZnakow.Length - 1;
char znak;
string wynik = "";

for(int i = 0; i < 8; i++)  {
    znak = pulaZnakow[random.Next(0, dlPuli)];
    wynik += znak;
}
A. Ma co najmniej 8 znaków oraz zawiera małe i wielkie litery oraz cyfry
B. Może zawierać zarówno małe, jak i wielkie litery, cyfry oraz symbole
C. Jest maksymalnie 7-znakowe, co wynika z wartości zmiennej i
D. Może zawierać małe i wielkie litery oraz cyfry
Patrząc na pozostałe odpowiedzi, nietrudno zauważyć typowe pomyłki, które pojawiają się przy analizie kodu generującego hasła. Często spotykam się z błędnym założeniem, że jeśli mamy losowy wybór ze znacznej puli znaków, to automatycznie generowane hasło może zawierać symbole czy inne znaki specjalne. W tym przypadku pulaZnakow wyraźnie ogranicza się tylko do liter – małych i wielkich – oraz cyfr, stąd nie ma możliwości, by pojawił się jakikolwiek symbol, co już obala pierwszą odpowiedź. Następna rzecz – twierdzenie, że hasło ma co najmniej 8 znaków – jest nieścisłe: kod ustawia pętlę for na osiem powtórzeń, więc hasło będzie miało zawsze dokładnie 8 znaków, ani więcej, ani mniej (chyba że ręcznie zmodyfikujemy kod), więc nie jest to 'co najmniej'. Sformułowanie o długości „maksymalnie 7-znakowej” wynika najpewniej z nieuważnego czytania zakresu powtórzeń pętli: for (int i = 0; i < 8; i++) oznacza 8 iteracji, czyli 8 znaków, a nie 7. Często w praktyce ludzie gubią się w liczeniu zakresów, bo zaczynają od zera, ale liczba iteracji jest tu bezpośrednio związana z warunkiem i<wartość>. To są pomyłki, które łatwo popełnić, gdy nie czyta się kodu bardzo uważnie albo nie ćwiczyło się podobnych przypadków na własnych przykładach. Wreszcie, niektóre odpowiedzi próbują dodać jakieś cechy hasła (np. obecność symboli), których w kodzie po prostu nie ma, bo pulaZnakow na to nie pozwala. W branży bezpieczeństwa takie detale są bardzo istotne i weryfikacja puli znaków to pierwszy krok przy analizie generatorów haseł. Zawsze warto szczegółowo patrzeć, co faktycznie znajduje się w zmiennej określającej dostępne znaki, a nie zakładać, że kod jest bardziej zaawansowany, niż jest w rzeczywistości.

Pytanie 10

Jakie metody pozwalają na przesłanie danych z serwera do aplikacji front-end?

A. protokołu SSH
B. metody POST
C. biblioteki jQuery
D. formatu JSON
Wśród zaproponowanych odpowiedzi pojawiło się kilka nieporozumień technicznych, które niestety są dość często spotykane u początkujących programistów. Przede wszystkim, biblioteka jQuery sama w sobie nie jest metodą przesyłania danych – to narzędzie, które może ułatwić pobieranie i wysyłanie danych na front-endzie, ale bez określonego formatu danych (np. JSON) jej obecność niewiele znaczy w kontekście komunikacji z serwerem. Moim zdaniem stąd czasem bierze się mylne przekonanie, że jQuery "przesyła dane", ale to tylko narzędzie, a nie metoda czy format wymiany informacji. Jeśli chodzi o protokół SSH, to jest on zupełnie niepowiązany z komunikacją webową – SSH służy głównie do bezpiecznego zdalnego zarządzania serwerami i nie jest wykorzystywany do przesyłania danych pomiędzy serwerem a przeglądarką. SSH dobrze się sprawdza przy pracy zdalnej na terminalu, ale nie przy typowej wymianie danych w aplikacjach webowych. Z kolei metoda POST to jeden z typów żądań HTTP, który określa sposób przesłania danych do serwera, ale nie precyzuje formatu tych danych. Możemy wysłać w POST-cie tekst, plik, dane binarne, XML czy JSON – nie jest to więc format, tylko sposób komunikacji. Bardzo często początkujący mylą metodę HTTP z formatem danych, co prowadzi do niedokładnych odpowiedzi. Odpowiednie rozróżnienie między narzędziem, protokołem, metodą żądania a formatem danych jest kluczowe w codziennej pracy webdevelopera. W praktyce to właśnie wybór formatu – a nie tylko metody żądania czy użytej biblioteki – decyduje o tym, jak łatwo aplikacje front-end i back-end będą w stanie się "dogadać". JSON jest tu najlepszym przykładem takiego uniwersalnego sposobu wymiany danych.

Pytanie 11

Które z poniższych stwierdzeń jest prawdziwe w kontekście dziedziczenia w języku Java?

A. Java nie wspiera dziedziczenia.
B. Dziedziczenie jest niezalecane w języku Java.
C. Klasa pochodna może dziedziczyć po wielu klasach bazowych.
D. Klasa pochodna dziedziczy po jednej klasie bazowej.
W kontekście dziedziczenia w języku Java istnieje kilka powszechnych nieporozumień. Po pierwsze, język Java nie wspiera dziedziczenia wielokrotnego, co oznacza, że klasa pochodna nie może dziedziczyć po więcej niż jednej klasie bazowej. Pomimo że inne języki, jak C++, pozwalają na dziedziczenie wielokrotne, Java projektowo unikała tego podejścia, aby zniwelować złożoność i problemy takie jak 'diamentowy problem'. W Java, zamiast dziedziczenia wielokrotnego, używa się interfejsów, które mogą być implementowane przez klasę, dając jej dodatkowe funkcjonalności bez narzucania struktury dziedziczenia. Po drugie, stwierdzenie, że Java nie wspiera dziedziczenia, jest niepoprawne, ponieważ dziedziczenie jest fundamentalnym aspektem języka Java i jednym z filarów programowania obiektowego. Dzięki dziedziczeniu można tworzyć hierarchie klas, co zwiększa możliwość ponownego użycia kodu i jego organizacji. Na koniec, twierdzenie, że dziedziczenie jest niezalecane w Java, również jest błędne. Dziedziczenie jest powszechnie stosowane w Java i stanowi podstawę wielu wzorców projektowych. Należy jednak stosować je z rozwagą, aby zapewnić przejrzystość kodu i uniknąć nadmiernego skomplikowania hierarchii klas. Koncepcja dziedziczenia w Java jest kluczowa i szeroko używana w praktyce, choć zawsze z uwzględnieniem najlepszych praktyk projektowych.

Pytanie 12

Które z poniższych nie jest frameworkiem JavaScript?

A. Vue.js
B. React
C. Django
D. Angular
Odpowiedzi takie jak Angular, Vue.js i React są frameworkami oraz bibliotekami JavaScript, które służą do budowy interfejsów użytkownika w aplikacjach webowych. Angular to kompleksowy framework stworzony przez Google, który wspiera architekturę typu MVC (Model-View-Controller) oraz promuje stosowanie komponentów, co ułatwia rozwój dużych aplikacji. Vue.js, z kolei, jest progresywnym frameworkiem, który pozwala na stopniowe wprowadzanie go w istniejących projektach, a jego elastyczność sprawia, że jest popularnym wyborem wśród frontendowców. React, stworzony przez Facebook, to biblioteka do budowy UI, koncentrująca się na tworzeniu interaktywnych komponentów. Każde z tych rozwiązań ma swoje unikalne cechy, a ich stosowanie jest szeroko akceptowane w branży jako najlepsze praktyki przy tworzeniu nowoczesnych aplikacji webowych. Pomylenie Django z tymi frameworkami może wynikać z nieznajomości roli jaką odgrywają różne języki programowania oraz frameworki w ekosystemie webowym. Zrozumienie różnic między technologiami backendowymi a frontendowymi jest kluczowe dla programistów, którzy chcą skutecznie przyczyniać się do pracy zespołów deweloperskich."]

Pytanie 13

Jednym z kroków przy publikacji aplikacji mobilnej w sklepie Google Play są testy Beta, które charakteryzują się tym, że są one

A. przeprowadzane przez grupę docelowych użytkowników aplikacji
B. realizowane przez zespół testerów zatrudnionych przez firmę Google
C. podzielone na testy funkcjonalne, wydajnościowe oraz skalowalności
D. przeprowadzane na podstawie dokumentu zawierającego przypadki testowe
Testy Beta są kluczowym etapem w procesie publikacji aplikacji mobilnej w sklepie Google Play, ponieważ pozwalają na uzyskanie cennych informacji zwrotnych od rzeczywistych użytkowników aplikacji. W tej fazie aplikacja jest udostępniana ograniczonej grupie docelowych użytkowników, którzy są zainteresowani testowaniem oprogramowania przed jego oficjalnym wydaniem. Użytkownicy ci mają możliwość zgłaszania błędów, proponowania ulepszeń oraz oceny funkcjonalności, co jest niezwykle ważne, aby zapewnić, że produkt spełnia wymagania rynku. Przykładem zastosowania testów Beta może być aplikacja społecznościowa, która w pierwszej fazie testowania pozwala wybranej grupie użytkowników na dzielenie się swoimi doświadczeniami. Otrzymane dane są następnie analizowane w celu wprowadzenia niezbędnych poprawek przed pełnym wprowadzeniem aplikacji na rynek. Ponadto, przeprowadzanie testów Beta jest zgodne z najlepszymi praktykami w branży oprogramowania, zgodnie z metodykami Agile, które podkreślają znaczenie interakcji z użytkownikami oraz ich wkładu w rozwój produktów.

Pytanie 14

Jakie jest wymagane minimalne natężenie światła w biurze na stanowisku pracy?

A. 500 lx
B. 100 lx
C. 800 lx
D. 200 lx
Minimalne natężenie oświetlenia, jakie powinno być w biurze, to 500 lx (luksów). To taki standard, który ustalono w normach BHP i ergonomii. Dzięki temu lepiej się pracuje przy komputerze i łatwiej robić zadania, które wymagają dobrego wzroku. Odpowiednie oświetlenie zdecydowanie zmniejsza zmęczenie oczu i poprawia koncentrację, co jest istotne, żeby uniknąć bólów głowy i być bardziej efektywnym w pracy. Ważne, żeby światło było równomierne i nie odbijało się na monitorze, bo to może rozpraszać. Warto dbać o takie warunki, bo to zmniejsza ryzyko problemów ze wzrokiem, a komfort pracy jest mega ważny, zwłaszcza gdy ktoś spędza dużo czasu przed komputerem.

Pytanie 15

Który system operacyjny jest podstawowym środowiskiem do tworzenia aplikacji mobilnych w języku Swift?

A. LG UX
B. Windows UWP
C. iOS
D. Android
Chociaż może się wydawać, że język programowania taki jak Swift da się wykorzystać na wielu różnych platformach mobilnych, to jednak jego projektowanie i rozwój były bardzo mocno związane z ekosystemem Apple. Android, choć jest największym systemem mobilnym na świecie, korzysta z innych technologii – głównie języka Java i Kotlin. Próbując pisać aplikacje mobilne na Androida w Swifcie, natrafiamy na całą masę problemów technicznych: brak oficjalnych narzędzi, wsparcia społeczności i integracji z Android SDK. Z moich obserwacji wynika, że są jakieś eksperymentalne mosty, ale to bardziej ciekawostka niż coś, co można używać w produkcji. Z kolei LG UX nie jest nawet osobnym systemem operacyjnym, tylko nakładką na Androida wykorzystywaną przez wybrane telefony LG – tu w ogóle nie ma mowy o natywnym wykorzystaniu Swifta, zresztą praktycznie nikt go tam nie używa. Jeśli chodzi o Windows UWP – ta platforma służy budowaniu uniwersalnych aplikacji na Windowsa, ale używa się tam innych technologii, głównie C#, czasami C++, czy nawet JavaScript. Swift na tej platformie to raczej egzotyczny temat i nie ma oficjalnego wsparcia. Myślę, że sporo osób myli dostępność języka (bo Swift jest open source) z możliwościami praktycznego wdrożenia. W branży przyjęło się, że wybierając środowisko do budowy aplikacji mobilnych w Swifcie, wybieramy przede wszystkim iOS, bo tylko tam mamy pełnię wsparcia, narzędzi i zgodność z wytycznymi Apple. Warto o tym pamiętać, żeby nie tracić czasu na próby wdrażania Swifta tam, gdzie po prostu nie jest to przewidziane przez producentów platform.

Pytanie 16

Który z wymienionych elementów jest fundamentalny w architekturze klient-serwer?

A. Wyłącznie komunikacja synchroniczna
B. Zdalne wykonywanie aplikacji na urządzeniu klienta
C. Brak podziału na funkcje klienta i serwera
D. Scentralizowane przechowywanie danych
Zdalne wykonywanie aplikacji na urządzeniu klienta oznacza model przetwarzania lokalnego, co nie jest główną cechą architektury klient-serwer. Brak podziału na funkcje klienta i serwera narusza podstawową ideę tego modelu, który zakłada rozdzielenie ról pomiędzy te dwie jednostki. Wyłącznie komunikacja synchroniczna ogranicza elastyczność aplikacji i może prowadzić do opóźnień w przetwarzaniu danych.

Pytanie 17

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

A. Ograniczenie widoczności atrybutów klasy
B. Umożliwienie funkcji dostępu do prywatnych atrybutów klasy
C. Generowanie kopii pól obiektu w innej klasie
D. Dodawanie nowych instancji do 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 18

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. Jest automatycznie usuwana po zakończeniu działania programu
D. Dziedziczy atrybuty i metody z klasy bazowej
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 19

Który z komponentów interfejsu użytkownika umożliwia użytkownikowi wprowadzanie danych tekstowych?

A. Pasek narzędziowy
B. Pole tekstowe
C. Przycisk
D. Dialog wyboru pliku
Pole tekstowe to element interfejsu użytkownika, który pozwala użytkownikowi na wprowadzanie danych tekstowych. Jest to jeden z najczęściej używanych komponentów UI w aplikacjach desktopowych, mobilnych i webowych. Pole tekstowe umożliwia wprowadzanie haseł, adresów e-mail, wiadomości i innych danych. W nowoczesnych aplikacjach często zawiera walidację, która sprawdza poprawność wpisywanych danych w czasie rzeczywistym. Dzięki swojej elastyczności, pola tekstowe mogą być wykorzystywane w różnorodnych formularzach, ankietach i systemach rejestracji użytkowników, co czyni je nieodzownym elementem aplikacji o dowolnym przeznaczeniu.

Pytanie 20

Wskaź kod, który spowoduje wyświetlenie okna dialogowego przedstawionego na ilustracji. Dla uproszczenia kodu, zrezygnowano z atrybutów znaczników

Ilustracja do pytania
A. kod 3
B. kod 1
C. kod 4
D. kod 2
W przypadku niepoprawnych odpowiedzi, wygląda na to, że coś poszło nie tak w rozmieszczeniu elementów. Kod 1, na przykład, ma Label, ale zamiast TextBoxa, co nie zgadza się z tym, co widzimy na obrazku. Label to tylko tekst, a TextBox to to, co pozwala na interakcję. Potem mamy kod 3, który ma ListBox. To nie jest to, czego szukamy, bo ListBox wyświetla listę, a tu go nie było. Kod 4 z ComboBoxem też nie jest odpowiedni, bo ten komponent ma rozwijaną listę, a to się nie zgadza z naszym oknem. To mogą być typowe pułapki, gdy nie do końca rozumie się różnice między kontrolkami. Dlatego warto przyjrzeć się jeszcze raz wszystkim wymaganiom wizualnym i funkcjonalnym, żeby dobrze dobrać elementy. Zrozumienie tych różnic jest naprawdę ważne, jak się projektuje interfejsy.

Pytanie 21

Jakie elementy powinny być uwzględnione w scenariuszu testów aplikacji?

A. Dokumentacja techniczna oprogramowania
B. Zestaw kroków do testowania, oczekiwanych rezultatów oraz warunków początkowych
C. Strategia wdrożenia aplikacji w środowisku produkcyjnym
D. Dokładne wytyczne dotyczące realizacji kodu
Scenariusz testowy aplikacji powinien zawierać szczegółowy opis kroków testowych, oczekiwane wyniki oraz warunki wstępne, które muszą być spełnione przed rozpoczęciem testu. Scenariusz testowy to kluczowy dokument w procesie testowania oprogramowania, który pozwala na systematyczne i dokładne sprawdzenie, czy aplikacja działa zgodnie z oczekiwaniami. Uwzględnienie kroków testowych pozwala na replikację testów, a opis warunków wstępnych zapewnia, że test jest przeprowadzany w odpowiednim środowisku.

Pytanie 22

Jakie jest podstawowe zastosowanie wzorca projektowego Singleton?

A. Tworzenie wielu instancji obiektu na podstawie klasy
B. Szybsza komunikacja pomiędzy obiektami
C. Zapewnienie jednej instancji obiektu w aplikacji
D. Optymalizacja pamięci poprzez dziedziczenie
Wzorzec projektowy Singleton jest jednym z najbardziej rozpoznawalnych wzorców w świecie programowania obiektowego. Jego głównym celem jest zapewnienie istnienia dokładnie jednej instancji danej klasy w całej aplikacji, co jest kluczowe w sytuacjach, gdy posiadanie wielu instancji mogłoby prowadzić do problemów z synchronizacją lub niepożądanymi skutkami w stanach programu. Singleton jest często stosowany w kontekście zarządzania zasobami, takimi jak połączenia z bazą danych, gdzie jednoczesne posiadanie wielu połączeń może prowadzić do nieefektywnego wykorzystania zasobów. Wzorzec ten jest również używany do implementowania globalnych punktów dostępu, co umożliwia centralne zarządzanie pewnymi zasobami lub stanami w aplikacji. Z punktu widzenia dobrych praktyk, ważne jest, aby Singleton był zaimplementowany w sposób bezpieczny dla wątków, aby uniknąć problemów z wyścigami, które mogą wystąpić, gdy wiele wątków próbuje jednocześnie utworzyć instancję Singletona. Stosowanie Singletona może wprowadzać pewne ograniczenia w testowaniu jednostkowym, z uwagi na jego globalny charakter, jednak odpowiednia konstrukcja kodu, na przykład poprzez wstrzykiwanie zależności, może pomóc w zachowaniu elastyczności testowania.

Pytanie 23

Który typ testów jest wykonywany na pojedynczych komponentach lub funkcjach w izolacji?

A. Testy systemowe
B. Testy integracyjne
C. Testy akceptacyjne
D. Testy jednostkowe
Nieprawidłowe odpowiedzi wskazują na pewne nieporozumienia dotyczące różnych typów testów. Testy integracyjne skupiają się na weryfikacji interakcji między różnymi komponentami systemu, a nie na testowaniu pojedynczych jednostek. Ich celem jest zapewnienie, że różne części aplikacji współpracują ze sobą poprawnie, co nie jest zgodne z definicją testów jednostkowych, które dotyczą izolowania pojedynczych funkcji. Z kolei testy systemowe mają na celu ocenę całego systemu jako całości, badając, czy spełnia on wymagania funkcjonalne i niefunkcjonalne. Takie podejście do testowania jest znacznie szersze niż testy jednostkowe, które nie obejmują interakcji między komponentami. Testy akceptacyjne z kolei sprawdzają, czy system spełnia kryteria akceptacji ustalone przez klienta, również nie koncentrując się na pojedynczych funkcjach. Wybierając niewłaściwy typ testów, można stracić z oczu niezbędność testowania kodu na poziomie jednostkowym, co prowadzi do późniejszych problemów z jakością oprogramowania. Wiele osób myli te różne rodzaje testów, co może skutkować błędnym zrozumieniem procesu testowania oprogramowania. Kluczowe jest, aby pamiętać, że każdy typ testu ma swoje specyficzne cele i zastosowania, a ich odpowiednie rozróżnienie jest niezbędne dla skutecznego zapewnienia jakości w inżynierii oprogramowania.

Pytanie 24

W języku C++, zakładając, że przedstawiony fragment kodu poprawnie się skompiluje i zostanie wykonany, to zmiennej liczba przypisana zostanie wartość:

int liczba = rand() % 1000;
A. równa 1000
B. pseudolosowa nie większa niż 999
C. rzeczywista podzielna przez 1000
D. dowolna pseudolosowa z przedziału typu int
Linia kodu int liczba = rand() % 1000; w języku C++ używa funkcji rand() do generowania liczby pseudolosowej. Funkcja ta zwraca liczbę całkowitą z zakresu od 0 do RAND_MAX zdefiniowanego w standardowej bibliotece C++. Obliczenie rand() % 1000 wykonuje operację modulo na wygenerowanej liczbie, co oznacza, że wynik zawsze będzie liczbą z zakresu od 0 do 999. Jest to powszechna technika używana do ograniczenia zakresu wartości zwracanych przez funkcję rand() do konkretnego przedziału. Takie podejście jest często wykorzystywane do generowania pseudolosowych wartości całkowitych w określonym zakresie, co jest przydatne w wielu zastosowaniach, od prostych programów testowych po bardziej złożone aplikacje symulacyjne. Należy pamiętać, że funkcja rand() generuje liczby pseudolosowe, co oznacza, że sekwencja liczb będzie się powtarzać przy każdym uruchomieniu programu, chyba że zostanie zainicjowana za pomocą funkcji srand() z unikalnym ziarnem. Jest to zgodne z dobrymi praktykami, aby zapewnić różnorodność w generowanych liczbach pseudolosowych, zwłaszcza w kontekście testowania i symulacji komputerowych.

Pytanie 25

Z analizy złożoności obliczeniowej algorytmów sortowania dla dużych zbiorów danych (powyżej 100 elementów) wynika, że najefektywniejszą metodą jest algorytm sortowania:

sortowanie bąbelkoweO(n²)
sortowanie przez wstawianieO(n²)
sortowanie przez scalanieO(n log n)
sortowanie przez zliczanieO(n)
sortowanie kubełkoweO(n²)
A. przez zliczanie
B. przez scalanie
C. kubełkowego
D. bąbelkowego
Sortowanie bąbelkowe jest jednym z najwolniejszych algorytmów i rzadko jest używane w praktyce ze względu na złożoność O(n^2). Sortowanie kubełkowe może być szybkie, ale jego efektywność zależy od równomiernego rozkładu danych. Sortowanie przez scalanie jest bardziej uniwersalne, ale ma większą złożoność obliczeniową niż Counting Sort i może być mniej efektywne dla dużych zbiorów danych o ograniczonym zakresie.

Pytanie 26

Do czego służy operator spread (...) w JavaScript?

A. Do rozwinięcia tablicy lub obiektu na poszczególne elementy
B. Do łączenia dwóch różnych typów danych
C. Do sprawdzania typu danych
D. Do konwersji liczby na string
Operator spread (...) w JavaScript ma swoje zastosowanie tylko w kontekście rozwoju tablic i obiektów, ale nie jest narzędziem do łączenia różnych typów danych. W rzeczywistości, operator ten nie ma zdolności do łączenia elementów różnych typów, jak na przykład liczby i stringi w jedną strukturę. Takie działania wymagają innych technik, jak konwersja typów lub użycie konkretnego struktura danych, co wprowadza zamieszanie w myśleniu o tym, co operator spread faktycznie robi. Nie ma też zastosowania w kontekście sprawdzania typu danych, co można by pomyśleć, gdyż nie zajmuje się on analizowaniem, czy coś jest liczbą, stringiem czy innym typem. Zamiast tego, operator spread po prostu rozwija tablice lub obiekty. Co więcej, jest nieprecyzyjne twierdzić, że operator ten konwertuje liczby na strings, ponieważ nie ma takiej funkcji. Takie przemyślenie może prowadzić do błędów w kodzie, gdzie programista może oczekiwać, że operator spread będzie działał w sposób, w jaki nie został zaprojektowany. Dlatego ważne jest, aby rozumieć jego prawidłowe zastosowanie, aby unikać nieporozumień i błędów w kodzie.

Pytanie 27

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

A. Nieaktualne oprogramowanie
B. Hasło ustawione na urządzeniu
C. Szyfrowanie danych na urządzeniu
D. Zainstalowanie aplikacji rozrywkowych
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 28

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

A. zadeklarować zmienną sprawdz przed jej wykorzystaniem w linii 11
B. poprawnie zapisać warunek w instrukcji if w linii 11, np. sprawdz(x)==true
C. naprawić błąd w funkcji sprawdz, który polega na braku nawiasów {} w pętli for
D. dodać deklarację funkcji sprawdz przed funkcją main
Wielu początkujących programistów skupia się na szczegółach składniowych lub drobiazgach logicznych, kiedy pojawia się błąd kompilacji w C++. Jednak często przyczyną jest coś bardzo podstawowego, jak brak deklaracji funkcji przed jej użyciem. Jeśli chodzi o zapis warunku w instrukcji 'if', to kompilator nie zgłasza błędu, gdy używamy wyrażenia typu 'if (sprawdz(x))' – to całkowicie poprawna składnia, a dopisywanie '==true' jest redundantne i nie wnosi niczego nowego. Bardzo często widzę, że ktoś skupia się na tym, żeby warunek koniecznie porównywać do true, ale tak naprawdę to kwestia stylu, nie poprawności. Pozostawienie nawiasów klamrowych w pętli for jest oczywiście dobrą praktyką, ale ich brak nie zawsze generuje błąd kompilacji, jeśli pętla ma tylko jedną instrukcję. Kompilator C++ potrafi to rozpoznać i nie zgłasza błędu – sprowadza się to bardziej do czytelności i unikania błędów logicznych niż do samej poprawności kompilacji. Odpowiedź dotycząca deklarowania zmiennej 'sprawdz' to już nieporozumienie – 'sprawdz' to funkcja, a nie zmienna, więc nie deklarujemy jej w ten sposób. Ten błąd pokazuje, jak łatwo pomylić pojęcia w językach programowania, zwłaszcza jeśli dopiero zaczynamy przygodę z kodowaniem. Główna zasada, którą warto tu zapamiętać, to: każda funkcja używana przed jej zdefiniowaniem musi być zadeklarowana – to właśnie tego brakuje w typowym przykładzie z pytania. Bez deklaracji kompilator nie wie, jaką sygnaturę ma funkcja, a to skutkuje błędem już na poziomie kompilacji. Z mojego doświadczenia wynika, że takie drobne rzeczy potrafią skutecznie utrudnić życie, dlatego warto czytać komunikaty kompilatora i znać podstawowe zasady działania języka C++.

Pytanie 29

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

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

Pytanie 30

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

A. Program kontynuuje działanie, pomijając błąd
B. Instrukcja throw zostanie automatycznie wykreślona
C. Program zakończy działanie z błędem
D. Błąd zostanie zignorowany przez kompilator
Program nie może kontynuować działania po wystąpieniu wyjątku bez jego obsługi – to mogłoby prowadzić do nieprzewidywalnych błędów. Wyjątek nie jest ignorowany przez kompilator – jeśli wyjątek wystąpi w czasie wykonywania programu, kompilator nie ma na to wpływu. 'Throw' nie jest automatycznie usuwane – to instrukcja zgłaszająca wyjątek, a jej wykonanie jest zależne od warunków w kodzie. Brak obsługi wyjątku prowadzi do natychmiastowego przerwania programu, a nie do pominięcia instrukcji.

Pytanie 31

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

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

Pytanie 32

Który z podanych algorytmów można zrealizować zarówno w sposób iteracyjny, jak i rekurencyjny?

A. Algorytm sortowania bąbelkowego
B. Algorytm generowania liczb losowych
C. Algorytm wyszukiwania binarnego
D. Algorytm mapowania kluczy w tablicach asocjacyjnych
Sortowanie bąbelkowe to algorytm iteracyjny i nie ma naturalnej wersji rekurencyjnej, ponieważ jego działanie opiera się na powtarzających się pętlach. Algorytm mapowania kluczy w tablicach asocjacyjnych nie korzysta z rekurencji – jest to proces przypisywania wartości do odpowiednich kluczy, który realizowany jest w sposób iteracyjny. Algorytm generowania liczb losowych nie wymaga rekurencji ani iteracji – jest to operacja oparta na wywołaniu odpowiednich funkcji w zależności od użytej biblioteki i języka programowania.

Pytanie 33

Pętla przedstawiona w zadaniu działa na zmiennej typu string o nazwie ciag. Jej celem jest:

int i = 0;
while (ciag[i] != 0)  {
    if (ciag[i] > 96 && ciag[i] < 123)  {
        ciag[i] = (ciag[i] - 32);
    }
    i++;
}
A. Zamienić w ciągu wielkie litery na małe.
B. Od każdego znaku w ciągu, który nie jest równy 0, odjąć kod 32.
C. Zamienić w ciągu małe litery na wielkie.
D. Od każdego znaku w ciągu odjąć kod 32.
Odejmowanie 32 od wszystkich znaków w napisie to trochę kiepski pomysł, bo to nie zawsze działa. Nie wszystkie znaki, takie jak cyfry czy symbole, mają swoje wielkie odpowiedniki, więc ich kod ASCII nie powinien być zmieniany. Kabel od wielkich liter na małe to zupełnie inna bajka – tutaj dodajemy 32 do kodu. Odejmowanie kodu tylko dla znaków różniących się od 0 pomija istotę operacji na literach, co może skutkować dziwnymi rezultatami. Z mojego doświadczenia wynika, że lepiej to przemyśleć przed wprowadzeniem w życie.

Pytanie 34

Który z wymienionych aktów prawnych odnosi się do ochrony danych osobowych w krajach Unii Europejskiej?

A. GDPR (RODO)
B. Open Source Initiative
C. DMCA
D. Creative Commons
GDPR (RODO) to akt prawny dotyczący ochrony danych osobowych w Unii Europejskiej. Wprowadza on jednolite zasady przetwarzania danych, zwiększając ochronę prywatności obywateli. RODO daje użytkownikom prawo do dostępu do swoich danych, ich poprawiania, a także żądania ich usunięcia (prawo do bycia zapomnianym). Firmy muszą transparentnie informować o celach przetwarzania danych oraz zapewniać odpowiedni poziom zabezpieczeń. Niezastosowanie się do przepisów RODO skutkuje wysokimi karami finansowymi.

Pytanie 35

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

A. środowisko XCode
B. platformę React Native
C. środowisko Android Studio
D. platformę Xamarin
XCode to zintegrowane środowisko programistyczne stworzone przez Apple, które służy głównie do tworzenia aplikacji na platformy iOS oraz macOS. Jego użycie ogranicza się do systemów operacyjnych Apple, co wyklucza możliwość tworzenia aplikacji cross-platform. W kontekście programowania w C#, XCode nie oferuje wsparcia ani funkcji, które umożliwiałyby rozwój aplikacji mobilnych na różne platformy. React Native jest frameworkiem stworzonym przez Facebook, który umożliwia tworzenie aplikacji mobilnych w JavaScript, a nie w C#. Choć React Native wspiera wiele platform, to jednak nie jest to technologia zgodna z C#, co czyni ją nieodpowiednią dla deweloperów preferujących ten język. Android Studio to z kolei oficjalne IDE dla systemu Android, oparte na Javie oraz Kotlinie, co również eliminuje możliwość wykorzystania C#. Tak więc, ani XCode, ani React Native, ani Android Studio nie są odpowiednie do tworzenia aplikacji mobilnych w języku C#, co czyni je niepoprawnymi odpowiedziami w kontekście tego pytania.

Pytanie 36

Co to jest Docker?

A. Framework do tworzenia aplikacji mobilnych
B. Narzędzie do testowania wydajności aplikacji webowych
C. Platforma do tworzenia, wdrażania i uruchamiania aplikacji w kontenerach
D. System zarządzania bazami danych NoSQL
Docker jest platformą do tworzenia, wdrażania i uruchamiania aplikacji w kontenerach, co oznacza, że umożliwia programistom izolowanie aplikacji oraz ich zależności w samodzielne jednostki, niezależne od środowiska, w którym są uruchamiane. Dzięki konteneryzacji, aplikacje działają zgodnie w różnych środowiskach, co znacząco upraszcza procesy związane z wdrażaniem i zarządzaniem. Przykładowo, z wykorzystaniem Dockera, programiści mogą stworzyć kontener z aplikacją webową, a następnie wdrożyć go na serwerze produkcyjnym, nie obawiając się, że aplikacja nie zadziała z powodu różnic w konfiguracjach systemu operacyjnego. Ponadto, Docker wspiera DevOps, co jest zgodne z obecnymi trendami w inżynierii oprogramowania, promując podejście Continuous Integration/Continuous Deployment (CI/CD). Używanie Dockera zwiększa efektywność pracy zespołów deweloperskich oraz ułatwia zarządzanie infrastrukturą, co jest istotne w kontekście dużych projektów. Dodatkowo, wspiera on standardy branżowe, takie jak microservices, które ze względu na swoje zalety są szeroko stosowane w nowoczesnych architekturach aplikacyjnych.

Pytanie 37

Zaprezentowany wykres ilustruje wyniki przeprowadzonych testów

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

Pytanie 38

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. Autonomia zespołów rozwijających poszczególne usługi
D. Wspólna baza danych dla wszystkich usług
Architektura mikroserwisów opiera się na praktykach, które umożliwiają wzrost skalowalności, elastyczności oraz odporności systemu. Wspólna baza danych dla wszystkich usług, będąca jedną z zaproponowanych odpowiedzi, jest sprzeczna z tymi fundamentalnymi zasadami. Utrzymywanie centralnej bazy danych prowadzi do sytuacji, gdzie zmiany w jednym mikroserwisie mogą mieć niepożądane konsekwencje dla innych, co z kolei zmniejsza niezależność każdej usługi. W mikroserwisach kluczowe jest, aby każda usługa miała swoje własne źródło danych, co pozwala na decoupling, czyli luźne powiązanie między komponentami. Ponadto, w architekturze mikroserwisów, każda usługa powinna być w stanie działać i być wdrażana niezależnie, co jest niemożliwe w przypadku korzystania z jednej bazy danych, ponieważ wszelkie zmiany wymagałyby zsynchronizowanego podejścia. Kolejnym aspektem jest odporność na awarie, która również ulega osłabieniu w przypadku wspólnej bazy danych. Jeśli baza danych ulegnie awarii, wszystkie usługi korzystające z niej są jednocześnie dotknięte problemem, co jest sprzeczne z koncepcją mikroserwisów, gdzie pojedyncze komponenty powinny być zdolne do działania niezależnie. Wreszcie, autonomia zespołów jest również podważana przez wspólną bazę danych, ponieważ zespoły nie mogą pracować równolegle nad swoimi usługami, a zmiany są wymuszone przez współzależności. Dlatego stosowanie wspólnej bazy danych jest jednym z najczęstszych błędów, który może prowadzić do problemów w projektowaniu i zarządzaniu architekturą mikroserwisów.

Pytanie 39

Który z wymienionych dokumentów jest najczęściej stosowany w zarządzaniu pracą zespołu Scrum?

A. Product backlog
B. Lista zasobów ludzkich
C. Diagram Gantta
D. Specyfikacja techniczna
Diagram Gantta jest fajnym narzędziem do pokazywania harmonogramu, ale nie ma go w zarządzaniu backlogiem. Specyfikacja techniczna to co innego – tam są szczegóły implementacyjne, a nie priorytety funkcji. Lista zasobów ludzkich to temat o zarządzaniu personelem, a nie o zadaniach i priorytetach w Scrumie. Więc tu bardziej musisz uważać na to, co do czego pasuje.

Pytanie 40

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

A. Do przechowywania informacji w bazie danych
B. Do zapisywania danych użytkownika w przeglądarce
C. Do zapisywania danych użytkownika na serwerze
D. Do generowania dynamicznych interfejsów dla użytkowników
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.