Wyniki egzaminu

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

Egzamin zdany!

Wynik: 22/40 punktów (55,0%)

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

Metoda przeszukiwania w uporządkowanych tablicach, która polega na podzieleniu tablicy na kilka części i wykonywaniu wyszukiwania liniowego tylko w tej części, gdzie może znajdować się poszukiwany element, w języku angielskim jest określana jako

A. Binary search
B. Exponential search
C. Jump search
D. Ternary search
Jump search to faktycznie ta metoda, która polega na przeszukiwaniu uporządkowanej tablicy przez podział jej na bloki o określonej długości (zazwyczaj o rozmiarze pierwiastka kwadratowego z n, gdzie n to liczba elementów w tablicy). Najpierw skaczemy po tych blokach, żeby szybko ograniczyć obszar poszukiwań, a potem wykonujemy liniowe przeszukiwanie już tylko w wybranym przedziale. To sprawia, że jump search jest czymś pomiędzy wyszukiwaniem liniowym a binarnym – daje przyzwoity kompromis między prostotą a wydajnością, szczególnie gdy dostęp do pamięci jest kosztowny albo tablica jest zbyt duża, by od razu dzielić ją na pół jak w binary search. W praktyce jump search czasem się wykorzystuje tam, gdzie dane są przechowywane na przykład na dyskach magnetycznych czy SSD, a koszt losowego odczytu jest znacznie wyższy od odczytu sekwencyjnego. To jest też niezła opcja, gdy masz narzucone ograniczenia na algorytmy lub nie możesz sobie pozwolić na pełne binarne wyszukiwanie z różnych powodów technicznych. Warto też zauważyć, że jump search dobrze ilustruje ogólną ideę ograniczania przestrzeni poszukiwań bez konieczności przechodzenia przez wszystkie elementy – czyli bardzo praktyczne podejście, które daje się rozwinąć w innych algorytmach. Szczerze? Moim zdaniem, każdy, kto myśli o optymalizacji prostych operacji na dużych zbiorach danych, powinien przynajmniej raz przetestować jump search na własnych danych – efekty bywają zaskakująco dobre, zwłaszcza przy większych strukturach.

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: utworzyć katalogi hdpi, lhpi, xhpi i dodać do nich grafiki. Android: utworzyć katalogi 32x32, 64x64, 96x96 i dodać do nich grafiki
B. iOS: dodać do nazw sufiksy #2x, #3x. Android: dodać do nazw sufiks rozdzielczości: -32x32, -64x64, -96x96
C. iOS: dodać do nazw plików sufiksy @2x, @3x. Android: umieścić grafikę w odpowiednich folderach drawable: -hdpi, -xhpi, xxhdpi
D. iOS: dodać do nazw sufiksy oznaczające rozdzielczość, np. 32ppi. Android: umieścić grafikę w odpowiednich katalogach: 32ppi, 64ppi, 96ppi
Lepiej nie używać oznaczeń w stylu 32ppi czy 64ppi, bo to nie pasuje do żadnej z tych platform. To bardziej pasuje do druku, a nie aplikacji mobilnych. Foldery 32x32 czy 64x64 też nie mają sensu w kontekście Androida czy iOS. Jak stworzysz foldery o nazwach lhpi czy 32x32 to może być problem z wyświetlaniem grafiki na różnych urządzeniach. Z mojego doświadczenia, lepiej trzymać się ustalonych standardów, żeby uniknąć błędów.

Pytanie 3

Wskaż uproszczoną wersję kodu XAML dla elementów w pokazanym oknie dialogowym?

Ilustracja do pytania
A. Kod 3
B. Kod 4
C. Kod 1
D. Kod 2
Dobrze jest znać podstawowe różnice pomiędzy ListBox, ComboBox, CheckBox, RadioButton oraz Label w XAML. W tym oknie dialogowym widać wyraźnie, że po lewej stronie użytkownik ma możliwość wyboru gatunku zwierzęcia spośród kilku opcji wyświetlonych jednocześnie. Takie zadanie najlepiej spełnia ListBox, bo umożliwia wygodną selekcję z widocznej listy. U góry po prawej jest pole tekstowe do wpisania imienia zwierzaka, więc TextBox jak najbardziej pasuje. Poniżej mamy dwa pola wyboru – „Zaszczepiony?” i „Na diecie?” – to są typowe przypadki na CheckBoxy: można zaznaczyć dowolne lub oba naraz. Kluczowe jest to, że CheckBox pozwala użytkownikowi wybrać dowolną kombinację, a nie tylko jedną opcję jak RadioButton. Z mojego doświadczenia często początkujący mylą ComboBox z ListBoxem, ale tu akurat lista jest zawsze widoczna, co jest typowe dla ListBoxa. Stosowanie CheckBoxów dla takich dwustanowych opcji też jest zgodne z dobrymi praktykami UX i standardami opisu formularzy w XAML. W pracy zawodowej często się to wykorzystuje, bo kod jest czytelny i łatwo go rozszerzać. Właśnie taki zestaw – ListBox, TextBox, CheckBox – jest najbardziej przejrzysty i zgodny z zamysłem projektanta interfejsów. Fajnie jest to zapamiętać, bo ta kombinacja pojawia się w wielu firmowych projektach.

Pytanie 4

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

A. Single Responsibility Principle (Zasada pojedynczej odpowiedzialności)
B. Open/Closed Principle (Zasada otwarte/zamknięte)
C. Dependency Inversion Principle (Zasada odwrócenia zależności)
D. Code Reuse Principle (Zasada ponownego użycia kodu)
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 5

Jakie jest przeznaczenie polecenia "git merge"?

A. Do usuwania zmian w repozytorium
B. Do pobierania aktualizacji zdalnego repozytorium
C. Do łączenia zmian z różnych gałęzi
D. Do zakładania nowego repozytorium
Polecenie "git merge" służy w Git do łączenia zmian z różnych gałęzi. Kiedy pracujemy w zespole i każdy programista rozwija swój fragment kodu na osobnej gałęzi, w pewnym momencie trzeba te zmiany zebrać do kupy, żeby powstała jedna, wspólna wersja projektu. Tu właśnie pojawia się "merge" – pozwala w prosty sposób dołączyć zmiany z jednej gałęzi do drugiej, najczęściej z feature branch do develop albo main. Praktycznie rzecz biorąc, to polecenie sprawdza się zawsze wtedy, gdy chcemy zintegrować efekty pracy kilku osób lub wersje rozwojowe z główną linią kodu. Moim zdaniem, korzystanie z "git merge" to w zasadzie codzienność w projektach zespołowych, bo prawie nikt już nie pracuje tylko na jednej gałęzi. Warto też pamiętać, że merge może czasem prowadzić do konfliktów, jeśli te same fragmenty plików były zmieniane równolegle – wtedy trzeba ręcznie rozwiązać te rozbieżności. W praktyce, dobrą praktyką jest regularne mergowanie, żeby uniknąć lawiny konfliktów na koniec sprintu. Dla mnie "merge" to narzędzie absolutnie kluczowe, bez którego ciężko sobie wyobrazić sensowną pracę z Gitem. No i jeszcze – to nie to samo co "rebase", chociaż oba służą do integracji zmian, ale w różny sposób. Merge zostawia historię połączeń, co ułatwia śledzenie zmian w większych projektach.

Pytanie 6

Która z poniższych metod nie należy do cyklu życia komponentu w React.js?

A. componentDidUpdate()
B. componentDidMount()
C. componentWillUnmount()
D. componentWillPublish()
Metoda componentWillPublish() nie jest częścią cyklu życia komponentu w React.js, co czyni ją poprawną odpowiedzią na to pytanie. W React.js istnieje szereg zdefiniowanych metod cyklu życia, które umożliwiają programistom zarządzanie stanem komponentów w określonych momentach ich istnienia. Do najbardziej istotnych z nich należą: componentDidMount(), componentDidUpdate() oraz componentWillUnmount(). Metoda componentDidMount() jest wywoływana po zamontowaniu komponentu w DOM, co pozwala na inicjalizację danych, takich jak pobieranie danych z API. Z kolei componentDidUpdate() jest wywoływana, gdy komponent zostaje zaktualizowany, co jest doskonałym momentem na reagowanie na zmiany w stanie lub propach. Metoda componentWillUnmount() jest wywoływana tuż przed odmontowaniem komponentu, co jest przydatne do czyszczenia zasobów, takich jak anulowanie subskrypcji lub usuwanie nasłuchiwaczy. Zrozumienie tych metod jest kluczowe dla efektywnego zarządzania cyklem życia komponentów w aplikacjach React, co prowadzi do lepszej wydajności i utrzymania kodu.

Pytanie 7

Podaj przykład incydentu w miejscu pracy?

A. kontuzja stawu skokowego, która zdarzyła się w trakcie bezpośredniej drogi do miejsca zatrudnienia
B. złamanie nogi w trakcie urlopu wypoczynkowego przyznanego przez pracodawcę
C. złe samopoczucie spowodowane przewlekłą chorobą zatrudnionego, które wystąpiło w biurze
D. oparzenie dłoni, które miało miejsce podczas nieobowiązkowego szkolenia w czasie prywatnym pracownika
To właśnie sytuacja, gdy ktoś doznał kontuzji stawu skokowego podczas bezpośredniej drogi do pracy, jest klasycznym przykładem incydentu związanego z pracą, a konkretnie tzw. wypadku w drodze do pracy. Zgodnie z przepisami BHP oraz praktyką ubezpieczeniową, za incydent w miejscu pracy uznaje się nie tylko zdarzenia mające miejsce na terenie zakładu, ale także te występujące w drodze do lub z pracy – oczywiście pod warunkiem, że droga była bezpośrednia i nieprzerwana, bez załatwiania spraw prywatnych po drodze. Moim zdaniem ta kwestia jest często niedoceniana przez pracowników – wielu z nas zapomina, że wypadek w drodze do pracy daje podobne uprawnienia jak wypadek w zakładzie pracy, oczywiście po spełnieniu określonych wymogów formalnych, np. zgłoszenie incydentu pracodawcy, udokumentowanie miejsca i czasu zdarzenia. W praktyce wielu pracodawców i pracowników nie do końca rozumie, jakie sytuacje faktycznie podlegają pod te przepisy. Na przykład, jeśli ktoś skręcił nogę idąc prosto z domu do pracy i nie zatrzymywał się po drodze, to ten incydent kwalifikuje się jako wypadek w drodze do pracy. Warto znać te zasady, żeby nie przegapić swoich praw. Branżowe standardy, takie jak wytyczne PIP i ubezpieczycieli, jasno wskazują na obowiązek rejestrowania i analizowania takich zdarzeń, bo z punktu widzenia bezpieczeństwa pracy każde takie zdarzenie jest sygnałem do poprawy szeroko rozumianych warunków pracy, nawet jeśli zdarzy się poza samym biurem czy halą.

Pytanie 8

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

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

Pytanie 9

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

int a = 0x73;
cout << a;
A. 108
B. 73
C. 115
D. 0
Wiele osób myli się, gdy widzi zapis 0x73, uznając, że to po prostu liczba 73 w dziesiętnym, bo tak wygląda najprościej. Jednak w rzeczywistości ten prefiks „0x” informuje kompilator, że mamy do czynienia z liczbą zapisaną w systemie szesnastkowym (heksadecymalnym), a nie dziesiętnym. To jest taki bardzo charakterystyczny zapis w językach programowania (C, C++, Java, czasem nawet Python), który pozwala programiście jasno określić, w jakim systemie podaje liczbę. Zakładając, że ktoś wybierze 108 lub 73, można podejrzewać, że ta osoba nie przeliczyła heksadecymalnej liczby na dziesiętną lub po prostu nie zwróciła uwagi na prefiks. 0x73 to w rzeczywistości (7 * 16) + 3, czyli 112 + 3, co daje 115. Niektórym może się też wydawać, że heksadecymalne 0x73 to 73 dziesiętnie, ale to typowy błąd początkujących. Wybór zera z kolei może wynikać z nieporozumienia – być może ktoś pomyślał, że a nie zostało zainicjalizowane lub kod nie wypisuje nic, ale tutaj jawnie inicjujemy a wartością heksadecymalną. Praktyka pokazuje, że podobne nieporozumienia pojawiają się na początku nauki programowania, szczególnie gdy nie ma jeszcze „wyczucia” systemów liczbowych. Tak naprawdę, jeśli chcemy być profesjonalni, trzeba od razu nauczyć się, że każda liczba z 0x na początku jest heksadecymalna, a cout zawsze wypisze jej dziesiętną reprezentację, o ile nie zmienimy flagi strumienia (std::hex itd.). To takie podstawy, które potem pozwalają pewniej obracać się w kodzie, gdzie często występują maski bitowe czy operacje na rejestrach. Moim zdaniem, wielu początkujących inżynierów właśnie przez nieuwagę na takie detale traci sporo czasu na debugowanie prostych błędów. Warto więc na przyszłość za każdym razem zatrzymać się na chwilę i zastanowić, czy na pewno dobrze rozpoznajemy system liczbowy wykorzystywany w danym fragmencie kodu.

Pytanie 10

Która z poniższych deklaracji w języku C++ poprawnie opisuje tablicę dwuwymiarową?

A. int matrix[3][3][3];
B. int matrix[];
C. int matrix[3];
D. int matrix[3][3];
Deklaracja 'int matrix[3][3];' poprawnie definiuje tablicę dwuwymiarową w języku C++. Tablice dwuwymiarowe to kluczowe narzędzie do przechowywania macierzy i danych tabelarycznych. Każdy element macierzy jest dostępny poprzez dwa indeksy, co umożliwia łatwe odwzorowanie układów współrzędnych lub plansz w grach. Tablice tego rodzaju są wykorzystywane w algorytmach obliczeniowych, grafice komputerowej oraz analizie danych. Struktura 'matrix[3][3]' tworzy siatkę 3x3, która może przechowywać 9 elementów, co czyni ją efektywnym rozwiązaniem dla problemów wymagających przestrzennych danych.

Pytanie 11

Jakie są główne różnice między środowiskiem RAD (Rapid Application Development) a klasycznymi IDE?

A. RAD pozwala na szybkie tworzenie prototypów i rozwijanie aplikacji przy minimalnej ilości kodu
B. RAD nie oferuje żadnych narzędzi do debugowania
C. RAD koncentruje się tylko na testowaniu programów
D. RAD funkcjonuje tylko w systemach operacyjnych Linux
RAD (Rapid Application Development) to metodologia tworzenia oprogramowania, która kładzie nacisk na szybkie prototypowanie i iteracyjne podejście do rozwoju aplikacji, minimalizując czas poświęcany na pisanie kodu od podstaw. Kluczowym aspektem RAD jest możliwość szybkiego dostosowywania aplikacji do zmieniających się wymagań biznesowych oraz ciągła interakcja z klientem. Narzędzia RAD, takie jak Visual Studio, Delphi czy OutSystems, pozwalają na budowanie aplikacji przy użyciu graficznych interfejsów, gotowych komponentów i automatycznego generowania kodu, co znacząco skraca czas wprowadzenia produktu na rynek. RAD doskonale sprawdza się w przypadku projektów o krótkim cyklu życia i wymagających szybkich zmian.

Pytanie 12

Które zdarzenie w JavaScript jest wywoływane po całkowitym załadowaniu strony?

A. window.onload
B. page.complete
C. window.render
D. document.ready
Wszystkie inne odpowiedzi, takie jak "document.ready", "page.complete" oraz "window.render", są niepoprawne w kontekście pytania o zdarzenie wywoływane po całkowitym załadowaniu strony. Odpowiedź "document.ready" odnosi się do jQuery, a nie do czystego JavaScript. To zdarzenie wywoływane jest, gdy DOM jest załadowany, ale niekoniecznie wszystkie zasoby, takie jak obrazy czy arkusze stylów, są już dostępne. Używanie tego zdarzenia może prowadzić do nieporozumień, gdyż programiści mogą zakładać, że strona jest gotowa do pełnej interakcji, gdy w rzeczywistości zachowanie różnych elementów może się różnić w zależności od ładowania zasobów. Z kolei "page.complete" nie jest standardowym zdarzeniem w JavaScript i nie istnieje w dokumentacji, co czyni tę odpowiedź całkowicie błędną. "window.render" również nie jest znanym zdarzeniem w kontekście JavaScript, co może prowadzić do nieporozumień wśród programistów. Używanie niepoprawnych terminów lub zrozumienie ich znaczenia może prowadzić do błędów w kodzie, które z kolei skutkują nieprawidłowym działaniem aplikacji. Dlatego tak ważne jest, aby znać dokładne zdarzenia i ich zastosowanie w kontekście pełnego ładowania strony, co ma kluczowe znaczenie w tworzeniu responsywnych i dobrze działających aplikacji internetowych.

Pytanie 13

Jaki modyfikator dostępu umożliwia dostęp do pól klasy tylko za pomocą jej metod?

A. Static
B. Private
C. Public
D. Protected
Modyfikator `public` umożliwia dostęp do pól i metod z dowolnego miejsca w programie, co narusza zasadę hermetyzacji i ukrywania danych wewnętrznych obiektu. `protected` pozwala na dostęp do pól i metod klasy w ramach dziedziczenia, ale nie ogranicza dostępu wyłącznie do metod tej samej klasy. `static` to modyfikator, który oznacza, że pole lub metoda należy do klasy, a nie do instancji obiektu, co nie jest związane z ograniczaniem dostępu. Tylko `private` zapewnia pełną kontrolę nad dostępem do danych wewnątrz klasy.

Pytanie 14

W zestawieniu przedstawiono doświadczenie zawodowe członków zespołu IT. Osobą odpowiedzialną za stworzenie aplikacji front-end powinna być:

PracownikZnajomość technologii/programów
AnnaInscape, Corel Draw
KrzysztofAngular
PatrykHTML, CSS
EwaDjango, .NET
A. Ewa
B. Patryk
C. Anna
D. Krzysztof
Przy analizie kompetencji członków zespołu warto skupić się na tym, czego tak naprawdę wymaga stworzenie profesjonalnej aplikacji front-end. Wiele osób intuicyjnie wskazuje osoby znające HTML i CSS jako odpowiednie, bo to przecież podstawowe technologie webowe. Jednak w dzisiejszych realiach branżowych to już zdecydowanie za mało. Standardy tworzenia aplikacji front-end przeszły ogromną ewolucję – od prostych stron opartych na HTML po złożone aplikacje korzystające z frameworków takich jak Angular, React czy Vue. Patryk zna HTML i CSS, więc poradziłby sobie z prostą, statyczną stroną, lecz do zbudowania czegoś większego wymagane są narzędzia pozwalające na zarządzanie logiką aplikacji, routowaniem, komponentami czy stanem. Anna zna Inscape i Corel Draw, czyli programy graficzne służące głównie do projektowania grafiki wektorowej, co jest przydatne w projektowaniu interfejsu, ale nie wystarcza do wdrożenia front-endu. Ewa natomiast zna Django i .NET, czyli technologie typowo back-endowe, służące do tworzenia logiki aplikacji po stronie serwera. To klasyczny błąd myślowy – utożsamianie tworzenia aplikacji z samym kodowaniem, bez rozróżnienia na specjalizacje. W praktyce od front-end developera wymaga się znajomości frameworków, które pozwalają efektywnie wdrożyć nowoczesne, interaktywne rozwiązania – a tego gwarantem jest Angular. Często spotykam się z mylnym przekonaniem, że osoba, która potrafi zaprojektować grafikę lub zna narzędzia backendowe, równie dobrze poradzi sobie z nowoczesnym front-endem. Niestety, takie podejście prowadzi do nieczytelnego kodu, problemów z rozwojem projektu oraz ogranicza możliwości aplikacji. W profesjonalnym środowisku IT zawsze dzieli się role zgodnie z kompetencjami i aktualnymi wymaganiami technologicznymi rynku. Dlatego wybór osoby ze znajomością Angulara jest tu najbardziej uzasadniony.

Pytanie 15

Jakie informacje można uzyskać na temat metod w klasie Point?

public class Point {
    public void Move(int x, int y) {...}
    public void Move(int x, int y, int z) {...}
    public void Move(Point newPt) {...}
}
A. Są przeciążone.
B. Służą jako konstruktory w zależności od liczby argumentów.
C. Zawierają przeciążenie operatora.
D. Zawierają błąd, ponieważ nazwy metod powinny być różne.
Metody przeciążone mogą mieć tę samą nazwę – różnią się sygnaturą, czyli liczbą i typami argumentów, co jest zgodne z zasadami programowania obiektowego. Przeciążenie metod to nie to samo co przeciążenie operatorów, które polega na definiowaniu nowego sposobu działania operatorów (np. +, -, *). Pełnienie funkcji konstruktorów to inny mechanizm i dotyczy głównie klas i ich instancjonowania, nie przeciążania metod.

Pytanie 16

Jaką złożoność obliczeniową posiada podany algorytm?
Dane:
Tablica: tab[n]
Index: i = 0, 1, ..., n-1
x: szukana

Algorytm:

// K1: i0
// K2: dopóki i < (n - 1)
    // K3: jeżeli tab[i] = x to wypisz i
    // K4: ii + 1
    // K5: idź do K2
// K6: zakończ
A. O(n log n)
B. O(1)
C. O(n2)
D. O(n)
W kontekście złożoności obliczeniowej łatwo wpaść w pułapkę myślenia, że algorytm wydaje się bardziej złożony, niż jest w rzeczywistości. Przykładowo, wybór O(n log n) sugeruje obecność jakiegoś sortowania lub podziału danych, co zupełnie nie występuje w tym rozwiązaniu – tu nie ma rekurencji, dzielenia na podtablice ani żadnych bardziej skomplikowanych operacji. Złożoność O(n^2) typowa jest dla algorytmów, gdzie mamy zagnieżdżone pętle, czyli każda iteracja głównej pętli wyzwala kolejną pełną pętlę po danych – a tutaj pętla jest tylko jedna i przechodzi przez tablicę jeden raz. Bardzo często myli się to z sortowaniem bąbelkowym czy selekcyjnym, gdzie rzeczywiście występuje kwadratowa złożoność, ale nie w prostym przeszukiwaniu liniowym. Z kolei O(1), czyli czas stały, dotyczy tylko takich algorytmów, gdzie liczba operacji nie zależy od wielkości wejścia – na przykład odczytanie elementu z tablicy po znanym indeksie. Tu jednak liczba kroków wzrasta liniowo wraz z n, czyli liczbą elementów, więc niestety nie jest to czas stały. Moim zdaniem, wiele osób błędnie utożsamia prostotę kodu z czasem stałym, ale w rzeczywistości chodzi o to, jak algorytm zachowuje się, gdy ilość danych znacząco rośnie. W tej sytuacji odpowiednia analiza pętli i sposobu przetwarzania danych pozwala szybko zauważyć, że algorytm ten to klasyczne O(n), zgodne z najprostszymi wzorcami algorytmicznymi spotykanymi w praktyce.

Pytanie 17

Jedną z dolegliwości, która pojawia się u programistów w wyniku długotrwałego korzystania z myszki komputerowej lub klawiatury, objawiającą się bólami, drętwieniem oraz zaburzeniami czucia w obszarze 1-3 palca dłoni jest

A. kifoza
B. zespól cieśni kanału nadgarstka
C. Dyskopatia
D. zespół suchego oka
Zespół cieśni kanału nadgarstka to schorzenie, które powstaje w wyniku ucisku na nerw pośrodkowy w kanale nadgarstka. Jest to wąski tunel utworzony przez kości nadgarstka oraz więzadła, przez który przechodzą ścięgna oraz nerwy odpowiedzialne za czucie i ruch w dłoni. Objawy zespołu cieśni kanału nadgarstka obejmują bóle, drętwienie oraz zaburzenia czucia, szczególnie w obszarze pierwszych trzech palców ręki. Praca z myszą komputerową i klawiaturą przez długi czas, szczególnie w niewłaściwej ergonomicznej pozycji, może prowadzić do nadmiernego obciążenia i zapalenia tkanek otaczających nerw pośrodkowy. W praktyce, osoby cierpiące na to schorzenie często skarżą się na problemy z chwytaniem przedmiotów, a także na osłabienie siły uchwytu. W leczeniu zespołu cieśni kanału nadgarstka zaleca się m.in. unikanie czynników przyczynowych, stosowanie ortez, fizjoterapię oraz w niektórych przypadkach leczenie chirurgiczne. Należy również zwrócić uwagę na ergonomię stanowiska pracy, co może znacząco zredukować ryzyko wystąpienia tej dolegliwości. Zarządzanie czasem spędzanym przy komputerze oraz regularne przerwy są kluczowe w prewencji tego schorzenia.

Pytanie 18

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

A. Program kontynuuje działanie, pomijając błąd
B. Błąd zostanie zignorowany przez kompilator
C. Program zakończy działanie z błędem
D. Instrukcja throw zostanie automatycznie wykreślona
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 19

Które narzędzie służy do tworzenia makiet interfejsu użytkownika (UI mockups)?

A. Jenkins
B. Postman
C. Figma
D. Webpack
Figma to narzędzie służące do tworzenia makiet interfejsu użytkownika, które jest szczególnie cenione za swoje możliwości współpracy w czasie rzeczywistym. Dzięki Figma zespoły projektowe mogą jednocześnie edytować te same projekty, co znacząco przyspiesza proces twórczy i pozwala na bieżąco wprowadzać zmiany na podstawie uwag członków zespołu. Narzędzie oferuje bogaty zestaw funkcji, takich jak wektoryzacja, prototypowanie czy zintegrowana biblioteka komponentów, co sprawia, że projektanci mogą szybko i efektywnie tworzyć interfejsy, które są zarówno estetyczne, jak i funkcjonalne. Praktyczne zastosowanie Figma obejmuje współpracę z deweloperami przy tworzeniu responsywnych aplikacji oraz możliwość dostosowywania makiet do różnych rozmiarów ekranów. Standardy branżowe, takie jak użycie siatek i systemów modułowych, można łatwo zaimplementować w Figma, co dodatkowo zwiększa jego użyteczność. Dzięki temu narzędziu, zespoły mogą tworzyć nie tylko statyczne makiety, ale także interaktywne prototypy, co jest niezbędne w procesie testowania UX.

Pytanie 20

Jakie informacje zawiera dokumentacja realizacji projektu?

A. Podręcznik użytkownika dla końcowych odbiorców aplikacji
B. Zestawienie błędów wykrytych w trakcie testów
C. Dane dotyczące faz wdrożenia aplikacji w środowisku produkcyjnym
D. Strategia marketingowa aplikacji
Opis błędów znalezionych podczas testów jest częścią raportu testowego, a nie dokumentacji wdrożeniowej. Plan marketingowy aplikacji dotyczy promocji i wdrożenia na rynku, ale nie obejmuje aspektów technicznych związanych z implementacją. Instrukcja obsługi aplikacji dla użytkowników końcowych skupia się na interfejsie i funkcjonalności, ale nie zawiera informacji na temat procesu wdrażania aplikacji w środowisku produkcyjnym.

Pytanie 21

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

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

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

Pytanie 22

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

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

Pytanie 23

Który z wymienionych poniżej przykładów ilustruje prawidłowy szkielet zarządzania wyjątkami w języku C++?

A. try { kod } handle { obsługa }
B. try { kod } except { obsługa }
C. try { kod } finally { obsługa }
D. try { kod } catch { obsługa }
Niestety, skrypt 'try { kod } handle { obsługa }' nie zadziała w C++. Słowo 'handle' nie jest czymś, co znajdziesz w tym języku – używamy 'catch'. Poza tym, 'except' to termin z Pythona, nie C++. No i 'finally' też nie istnieje w C++, to też jest z języków jak Java czy Python, które mają to w inny sposób. Tak że jedynym poprawnym rozwiązaniem w C++ jest właśnie 'try' i 'catch'. Tylko to gwarantuje, że wszystko będzie działać jak należy.

Pytanie 24

Który z dokumentów stosowanych w metodologii Agile zawiera listę funkcjonalności produktu uporządkowanych według ich ważności?

A. Harmonogram projektu
B. Backlog sprintu
C. Product backlog
D. Diagram Gantta
Product backlog to dokument zawierający listę funkcjonalności produktu uporządkowanych według priorytetów. Jest to jedno z głównych narzędzi w metodykach Agile, szczególnie w Scrumie, gdzie backlog stanowi podstawę do planowania sprintów. Zawiera on wszystkie elementy, które muszą zostać zaimplementowane, w tym nowe funkcje, poprawki błędów oraz zadania techniczne. Priorytety są ustalane przez właściciela produktu (Product Ownera) i dostosowywane na bieżąco w zależności od zmieniających się wymagań i potrzeb biznesowych. Dzięki backlogowi zespół może skupić się na dostarczaniu najważniejszych funkcji, co pozwala na szybkie reagowanie na feedback i rozwój aplikacji zgodnie z oczekiwaniami klienta.

Pytanie 25

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

A. Programowanie funkcyjne
B. Programowanie proceduralne
C. Programowanie strukturalne
D. Programowanie obiektowe
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 26

Kod w bibliotece React.js oraz w frameworku Angular, który został zaprezentowany, ma na celu wyświetlenie

Fragment kodu React.js:
state = {    zm1: 0   };
hanleEv = () => {
    this.setState({zm1: this.state.zm1 + 1});
}
render() {
    return (<div>
        <span>{this.state.zm1}</span>
        <button onClick={this.handleEv}>BTN_1</button>
    </div>);
}
Fragment kodu Angular:
@Component({
    selector: 'sel1',
    template: `<span>{{ zm1 }}</span>
              <button (click)="onBtnCilcked()">BTN_1</button>`
})
export class Licznik1Component {
    zm1 = 0;
    onBtnCilcked() { this.zm1++; }
}
A. tylko napisu BTN_1
B. liczby kliknięć przycisku
C. wyłącznie przycisku oraz obsłużenie zdarzenia click, które ono generuje
D. wartości 0 po naciśnięciu przycisku
Ten kod, zarówno w React.js jak i w Angularze, jest klasycznym przykładem prostego licznika. To, co tu się dzieje, to tak naprawdę zliczanie kliknięć użytkownika w przycisk. Za każdym razem, gdy naciśniesz BTN_1, zmienna (zm1) jest inkrementowana – czyli po prostu zwiększana o jeden. W React za to odpowiada metoda setState, która zmienia stan komponentu – dzięki temu interfejs od razu aktualizuje się bez przeładowywania strony. W Angularze natomiast działa to przez tzw. dwukierunkową komunikację z template’em i automatyczną detekcję zmian – metoda onBtnCilcked w komponencie modyfikuje zmienną, a framework sam aktualizuje widok. Z mojego doświadczenia, takie podejście do zarządzania stanem to podstawa w nowoczesnych aplikacjach, szczególnie jeśli chodzi o responsywność i natychmiastową reakcję na akcje użytkownika. Liczniki są zresztą jednym z pierwszych przykładów, jakie się pisze ćwicząc frameworki frontendowe, bo świetnie pokazują, jak działa przepływ danych i odświeżanie elementów UI. Warto dodać, że trzymanie licznika kliknięć w stanie komponentu (a nie np. jako zmienną globalną) jest zgodne z dobrymi praktykami – bo ogranicza zakres danych i ułatwia zarządzanie większymi aplikacjami. Takie wzorce potem można z powodzeniem przenieść do trudniejszych projektów, na przykład liczników, koszyków, liczby zamówień czy nawet zaawansowanych dashboardów. W praktyce ten mechanizm inkrementowania wartości po kliknięciu użytkownika jest jednym z najczęściej używanych w interaktywnych aplikacjach internetowych.

Pytanie 27

Jakie cechy posiada model prototypowy w zakresie zarządzania projektami?

A. Rozwojem produktu w sposób iteracyjny w krótkich cyklach
B. Realizowaniem pełnej wersji produktu przed przeprowadzeniem testów
C. Przygotowaniem wersji systemu w ograniczonym zakresie w celu uzyskania opinii od użytkownika
D. Szczegółowym planowaniem każdego etapu projektu przed jego realizacją
Model prototypowy w zarządzaniu projektami to taka sprytna technika, gdzie tworzymy coś w rodzaju wczesnej wersji systemu, czyli prototypu. To nam pozwala zebrać opinie od użytkowników i przetestować różne pomysły zanim w ogóle weźmiemy się za pełną wersję. Fajną sprawą jest to, że gdy mamy ten prototyp, to łatwiej wyłapać błędy, zanim wszystko zostanie w pełni zbudowane. Największa zaleta? Możemy dostosować i poprawiać aplikację na podstawie tego, co mówią użytkownicy. Dzięki temu ryzyko, że stworzymy coś, co nie spełnia ich oczekiwań, jest znacznie mniejsze. Prototypy to często chleb powszedni w projektach UX/UI, aplikacjach webowych czy oprogramowaniu dla firm, gdzie tak istotne jest, by dobrze trafiać w potrzeby końcowych użytkowników.

Pytanie 28

Jakie znaczenie ma termin "hierarchia dziedziczenia" w kontekście programowania obiektowego?

A. Układ klas w strukturę, w której klasy pochodne dziedziczą cechy od klas bazowych
B. Układ klas, który ogranicza występowanie dziedziczenia wielokrotnego
C. Zbiór klas, które nie mają wspólnych powiązań
D. Zespół metod i pól posiadających ten sam modyfikator dostępu
Hierarchia dziedziczenia to fundamentalna koncepcja programowania obiektowego, polegająca na organizacji klas w strukturę, w której klasy pochodne dziedziczą właściwości (pola i metody) od klas bazowych. Pozwala to na wielokrotne wykorzystanie kodu, co zwiększa jego modularność i zmniejsza redundancję. Klasa bazowa dostarcza ogólne cechy i metody, podczas gdy klasy pochodne rozszerzają lub modyfikują tę funkcjonalność, dostosowując ją do bardziej specyficznych wymagań. Przykładem jest klasa 'Pojazd', po której mogą dziedziczyć klasy 'Samochód' i 'Motocykl', zachowując wspólne atrybuty, takie jak 'maksymalna prędkość' czy 'masa'.

Pytanie 29

Zaprezentowany wykres ilustruje wyniki przeprowadzonych testów

Ilustracja do pytania
A. wydajności
B. ochrony
C. użytecznoś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 30

Jakie składniki powinien mieć plan projektu?

A. Wyłącznie etapy projektu
B. Tylko czas wykonania i budżet
C. Terminy i zasoby ludzkie
D. Etapy projektu, ramy czasowe, zasoby i zadania
Harmonogram projektu powinien zawierać etapy projektu, ramy czasowe, zasoby oraz zadania. Taka kompleksowa struktura umożliwia skuteczne zarządzanie projektem i pozwala na śledzenie postępów. Każdy etap harmonogramu powinien być dokładnie opisany, a zadania powinny być przypisane do odpowiednich członków zespołu. Uwzględnienie zasobów i ram czasowych pozwala na precyzyjne planowanie i minimalizuje ryzyko opóźnień. Harmonogram stanowi nieodłączny element projektów zarządzanych zarówno w modelu Waterfall, jak i Agile, dostarczając przejrzystość na każdym etapie realizacji.

Pytanie 31

Reguła zaangażowania i konsekwencji jako jedna z zasad wpływania na innych odnosi się

A. do uległości wobec autorytetów
B. do kierowania się zdaniem danej grupy
C. do doprowadzania spraw do końca
D. do odwzajemniania się osobie, która nam pomogła
Kiedy analizujemy regułę zaangażowania i konsekwencji, łatwo ją pomylić z innymi mechanizmami społecznymi wpływania na ludzi, bo te psychologiczne zasady czasem zachodzą na siebie w praktyce. Moim zdaniem najczęściej mylonym pojęciem tutaj jest reguła wzajemności, która mówi o tym, że ludzie czują się zobowiązani, by się odwdzięczyć za otrzymaną pomoc – to jednak zupełnie inny mechanizm, związany bardziej z relacjami i budowaniem zaufania niż z wewnętrzną potrzebą bycia konsekwentnym względem własnych decyzji. Z kolei kierowanie się zdaniem grupy to klasyczna presja społeczna czy konformizm, która też bywa silnym czynnikiem wpływu, ale opiera się na chęci dopasowania się do większości, a nie na wcześniejszych własnych zobowiązaniach. No i jeszcze uległość wobec autorytetów – tu chodzi głównie o to, że ludzie mają tendencję słuchać osób postrzeganych jako eksperci czy przełożeni, bo wierzą w ich większą wiedzę czy doświadczenie. To inny proces, nie związany z samą konsekwencją własnych działań. Typowym błędem jest patrzenie na te zasady jakby były zamienne, a w rzeczywistości każda wywołuje inne motywacje i wywołuje inny rodzaj zachowań. W branżowych dobrych praktykach, na przykład w sprzedaży B2B czy w projektach zespołowych, bardzo ważne jest rozróżnianie tych pojęć, by umiejętnie stosować odpowiednie narzędzia wpływu. Warto zawsze pamiętać, że reguła zaangażowania i konsekwencji opiera się na wewnętrznym przymusie trzymania się własnych wcześniejszych wyborów – niezależnie od opinii innych czy zewnętrznej presji.

Pytanie 32

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

A. localhost:5001 (React) lub localhost:8080 (Angular)
B. localhost:3000 (React) lub localhost:4200 (Angular)
C. localhost:8080 (React) lub localhost:8000 (Angular)
D. localhost:8000 (React) lub localhost:49887 (Angular)
W branży webowej bardzo łatwo się pogubić z numeracją portów, szczególnie kiedy pracuje się na różnych frameworkach i narzędziach. Częstym błędem jest założenie, że React i Angular korzystają z jakichś uniwersalnych albo zamiennych portów, ale w rzeczywistości te frameworki mają swoje domyślne ustawienia, które są szeroko przyjęte. Przykładowo, React – głównie dzięki create-react-app – zazwyczaj startuje na porcie 3000. Angular natomiast, kiedy uruchamiasz ng serve, domyślnie pojawia się na porcie 4200. Błędne wybranie portu 8000 czy 8080 może wynikać z przyzwyczajeń z pracy z serwerami backendowymi, gdzie te porty rzeczywiście są popularne (np. Pythonowy SimpleHTTPServer czy serwery Node.js, które często startuje się na 8080). Jednak w środowisku front-endu, szczególnie przy pracy z Reactem czy Angularem, te porty są raczej rzadkością, chyba że ktoś zmieni konfigurację ręcznie. Port 49887 czy 5001 to już kompletnie przypadkowe wartości – takich numerów nie spotyka się w domyślnych ustawieniach żadnego z tych narzędzi i ich wybór byłby naprawdę nietypowy. Zdarza się, że ktoś zapamięta porty z innych technologii albo środowisk i potem próbuje je stosować przy frameworkach front-endowych – to jest taki typowy błąd myślowy. Warto też pamiętać, że wpisanie niewłaściwego portu w przeglądarce po prostu nie uruchomi aplikacji, co może prowadzić do niepotrzebnej frustracji. Kluczowe jest więc, żeby znać te standardowe adresy: React na 3000, Angular na 4200. Taka wiedza oszczędza sporo czasu i pozwala uniknąć nieporozumień podczas pracy zespołowej. W sumie, jak dla mnie, dobrze jest zawsze na początku sprawdzić w dokumentacji narzędzia, na jakim porcie ono działa domyślnie – to niby drobiazg, a potrafi ułatwić życie.

Pytanie 33

Jakie jest poprawne określenie interfejsu (szablonu klasy) w języku Java?

interface IMyInterface {
    private: int a;
    IMyInterface() { a = 0; }
    void mth1();
}
Definicja 1
interface IMyInterface {
    private: int a;
    void mth1();
    int mth2() { return a; }
}
Definicja 2
interface IMyInterface {
    void mth1();
    int mth2() { return 0; }
}
Definicja 3
interface IMyInterface {
    void mth1();
    int mth2();
}
Definicja 4
A. Definicja 3
B. Definicja 4
C. Definicja 1
D. Definicja 2
W pierwszej definicji interfejsu obecność zmiennej prywatnej i konstruktora jest niezgodna z zasadami definiowania interfejsów w języku Java. Interfejsy nie mogą zawierać żadnych konstruktorów, ponieważ nie są klasami i nie można ich instancjonować. Dodatkowo, zmienne w interfejsach są domyślnie publiczne, statyczne i finalne, co oznacza, że nie mogą być prywatne jak w tej definicji. Druga definicja popełnia podobne błędy przez deklarowanie prywatnej zmiennej i implementację metody wewnątrz interfejsu, co przed Java 8 było niemożliwe. Trzecia definicja zawiera metodę z ciałem, co w kontekście starszych wersji Javy nie jest zgodne z zasadami, choć od Java 8 można deklarować metody domyślne z ciałem, jednak w tej sytuacji nie jest to poprawne bez specyfikacji default. Błędnie przyjęte podejścia do definicji interfejsów mogą wynikać z niezrozumienia, że interfejsy służą jedynie do deklarowania metod i ewentualnie statycznych finalnych zmiennych, nie zaś do implementacji logiki. Prawidłowe zrozumienie roli interfejsów jest kluczowe dla wykorzystania ich w tworzeniu elastycznego i rozszerzalnego kodu. Błędy te podkreślają potrzebę dbałości o zgodność ze specyfikacją języka oraz znajomość jego wersji i nowości wprowadzanych w kolejnych iteracjach.

Pytanie 34

W zamieszczonej ramce znajdują się notatki testera dotyczące przeprowadzanych testów aplikacji. Jakiego typu testy planuje przeprowadzić tester?

  • zmierzyć czas zalogowania się użytkownika
  • ustalić domyślną liczbę produktów na stronie, dla której renderowanie jest akceptowalne czasowo
  • czy wizualizacja danych na mapie przebiega bez opóźnień?
  • czy czas logowania wzrasta znacznie przy logowaniu 10 użytkowników, 100, 1000?
  • jaka minimalna prędkość pobierania jest wymagana, aby aplikacja była zaakceptowana przez klienta?
A. Jednostkowe
B. Wydajnościowe
C. Bezpieczeństwa
D. Interfejsu
Testy wydajnościowe są kluczowe dla zapewnienia, że system działa sprawnie pod różnym obciążeniem. Są one wykonywane, aby zrozumieć, jak aplikacja zachowuje się w warunkach rzeczywistych, kiedy wiele użytkowników korzysta z niej jednocześnie. W pytaniu wymienione zostały zadania takie jak mierzenie czasu logowania się użytkowników oraz sprawdzanie, czy czas ten wzrasta wraz ze wzrostem liczby użytkowników. To typowe aspekty testów wydajnościowych. Takie testy pomagają określić limity skalowalności i zapewniają, że aplikacja może obsługiwać oczekiwaną liczbę użytkowników bez spadku wydajności. Standardy branżowe, takie jak ISO/IEC 25010, zwracają uwagę na konieczność testowania wydajności, by zidentyfikować potencjalne wąskie gardła i zapewnić satysfakcjonujące doświadczenia użytkownikom. Dobrymi praktykami są używanie narzędzi takich jak JMeter czy LoadRunner, które umożliwiają symulację obciążenia i analizę wyników w celu optymalizacji kodu i infrastruktury. Tego typu testy są nieodzowne przed wdrożeniem aplikacji produkcyjnej, aby zapewnić jej niezawodne działanie.

Pytanie 35

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

A. Do sprawdzania typu danych
B. Do rozwinięcia tablicy lub obiektu na poszczególne elementy
C. Do konwersji liczby na string
D. Do łączenia dwóch różnych typów danych
Operator spread (...) w JavaScript jest niezwykle użytecznym narzędziem, które pozwala na łatwe rozwijanie tablic i obiektów do ich poszczególnych elementów lub właściwości. Umożliwia to na przykład przekazywanie elementów tablicy jako argumentów do funkcji lub łączenie wielu obiektów w jeden. Przykładowo, jeśli mamy tablicę `const arr = [1, 2, 3];` to używając operatora spread, możemy przekazać te elementy do funkcji tak: `Math.max(...arr)`, co zwróci 3. Dodatkowo, operator ten jest często używany przy tworzeniu nowych obiektów na podstawie istniejących. Na przykład, mając obiekt `const obj = { a: 1, b: 2 };`, możemy stworzyć nowy obiekt z dodatkową właściwością: `const newObj = { ...obj, c: 3 };` co da `newObj = { a: 1, b: 2, c: 3 };`. Operator spread jest zgodny z ES6 i stał się standardem w praktykach programistycznych, ułatwiając pisanie czystszych i bardziej elastycznych kodów. Warto go stosować, aby poprawić czytelność i efektywność swojego kodu.

Pytanie 36

Z analizy złożoności obliczeniowej różnych algorytmów sortowania na dużych zbiorach danych (przekraczających 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. kubełkowego
B. przez scalanie
C. bąbelkowego
D. przez zliczanie
Sortowanie bąbelkowe, mimo że jest łatwe do zrozumienia i zaimplementowania, ma złożoność czasową O(n²), co czyni je nieefektywnym dla dużych zbiorów danych, takich jak ponad 100 elementów. Działa poprzez wielokrotne przechodzenie przez listę, porównując sąsiednie elementy i zamieniając je miejscami, jeśli są w niewłaściwej kolejności. To powoduje, że algorytm ten staje się wolny przy większej ilości danych. Sortowanie przez scalanie, choć bardziej wydajne niż bąbelkowe, z złożonością O(n log n), nadal nie dorównuje szybkością sortowaniu przez zliczanie w specyficznych warunkach, gdzie zakres wartości jest ograniczony. Jest to metoda rekurencyjna, która dzieli listę na mniejsze części, sortuje je, a następnie scala w jedną posortowaną listę. Natomiast sortowanie kubełkowe, podobnie jak przez zliczanie, korzysta z dodatkowych struktur danych, lecz jego efektywność zależy od tego, jak elementy są równomiernie rozmieszczone w kubełkach, co może prowadzić do złożoności O(n²) w przypadku złej dystrybucji. Typowe błędy myślowe polegają na przecenianiu prostoty implementacji ponad złożoność czasową, a także niedocenianiu specyfiki danych wejściowych, co jest kluczowe dla wyboru odpowiedniego algorytmu sortującego. Przy rozważaniu wyboru algorytmu należy zawsze brać pod uwagę zarówno jego złożoność, jak i charakterystykę danych, jakie będą przetwarzane, co jest podstawą dobrych praktyk inżynierii oprogramowania.

Pytanie 37

W jakim modelu Cyklu Życia Projektu Informatycznego znajduje się etap analizy ryzyka?

A. W kaskadowym
B. W spiralnym
C. W modelu Fry’ego
D. W modelu z prototypem
Często spotyka się przekonanie, że analiza ryzyka jest obecna w każdym modelu cyklu życia projektu informatycznego, ale to nie do końca tak działa. W modelu kaskadowym, czyli tzw. waterfall, wszystko odbywa się etapami – analiza, projektowanie, implementacja i tak dalej, w sztywno określonej kolejności. Tu niestety nie ma miejsca na systematyczną analizę ryzyka na każdym etapie, bo cała koncepcja tego modelu polega na tym, że raz wykonane czynności trudno potem cofnąć lub poprawić, szczególnie gdy coś pójdzie nie tak. To, moim zdaniem, jest jeden z powodów, dla których model kaskadowy bywa krytykowany – brak elastyczności i mała odporność na niespodziewane problemy. Podobnie jest w modelu z prototypem – tam niby tworzy się szybkie makiety czy prototypy, ale głównym celem jest poznanie potrzeb użytkownika i szybkie zebranie informacji zwrotnej, a nie formalna analiza ryzyka. Ryzyko oczywiście można zidentyfikować przy okazji, ale nie jest to centralny punkt tego podejścia. Model Fry’ego to już zupełnie inna bajka – jest bardzo liniowy, nacisk kładzie raczej na dokumentację i ścisłe trzymanie się etapów, a nie na adaptacyjność czy zarządzanie niepewnością. Z mojego punktu widzenia, błędne wybranie któregoś z tych modeli jako tego, gdzie analizuje się ryzyko, wynika z przekonania, że wszędzie jest miejsce na refleksję nad zagrożeniami – niestety, tylko model spiralny wprost i metodycznie wpisuje analizę ryzyka w swój rdzeń. W innych przypadkach analiza ryzyka jeśli się pojawia, to głównie z inicjatywy zespołu, a nie jako zaplanowany, powtarzający się etap procesu. Warto o tym pamiętać przy wyborze metodyki do danego projektu – nie każda zapewni takie same mechanizmy zabezpieczające przed błędami i nieprzewidzianymi zdarzeniami.

Pytanie 38

Co to jest Cypress?

A. Framework do testowania end-to-end aplikacji webowych
B. System zarządzania bazami danych dla aplikacji mobilnych
C. Narzędzie do kompilacji kodu TypeScript
D. Biblioteka komponentów UI dla React
Odpowiedzi, które wskazują na inne funkcje niż testowanie aplikacji webowych, prowadzą do nieporozumień związanych z rolą i zastosowaniem narzędzi w procesie tworzenia oprogramowania. Na przykład, biblioteki komponentów UI dla React są narzędziem, które ułatwia tworzenie interaktywnych interfejsów użytkownika, ale nie zajmują się automatyzowaniem testów. Systemy zarządzania bazami danych są odpowiedzialne za przechowywanie i organizację danych, a nie za testowanie aplikacji. Podobnie, narzędzia do kompilacji kodu TypeScript koncentrują się na konwersji kodu źródłowego z TypeScript do JavaScript, co jest zupełnie inną funkcjonalnością. Kluczowym błędem jest mylenie różnych aspektów cyklu życia aplikacji; testowanie end-to-end, które oferuje Cypress, jest krytycznym krokiem zapewniającym jakość i niezawodność aplikacji, podczas gdy inne wymienione opcje mają odmienny cel i zastosowanie. Zrozumienie różnicy między tymi narzędziami jest kluczowe dla właściwego doboru technologii w projekcie informatycznym.

Pytanie 39

Co to jest JWT (JSON Web Token)?

A. Standard definiujący sposób bezpiecznego przekazywania informacji jako obiekt JSON
B. Format zapisu danych używany w bazach NoSQL
C. Biblioteka JavaScript do walidacji formularzy webowych
D. Protokół komunikacyjny do transferu danych między klientem a serwerem
JWT, czyli JSON Web Token, jest standardem, który definiuje sposób bezpiecznego przekazywania informacji między dwiema stronami w postaci obiektu JSON. Tokeny JWT są powszechnie wykorzystywane w systemach autoryzacji i autoryzacji, umożliwiając przekazywanie zweryfikowanych i podpisanych danych. Struktura tokena składa się z trzech części: nagłówka, ładunku (payload) oraz podpisu. Nagłówek zazwyczaj określa typ tokena oraz algorytm użyty do podpisania, ładunek zawiera dane, które chcemy przesłać, a podpis jest generowany przy użyciu tajnego klucza, co zapewnia integralność danych. Przykładem zastosowania JWT może być system logowania, gdzie po pomyślnym zalogowaniu użytkownik otrzymuje token, który jest następnie używany do autoryzacji kolejnych zapytań do serwera. Dzięki swojej strukturze, JWT nie tylko zwiększa bezpieczeństwo, ale także umożliwia łatwą wymianę informacji między różnymi systemami, co jest szczególnie ważne w architekturach mikroserwisowych.

Pytanie 40

Która z wymienionych kart graficznych oferuje lepszą wydajność w grach komputerowych?

A. Intel UHD Graphics 630 - zintegrowana
B. AMD Radeon RX 580 - 8GB GDDR5, 256-bit
C. AMD Radeon R7 240 - 2GB GDDR5, 64-bit
D. NVIDIA GeForce GTX 1050 Ti - 4GB GDDR5, 128-bit
AMD Radeon RX 580 to karta graficzna, która zapewnia wyższą wydajność w grach komputerowych w porównaniu do innych wymienionych opcji. Wyposażona w 8GB pamięci GDDR5 oraz 256-bitową szynę danych, karta ta jest w stanie obsługiwać bardziej złożone tekstury oraz większe rozdzielczości. Jej architektura Polaris pozwala na lepsze zarządzanie energią oraz wydajność w grach, co czyni ją idealnym wyborem dla graczy. Dzięki obsłudze technologii DirectX 12 i Vulkan, RX 580 jest w stanie wykorzystać najnowsze osiągnięcia w dziedzinie grafiki, co przekłada się na wyższą jakość obrazu oraz płynność animacji. Przykłady gier, w których RX 580 sprawdza się najlepiej to 'Far Cry 5' czy 'Shadow of the Tomb Raider', gdzie karta umożliwia granie w wysokich ustawieniach graficznych z zachowaniem wysokiej liczby klatek na sekundę. Standardy, takie jak PCIe 3.0, zapewniają pełną kompatybilność z nowoczesnymi płytami głównymi, co czyni tę kartę doskonałym wyborem dla entuzjastów gier komputerowych.