Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 18 grudnia 2025 14:27
  • Data zakończenia: 18 grudnia 2025 14:28

Egzamin niezdany

Wynik: 15/40 punktów (37,5%)

Wymagane minimum: 20 punktów (50%)

Udostępnij swój wynik
Szczegółowe wyniki:
Pytanie 1

Jakie środowisko jest natywne do tworzenia aplikacji desktopowych w języku C#?

A. MS Visual Studio
B. NetBeans
C. PyCharm
D. Eclipse
W branży często spotykam się z przekonaniem, że każde większe środowisko programistyczne nada się do wszystkiego, ale to nie do końca prawda, szczególnie jeśli chodzi o C# i aplikacje desktopowe. Eclipse kojarzy się głównie z Javą i choć można doinstalować różne wtyczki, to w praktyce wsparcie dla C# jest tam bardzo ograniczone, zwłaszcza w kontekście aplikacji desktopowych pod Windows. NetBeans to podobna historia – projektowano go pod kątem Javy i Swinga, a rozwiązania dla C# są bardzo niszowe i raczej eksperymentalne. PyCharm natomiast to świetne narzędzie do Python’a, ale nie ma natywnego wsparcia dla C# czy .NET Framework. Często początkujący zakładają, że „duży edytor” to od razu uniwersalne środowisko, jednak rzeczywistość jest taka, że tylko Visual Studio zapewnia pełną integrację z narzędziami Microsoftu oraz obsługą platformy Windows. Dla aplikacji desktopowych w C# ważne jest wsparcie dla Windows Forms, WPF czy nowoczesnych rozwiązań typu .NET MAUI – a tego nie dostaniemy w Eclipse, NetBeans czy PyCharm. Warto pamiętać, że wybierając nieodpowiednie IDE, można sobie skomplikować życie już na starcie, bo konfiguracja i debugowanie aplikacji może być bardzo uciążliwe, a nawet często niemożliwe bez natywnego wsparcia. Zdarza się też, że mylenie środowisk wynika z tego, że na uczelniach promuje się Eclipse czy NetBeans przez pryzmat Javy, stąd czasami ktoś próbuje używać ich do C#, ale to naprawdę nie jest efektywna droga. W praktyce, jeśli zależy nam na solidnych narzędziach i szybkim wdrażaniu gotowych aplikacji na Windows, Visual Studio jest właściwym wyborem i tak też uczą tego na kursach oraz szkoleniach branżowych.

Pytanie 2

Który z protokołów w modelu TCP/IP odpowiada za pewne przesyłanie danych?

A. HTTP
B. IP
C. TCP
D. UDP
Protokół TCP (Transmission Control Protocol) jest kluczowym elementem modelu TCP/IP, odpowiedzialnym za zapewnienie niezawodnego i uporządkowanego przesyłania danych między urządzeniami w sieci. TCP działa na poziomie transportu i gwarantuje, że dane są dostarczane w odpowiedniej kolejności oraz bez błędów. Protokół ten wykorzystuje mechanizmy takie jak kontrola przepływu, retransmisja utraconych pakietów oraz potwierdzenia odbioru, co czyni go idealnym do aplikacji wymagających wysokiej niezawodności, takich jak przesyłanie plików czy komunikacja w sieciach WWW. Na przykład, gdy przeglądarka internetowa pobiera stronę, TCP segmentuje dane na mniejsze pakiety, które są następnie przesyłane do użytkownika, a każdy z nich jest potwierdzany przez odbiorcę. Jeśli pakiet nie zostanie potwierdzony w określonym czasie, TCP automatycznie go retransmituje. Protokół ten jest zgodny z standardami RFC 793 oraz RFC 1122, które definiują jego działanie oraz zasady dotyczące niezawodnego przesyłania danych w sieciach komputerowych.

Pytanie 3

Termin ryzyko zawodowe odnosi się do

A. efektów zagrożeń wypadkowych, jakie występują w miejscu zatrudnienia
B. prawdopodobieństwa, że zdarzenia niepożądane związane z pracą spowodują straty, w szczególności negatywne skutki zdrowotne dla pracowników
C. ciężkości skutków niepożądanych zdarzeń związanych z pracą
D. zagrożenia wypadkowego, które może wystąpić w miejscu pracy
Pojęcie ryzyka zawodowego w branży BHP jest dość precyzyjnie zdefiniowane i, moim zdaniem, bardzo praktyczne. Chodzi tu właśnie o prawdopodobieństwo, że w wyniku zdarzeń niepożądanych w pracy pojawią się straty – najczęściej w postaci szkód zdrowotnych u pracowników, ale czasem też finansowych czy środowiskowych. To nie tylko sam fakt istnienia zagrożenia, ale ocena, czy i jak bardzo ono może się zaktualizować. W praktyce, np. w branży budowlanej czy energetycznej, ocena ryzyka zawodowego to podstawa organizacji bezpiecznej pracy. W Polsce normy PN-N-18002 i wytyczne Głównego Inspektoratu Pracy jasno mówią, że trzeba analizować zarówno prawdopodobieństwo wystąpienia zagrożenia, jak i potencjalne skutki. Co ciekawe, dla różnych zawodów i stanowisk ocena tego ryzyka może wyglądać zupełnie inaczej – czasem to analiza prostych czynności, czasem złożony audyt. Najlepsze firmy nie ograniczają się do szacowania samego zagrożenia, ale regularnie aktualizują ocenę ryzyka, szkolą pracowników i wdrażają środki zapobiegawcze. Moim zdaniem bez rzetelnej oceny ryzyka nie da się realnie podnieść bezpieczeństwa pracy – to taki fundament wszystkich dalszych działań. Warto zwracać uwagę, że ryzyko zawodowe zawsze wynika z kombinacji zagrożenia i prawdopodobieństwa, a nie tylko z obecności niebezpieczeństwa czy dotychczasowych wypadków.

Pytanie 4

Co to jest BEM w kontekście CSS?

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

Pytanie 5

Z jakiej kolekcji powinno się korzystać, aby przechowywać informacje związane z elementem interfejsu użytkownika w taki sposób, aby ten element był informowany przez kolekcję o dodaniu, usunięciu lub zmianie jej zawartości?

A. KeyedCollection
B. ObservableCollection
C. ReadOnlyCollection
D. Collection
ObservableCollection to zdecydowanie najlepszy wybór w sytuacji, gdy zachodzi potrzeba powiadamiania elementów interfejsu użytkownika o zmianach w kolekcji. W praktyce, kiedy pracujesz np. z WPF, UWP albo MAUI, to ObservableCollection automatycznie informuje UI o dodaniu, usunięciu czy modyfikacji elementów. Wszystko dzięki temu, że implementuje interfejs INotifyCollectionChanged. Moim zdaniem praktyczne zastosowanie jest mega – gdy masz np. listę produktów, która wyświetla się użytkownikowi, to po prostu dokładasz lub usuwasz elementy z ObservableCollection i nie musisz ręcznie odświeżać widoku. Framework sam ogarnia powiązanie danych, bo kolekcja emituje zdarzenia CollectionChanged. Takie podejście jest spójne z zasadami MVVM i ogólnie promowane przez Microsoft w oficjalnych dokumentacjach. Często spotkać można rozwiązania, gdzie ktoś używa zwykłej List lub Collection, ale wtedy tracisz te automatyczne powiadomienia i pojawia się masa kodu-boilerplate. Szczerze mówiąc, nie widzę sensu kombinować z innymi kolekcjami, jeśli zależy Ci na dynamicznym, responsywnym UI. ObservableCollection to po prostu standard branżowy w .NET, jak dla mnie nie ma lepszej opcji na takie zastosowania.

Pytanie 6

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

A. HTTP
B. HTTPS
C. SMTP
D. FTP
Protokół FTP (File Transfer Protocol) jest używany do przesyłania plików pomiędzy komputerami w sieci, jednak nie zapewnia on żadnych mechanizmów szyfrowania, co czyni go nieodpowiednim do bezpiecznej komunikacji. Przesyłane dane, w tym uwierzytelnienia, są wysyłane w postaci niezaszyfrowanej, co naraża je na przechwycenie przez osoby trzecie. SMTP (Simple Mail Transfer Protocol) to protokół wykorzystywany do wysyłania wiadomości e-mail, ale podobnie jak FTP, nie oferuje zabezpieczeń w zakresie szyfrowania, co czyni go niewłaściwym wyborem do zapewnienia bezpieczeństwa przesyłanych informacji. Z kolei HTTP (Hypertext Transfer Protocol) jest podstawowym protokołem do przesyłania danych w Internecie, jednak również nie zapewnia on ochrony przed podsłuchiwaniem. Wszelkie dane wysyłane za pomocą HTTP są podatne na różnego rodzaju ataki, takie jak przechwytywanie sesji czy ataki typu „man-in-the-middle”. Często użytkownicy mylą te protokoły, sądząc, że mogą one zapewnić odpowiedni poziom bezpieczeństwa, jednak w praktyce brak odpowiednich mechanizmów szyfrowania naraża ich dane na niebezpieczeństwo. Ostatecznie, w dobie rosnącego znaczenia ochrony prywatności w sieci oraz rosnących zagrożeń cybernetycznych, stosowanie protokołów, które nie oferują szyfrowania, jest niewłaściwą strategią w kontekście bezpiecznej komunikacji przez Internet.

Pytanie 7

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

Ilustracja do pytania
A. Kod 1
B. Kod 2
C. Kod 3
D. Kod 4
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 8

Gdzie są przechowywane informacje w sytuacji korzystania z chmury obliczeniowej?

A. Na zdalnych serwerach dostawcy usług
B. Na lokalnym serwerze użytkownika
C. Na dysku twardym użytkownika
D. Na nośnikach optycznych użytkownika
Dane w chmurze obliczeniowej są przechowywane przede wszystkim na zdalnych serwerach dostawcy usług chmurowych. Tego rodzaju przechowywanie danych ma na celu zapewnienie wysokiej dostępności, skalowalności oraz bezpieczeństwa. Dostawcy usług chmurowych, tacy jak Amazon Web Services, Microsoft Azure czy Google Cloud Platform, inwestują w infrastrukturę, która obejmuje centra danych rozmieszczone na całym świecie. Te centra danych są wyposażone w zaawansowane systemy zabezpieczeń, takie jak firewall'e, szyfrowanie danych i systemy detekcji intruzów. Dzięki temu użytkownicy mogą mieć pewność, że ich dane są bezpieczne. Dodatkowo, zdalne serwery oferują elastyczność w zakresie przydzielania zasobów obliczeniowych, co pozwala na dynamiczne reagowanie na zmieniające się potrzeby biznesowe. Warto również wspomnieć o standardach bezpieczeństwa, takich jak ISO 27001 czy SOC 2, które regulują sposób przechowywania i zarządzania danymi w chmurze, zapewniając zgodność z najlepszymi praktykami branżowymi.

Pytanie 9

Co to jest Cypress?

A. Biblioteka komponentów UI dla React
B. Narzędzie do kompilacji kodu TypeScript
C. Framework do testowania end-to-end aplikacji webowych
D. System zarządzania bazami danych dla aplikacji mobilnych
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 10

Jakie działanie związane z klasą abstrakcyjną jest niedozwolone?

A. Utworzenie instancji tej klasy
B. Określenie metody wirtualnej
C. Rozszerzanie tej klasy
D. Definiowanie pól publicznych
Deklaracja pól publicznych w klasie abstrakcyjnej jest całkowicie dozwolona i może być używana do udostępniania danych w klasach pochodnych. Wprowadzenie pól publicznych w klasie abstrakcyjnej pozwala na określenie podstawowych atrybutów, które będą współdzielone przez wszystkie klasy dziedziczące. Może to być przydatne w kontekście encapsulacji i zarządzania danymi w aplikacjach. Deklaracja metody wirtualnej również jest prawidłowa, gdyż klasy abstrakcyjne mogą zawierać metody, które są zdefiniowane jako wirtualne, co umożliwia ich nadpisywanie w klasach pochodnych. Dzięki temu, programiści mogą budować bardziej elastyczne i modułowe aplikacje. Dziedziczenie po klasie abstrakcyjnej jest podstawowym stosowaniem tego typu klas, gdyż pozwala na tworzenie hierarchii, w której klasy pochodne muszą implementować abstrakcyjne metody zdefiniowane w klasie bazowej. Dziedziczenie wspiera ponadto zasady programowania obiektowego, takie jak ponowne wykorzystanie kodu i polimorfizm, co czyni je kluczowym elementem nowoczesnego programowania.

Pytanie 11

Jakie z wymienionych narzędzi jest szeroko stosowane do debugowania aplikacji internetowych?

A. Git
B. Chrome DevTools
C. Postman
D. Blender
Git jest systemem kontroli wersji, który pomaga zarządzać kodem źródłowym i śledzić zmiany, ale nie służy do debugowania aplikacji webowych. Postman to narzędzie do testowania API, które pozwala na wysyłanie zapytań HTTP, ale nie umożliwia debugowania interfejsów webowych ani modyfikacji DOM. Blender jest narzędziem do modelowania 3D i animacji, nie mającym związku z debugowaniem aplikacji webowych.

Pytanie 12

Jakie jest rozwiązanie dla dodawania binarnego liczb 1011 oraz 110?

A. 11101
B. 10001
C. 11001
D. 10101
Dodawanie binarne to podstawowa operacja w systemie liczbowym, który używa tylko dwóch cyfr: 0 i 1. W przypadku dodawania liczb binarnych, proces ten przypomina dodawanie w systemie dziesiętnym, jednak z pewnymi różnicami ze względu na ograniczony zestaw cyfr. Gdy dodajemy liczby 1011 i 110, należy ustawić je w kolumnach, podobnie jak w dodawaniu dziesiętnym. Zaczynamy od najmniej znaczącej cyfry. W pierwszej kolumnie mamy 1 + 0, co daje 1. W drugiej kolumnie mamy 1 + 1, co daje 0, ale musimy przenieść 1 do następnej kolumny (przeniesienie jest kluczowym elementem w dodawaniu binarnym). W trzeciej kolumnie dodajemy 1 (przeniesienie) + 0 + 1, co daje 0 i przenosimy 1 do następnej kolumny. W czwartej kolumnie dodajemy przeniesienie 1 + 1 (z liczby 1011), co daje 10 w systemie binarnym, co oznacza 0 i przeniesienie 1. Końcowym wynikiem dodawania daje 10001 w systemie binarnym. To podejście jest zgodne z zasadami arytmetyki binarnej, które są fundamentem działania komputerów i systemów cyfrowych, w których operacje na danych są realizowane w systemie binarnym.

Pytanie 13

Jakie znaczenie ma framework w kontekście programowania?

A. Zbiór gotowych bibliotek, narzędzi i zasad ułatwiających tworzenie aplikacji
B. System operacyjny, który umożliwia uruchamianie aplikacji
C. Program do graficznego projektowania interfejsów użytkownika
D. Moduł do zarządzania systemami baz danych
Framework to zbiór gotowych bibliotek, narzędzi i reguł, które wspierają tworzenie aplikacji poprzez dostarczanie struktury ułatwiającej pracę programistów. Frameworki definiują standardowe komponenty aplikacji, umożliwiając programistom skoncentrowanie się na logice biznesowej zamiast na podstawowej architekturze aplikacji. Przykłady popularnych frameworków to .NET, Angular, Django i Spring. Frameworki przyspieszają proces programowania, poprawiają jakość kodu i wspierają skalowalność aplikacji, co czyni je nieodłącznym elementem nowoczesnego programowania.

Pytanie 14

Jakie jest znaczenie klasy abstrakcyjnej?

A. Klasa, która nie może posiadać żadnych metod
B. Klasa, która może zawierać zarówno metody zdefiniowane, jak i niezdefiniowane (czysto wirtualne)
C. Klasa, która może być dziedziczona, ale nie można jej instancjonować
D. Klasa, która zawsze dziedziczy z klasy bazowej
Klasa, która nie może mieć żadnych metod, jest niepraktyczna i nie spełnia żadnych funkcji w programowaniu obiektowym. Klasa dziedzicząca zawsze dziedziczy po klasie bazowej, a nie po klasie pochodnej – dziedziczenie odbywa się w jednym kierunku. Twierdzenie, że klasa abstrakcyjna zawsze dziedziczy z klasy pochodnej, jest błędne – klasy abstrakcyjne mogą być na szczycie hierarchii dziedziczenia i służą jako punkt wyjścia dla innych klas. Klasa, która nie może być instancjonowana, ale może być dziedziczona, to właśnie klasa abstrakcyjna, co czyni to stwierdzenie poprawnym.

Pytanie 15

Jakie słowa kluczowe są stosowane w języku C++ do zarządzania wyjątkami?

A. try i raise
B. try i catch
C. except i finally
D. throw i handle
Słowa 'throw' i 'handle' nie są standardową konstrukcją obsługi wyjątków w C++. 'Throw' służy do zgłaszania wyjątków, ale 'handle' nie jest używane w tym kontekście – zamiast tego stosuje się 'catch'. 'Except' i 'finally' są składnią charakterystyczną dla Pythona, a nie dla C++. 'Raise' to również słowo kluczowe używane w Pythonie do zgłaszania wyjątków, ale nie występuje w C++ – tam używa się 'throw'.

Pytanie 16

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

A. Wzrost poziomu motywacji
B. Obniżenie koncentracji oraz zwiększone ryzyko popełniania błędów
C. Poprawa kondycji fizycznej
D. Zwiększenie odporności na stres
Fajnie, że zauważasz, że monotonia w pracy może zmniejszać motywację. Monotonne zadania, zamiast dawać energię, raczej ją zabierają. W sumie to, żeby poprawić swoją formę, trzeba się ruszać i nie tylko siedzieć przy biurku. Natomiast na stres najlepsze są treningi relaksacyjne – monotonia nie załatwia sprawy, a wręcz przeciwnie, zwiększa frustrację.

Pytanie 17

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

A. JSON
B. SVG
C. CSV
D. XML
Podejścia związane z innymi odpowiedziami nie są odpowiednie do tworzenia wykresów i animacji w przeglądarce. XML (Extensible Markup Language) jest formatem opisu danych, który służy do strukturalnego przechowywania i transportu danych, ale nie jest bezpośrednio używany do generowania grafik czy animacji. Chociaż można zbudować na jego podstawie system do tworzenia grafik, wymagałoby to dodatkowego przetwarzania, co czyni go mniej wydajnym. CSV (Comma-Separated Values) jest formatem tekstowym wykorzystywanym do przechowywania danych tabelarycznych, co ogranicza go do zadań związanych z wymianą danych, a nie ich wizualizacją. JSON (JavaScript Object Notation) jest z kolei formatem do wymiany danych, który jest czytelny dla ludzi i łatwy do przetworzenia przez maszyny, jednak nie odnosi się bezpośrednio do grafiki wektorowej. Często popełnianym błędem jest mylenie tych formatów z ich zastosowaniem w kontekście wizualizacji danych. Kluczowe jest, aby zrozumieć, że do skutecznego tworzenia interaktywnych i estetycznych wykresów lepiej jest używać technologii specjalnie zaprojektowanych do tego celu, jak SVG, które zapewniają odpowiednią funkcjonalność i wsparcie. Ostatecznie, wybór technologii powinien być uzależniony od specyficznych potrzeb projektu oraz jego wymagań.

Pytanie 18

Wskaż fragment kodu, który wykreuje przedstawioną kontrolkę?

Ilustracja do pytania
A. Kod3
B. Kod2
C. Kod1
D. Kod4
Rozpatrując pozostałe opcje można zauważyć kilka błędnych koncepcji które należy wyjaśnić. Kod1 wykorzystuje klasę SearchView która służy do wyszukiwania nie jest jednak przeznaczona do wyświetlania ocen w formie gwiazdek. SearchView nie posiada mechanizmów ani atrybutów pozwalających na wizualizację ocen co oznacza że wybór tego kodu jest pomyłką wynikającą z mylnego zrozumienia funkcji tej kontrolki. Kod2 to ProgressBar który służy do wyświetlania postępu zadań takich jak ładowanie danych. Mimo że ProgressBar potrafi pokazywać poziom zaawansowania to jego forma jest zupełnie inna i nie jest używana do prezentacji ocen w skali gwiazdkowej. Jest to kontrolka dynamiczna której głównym celem jest przedstawianie zmiany stanu a nie stałe wizualizacje. Kod4 z kolei dotyczy klasy Switch co jest elementem UI używanym do przełączania stanów takich jak włączanie i wyłączanie funkcji. Switch nie ma nic wspólnego z ocenami ani wizualizacją skali. Wybór tego kodu mógłby wynikać z mylnego założenia że kontrolka ta może być stosowana do interaktywnego wyboru lecz jej funkcjonalność nie obejmuje ocen. Podsumowując błędne odpowiedzi wynikają z fundamentalnego niezrozumienia specyfiki i zastosowania właściwych kontrolek w Androidzie. Każda z nich ma swoje unikalne przeznaczenie i nie zastąpi funkcji RatingBar w kontekście wizualizacji ocen w postaci gwiazdek standardowego elementu aplikacji mobilnych do zbierania informacji zwrotnej od użytkowników.

Pytanie 19

Jakie rezultaty pojawią się po uruchomieniu poniższego kodu napisanego w języku C++?

class KlasaBazowa {
    public:
        virtual void metoda() {
            cout << "Bazowa. ";
        }
};

class KlasaPochodna : public KlasaBazowa {
    public:
        void metoda() {
            cout << "Pochodna. ";
        }
};

int main() {
    KlasaBazowa *bazowa = new KlasaPochodna();
    KlasaPochodna *pochodna = new KlasaPochodna();

    bazowa->metoda();
    pochodna->metoda();
    return 0;
}
A. Bazowa. Bazowa.
B. Pochodna. Pochodna.
C. Pochodna. Bazowa.
D. Bazowa. Pochodna.
Wyświetlenie 'Bazowa. Pochodna.' wskazywałoby, że tylko jedna z metod została nadpisana, co nie ma sensu w tym przypadku. Znacznik 'Bazowa. Bazowa.' to już totalny brak polimorfizmu, co zupełnie mija się z celem tego kodu. A 'Pochodna. Bazowa.' sugerowałoby, że mamy do czynienia z częściowym nadpisaniem metod, co też nie jest zgodne z tym, co mamy w kodzie.

Pytanie 20

Która z wymienionych metod może pomóc w walce z uzależnieniem od internetu?

A. Zainstalowanie większej ilości aplikacji rozrywkowych
B. Zwiększenie czasu spędzanego na mediach społecznościowych
C. Używanie komputera jedynie w nocy
D. Wprowadzenie systematycznych przerw od używania urządzeń cyfrowych
Wprowadzenie systematycznych przerw od używania urządzeń cyfrowych to bardzo skuteczna metoda radzenia sobie z uzależnieniem od internetu. Rekomendują ją zarówno psychologowie, jak i specjaliści zajmujący się zdrowiem cyfrowym. W praktyce chodzi o to, żeby regularnie robić świadome przerwy od ekranu – na przykład ustawiając sobie limity czasowe, korzystając z aplikacji blokujących dostęp do określonych stron czy ustalając z góry pory dnia bez używania urządzeń elektronicznych. Takie działania mają mocno pozytywny wpływ na samodyscyplinę i pomagają odzyskać równowagę między życiem offline a online. Zresztą, nawet w poradnikach branżowych dla informatyków czy programistów można znaleźć zalecenia dotyczące odpoczynku od komputera, bo to poprawia koncentrację oraz ogólne samopoczucie. Moim zdaniem, warto przetestować różne sposoby tych przerw – czasem wystarczy wyjść na spacer, zrobić coś rękami albo po prostu porozmawiać z kimś na żywo. Regularność w tych czynnościach naprawdę robi różnicę. A co ciekawe, technika Pomodoro, znana z produktywności, świetnie sprawdza się także tutaj – 25 minut pracy, potem 5 minut przerwy bez żadnych ekranów. Z mojego doświadczenia, takie przerwy pomagają nie tylko ograniczyć korzystanie z internetu, ale też zadbać o swój wzrok i kręgosłup, co jest ważne zwłaszcza dla osób pracujących przy komputerze.

Pytanie 21

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

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

Pytanie 22

Wskaż programowanie, w którym możliwe jest stworzenie aplikacji mobilnej dla systemu Android?

A. Swift
B. Java
C. C++
D. Obiective-C
Java jest jednym z najważniejszych języków programowania wykorzystywanych do tworzenia aplikacji mobilnych na platformę Android. Został stworzony przez firmę Sun Microsystems i obecnie jest rozwijany przez Oracle. Java jest językiem obiektowym, co oznacza, że umożliwia programistom tworzenie aplikacji w sposób modularny i zorganizowany. W kontekście Androida, Java jest podstawowym językiem, w którym bazowe API (Application Programming Interface) zostało opracowane. Wysoka wydajność, bogata biblioteka klas oraz wsparcie dla programowania wielowątkowego sprawiają, że Java jest idealnym wyborem dla deweloperów aplikacji mobilnych. Przykładowo, do stworzenia prostego interfejsu użytkownika w aplikacji Android, programista może wykorzystać takie elementy jak TextView czy Button, które są częścią frameworka Android SDK. Współczesne praktyki wskazują również na wykorzystanie Java w połączeniu z Kotlinem, co pozwala na osiągnięcie lepszych rezultatów i zwiększa efektywność w pracy nad projektami mobilnymi.

Pytanie 23

Jakie są kluczowe różnice pomiędzy strukturą (struct) a unią (union) w języku C?

A. Unia umożliwia dynamiczne przypisywanie typów danych, struktura natomiast nie
B. Struktura przechowuje wiele wartości równocześnie, unia tylko jedną
C. Unia nie jest obsługiwana przez kompilatory współczesnych języków
D. Struktura wymaga więcej miejsca w pamięci niż unia
Główna różnica między strukturą ('struct') a unią ('union') w języku C polega na sposobie przechowywania danych. Struktura przechowuje wszystkie pola jednocześnie, przydzielając każdemu z nich osobne miejsce w pamięci, natomiast unia używa wspólnej przestrzeni pamięci dla wszystkich swoich pól – w danym momencie można przechowywać tylko jedną wartość. Unia jest bardziej efektywna pod względem pamięci, ale mniej wszechstronna, ponieważ zmiana wartości jednego pola nadpisuje pozostałe. Struktury są powszechnie wykorzystywane w aplikacjach, gdzie konieczne jest przechowywanie wielu niezależnych danych, podczas gdy unie są używane do oszczędzania pamięci.

Pytanie 24

Która z poniższych nie jest prawidłową metodą zarządzania stanem w React?

A. Context API
B. Redux
C. React.stateManager
D. useState hook
Odpowiedź "React.stateManager" jest poprawna, ponieważ ta nazwa nie odnosi się do żadnej znanej metody zarządzania stanem w React. W rzeczywistości, React oferuje różne techniki do zarządzania stanem, takie jak Redux, Context API oraz hook useState. Redux to popularna biblioteka, która pozwala na centralizację stanu aplikacji, co ułatwia zarządzanie dużymi zbiorami danych oraz ich synchronizację pomiędzy komponentami. Context API umożliwia dzielenie się danymi w całej aplikacji bez konieczności przekazywania propsów przez wiele poziomów komponentów, co zwiększa czytelność i efektywność kodu. Hook useState to prosty sposób na lokalne zarządzanie stanem w komponentach funkcyjnych, co jest bardzo przydatne w przypadku prostych interakcji. Te narzędzia są zgodne z najlepszymi praktykami w branży i pomagają w tworzeniu skalowalnych oraz łatwych w utrzymaniu aplikacji.

Pytanie 25

Które z wymienionych pól klasy można zainicjalizować przed stworzeniem obiektu?

A. Prywatne pole
B. Static pole
C. Chronione pole
D. Publiczne pole
Pole statyczne można zainicjować przed utworzeniem obiektu klasy, ponieważ należy ono do samej klasy, a nie do jej instancji. Statyczne pola są inicjalizowane tylko raz, w momencie pierwszego użycia klasy lub jej statycznych metod. Dzięki temu można przechowywać dane wspólne dla wszystkich obiektów danej klasy, co jest kluczowe w optymalizacji pamięci i kodu. Przykładem może być licznik instancji klasy, który zwiększa swoją wartość za każdym razem, gdy tworzony jest nowy obiekt.

Pytanie 26

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(1)
B. O(n log n)
C. O(n)
D. O(n2)
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 27

Które z poniższych nie jest językiem programowania?

A. Kotlin
B. HTML
C. Python
D. Ruby
Wybór jednego z języków programowania takich jak Python, Ruby czy Kotlin jako odpowiedzi nie jest poprawny, ponieważ wszystkie te języki mają na celu tworzenie logiki i funkcjonalności aplikacji, a nie tylko prezentację treści. Python to wszechstronny język programowania, który znajduje zastosowanie w różnych dziedzinach, takich jak analiza danych, rozwój aplikacji webowych czy automatyzacja. Ruby, znany z eleganckiej składni, jest powszechnie używany w tworzeniu aplikacji webowych, szczególnie w ramach frameworka Ruby on Rails. Z kolei Kotlin, który stał się popularnym wyborem dla programistów Android, jest nowoczesnym językiem, który łączy cechy programowania obiektowego z funkcyjnym, co czyni go bardzo elastycznym. Typowym błędem myślowym jest mylenie języków znaczników z językami programowania, co wynika z niepełnego zrozumienia ich podstawowych funkcji. Warto pamiętać, że HTML ma za zadanie jedynie strukturę dokumentu, natomiast programowanie polega na manipulowaniu danymi oraz definiowaniu logiki działania aplikacji. Dlatego rozróżnienie między tymi kategoriami jest kluczowe w procesie nauki programowania oraz w pracy jako deweloper.

Pytanie 28

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. bąbelkowego
B. przez scalanie
C. przez zliczanie
D. kubełkowego
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 29

Jakie jest fundamentalne zagadnienie w projektowaniu aplikacji w architekturze klient-serwer?

A. Użycie serwera jako głównego miejsca przetwarzania danych
B. Funkcjonowanie aplikacji wyłącznie w trybie offline
C. Brak podziału na role klienta i serwera
D. Przeniesienie wszystkich obliczeń na stronę klienta
Brak rozróżnienia ról pomiędzy klientem a serwerem prowadzi do dezorganizacji i uniemożliwia efektywne zarządzanie danymi. Przeniesienie całości obliczeń na stronę klienta znacznie obciąża jego urządzenie, co może prowadzić do spadku wydajności i zwiększonego zużycia zasobów. Działanie aplikacji wyłącznie w trybie offline wyklucza możliwość przetwarzania danych w czasie rzeczywistym i ogranicza dostęp do aktualnych informacji, co jest sprzeczne z ideą architektury klient-serwer.

Pytanie 30

Wynik dodawania liczb binarnych 1101 i 1001 to

A. 10110
B. 1110
C. 1001
D. 10111
Bardzo często w zadaniach z dodawaniem liczb binarnych pojawiają się podobne wyniki, które wydają się poprawne na pierwszy rzut oka, ale kryją w sobie pewne pułapki. Niektórzy mylą się, bo patrzą na liczby binarne tak, jakby były dziesiętne – i wtedy np. widząc dwie jedynki na końcu, chcą je po prostu zsumować bez uwzględnienia reguł przeniesienia. Podejście, w którym wynik brzmi 1110, może wynikać z zignorowania przeniesień albo nieuwzględnienia wszystkich pozycji. Z kolei odpowiedź 10111 sugeruje, że ktoś mógł źle policzyć liczbę bitów lub źle zinterpretował przeniesienie (może dodał je do niewłaściwej pozycji). Wybór 1001 to już typowy błąd polegający na przepisaniu jednej z liczb wejściowych – czasem przez pośpiech lub nieuwagę. Takie błędy zdarzają się nawet osobom, które już trochę mają doświadczenia z binarką. W praktyce, sumowanie binarne wymaga skrupulatności: każdą kolumnę trzeba dokładnie przeanalizować, a przeniesienia wpisywać do kolejnej pozycji. To trochę jak dodawanie w podstawówce, tylko wszystko odbywa się w systemie dwójkowym. Moim zdaniem kluczową sprawą jest wyrobienie nawyku rozpisywania operacji krok po kroku, szczególnie na początku nauki. W branży elektronicznej czy informatycznej takie błędy mogą prowadzić do poważnych problemów – np. niewłaściwego działania algorytmów lub błędów w transmisji danych. Standardy, takie jak opis działania sumatorów pełnych (full adder) w układach cyfrowych, jasno wskazują na konieczność uwzględniania przeniesień i poprawnego zapisywania wyników. Moim zdaniem warto za każdym razem weryfikować swój wynik, bo nawet drobna pomyłka na tym etapie potrafi potem odbić się czkawką w dalszych obliczeniach. Sprawdzanie binarnych operacji na piechotę jest dobrym nawykiem, bo pozwala wyłapać takie typowe błędy i utrwala zrozumienie systemu dwójkowego.

Pytanie 31

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

A. Diagram Gantta
B. Harmonogram projektu
C. Backlog sprintu
D. Product backlog
Backlog sprintu zawiera jedynie zadania przypisane do aktualnego sprintu i jest podzbiorem całego backlogu produktu, co oznacza, że nie zawiera całości funkcjonalności. Diagram Gantta to narzędzie do planowania harmonogramu projektów, ale nie służy do zarządzania wymaganiami czy funkcjonalnościami produktu. Harmonogram projektu określa czas realizacji poszczególnych etapów, ale nie odnosi się do listy funkcji, jakie muszą zostać wdrożone, co jest celem backlogu.

Pytanie 32

Zamieszczony kawałek kodu w języku C# tworzy hasło. Wskaż prawdziwe stwierdzenie dotyczące cech tego hasła?

var random = new Random();
string pulaZnakow =
    "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
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. Może zawierać małe oraz wielkie litery, cyfry i znaki specjalne.
B. Ma 8 znaków lub więcej i zawiera małe oraz wielkie litery, a także cyfry.
C. Może zawierać małe i wielkie litery oraz cyfry.
D. Ma maksymalną długość 7 znaków, co ustala zmienna i.
Analizując przedstawiony fragment kodu, możemy odrzucić kilka błędnych przekonań zawartych w proponowanych odpowiedziach. Niektóre błędne odpowiedzi sugerują, że hasło może zawierać symbole. Jednak przeglądając zmienną pulaZnakow, widać, że nie zawiera ona żadnych symboli specjalnych, a jedynie małe i wielkie litery oraz cyfry. Inne niepoprawne stwierdzenie mówi, że hasło może być co najwyżej 7-znakowe z powodu zmiennej i. W rzeczywistości, zmienna i wskazuje na iterację pętli kontrolowanej przez warunek i < 8, co oznacza, że hasło jest dokładnie 8-znakowe, a nie 7-znakowe lub krótsze. Kolejna niepoprawna sugestia dotyczy tego, że hasło jest dłuższe niż 8 znaków oraz zawiera symbole, co również jest niezgodne z analizą kodu. Ważne jest, aby rozumieć, jak działają pętle i jaka jest rola zmiennych w kodzie generacji haseł. W zaawansowanych systemach zabezpieczeń często dodaje się symbole specjalne do puli znaków, jednak ten konkretny kod tego nie czyni. Dobrze jest pamiętać, że w bezpieczeństwie kluczowa jest nie tylko długość hasła, ale także jego złożoność i różnorodność użytych znaków. Prawidłowa analiza kodu pozwala uniknąć błędnych założeń i dostarcza solidnych podstaw do zrozumienia mechanizmów generacji losowych haseł.

Pytanie 33

Jakie z wymienionych narzędzi służy do testowania aplikacji?

A. Photoshop
B. Selenium
C. Git
D. WordPress
Selenium to potężne narzędzie do automatycznego testowania aplikacji webowych. Umożliwia ono symulowanie działań użytkownika na stronie internetowej, takich jak klikanie przycisków, wypełnianie formularzy czy nawigowanie po witrynie. Dzięki Selenium programiści mogą automatyzować testy funkcjonalne i regresyjne, co pozwala na szybkie wykrywanie błędów i sprawdzanie zgodności aplikacji z wymaganiami. Selenium obsługuje wiele języków programowania, takich jak Python, Java, C# czy JavaScript, co czyni je wszechstronnym narzędziem do testowania aplikacji webowych na różnych platformach i przeglądarkach. Jest to jedno z najważniejszych narzędzi w arsenale testerów oprogramowania i deweloperów dbających o jakość swoich produktów.

Pytanie 34

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

A. Klasa pochodna może dziedziczyć po wielu klasach bazowych.
B. Java nie wspiera dziedziczenia.
C. Klasa pochodna dziedziczy po jednej klasie bazowej.
D. Dziedziczenie jest niezalecane w języku Java.
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 35

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. Dokładne wytyczne dotyczące realizacji kodu
D. Strategia wdrożenia aplikacji w środowisku produkcyjnym
Szczegółowe instrukcje dotyczące implementacji kodu to element dokumentacji technicznej dla deweloperów, a nie część scenariusza testowego. Dokumentacja techniczna aplikacji opisuje architekturę, interfejsy API oraz szczegóły implementacyjne, ale nie dostarcza informacji na temat testów. Plan wdrożenia aplikacji dotyczy przenoszenia oprogramowania na środowisko produkcyjne i zarządzania etapami tego procesu, co jest istotne po zakończeniu testów, a nie w trakcie ich przygotowania.

Pytanie 36

Który z wymienionych algorytmów sortowania jest najskuteczniejszy w przypadku dużych zbiorów danych w przeważającej liczbie sytuacji?

A. Sortowanie przez wstawianie
B. Sortowanie bąbelkowe
C. Sortowanie przez zliczanie
D. Sortowanie szybkie (QuickSort)
QuickSort to algorytm sortowania, który jest najbardziej efektywny dla dużych zbiorów danych, osiągając średnią złożoność obliczeniową O(n log n). Wykorzystuje strategię 'dziel i zwyciężaj', co pozwala na szybkie podzielenie tablicy na mniejsze części wokół elementu zwanego pivotem. Dzięki temu QuickSort jest wyjątkowo szybki, nawet w przypadku dużych i losowo rozłożonych zbiorów danych. Jego zaletą jest niskie zużycie pamięci oraz możliwość sortowania w miejscu (in-place), co oznacza, że nie wymaga dodatkowej przestrzeni poza rekurencyjnym stosowaniem wywołań. Algorytm ten jest szeroko stosowany w aplikacjach bazodanowych, systemach operacyjnych i analizie danych.

Pytanie 37

Algorytmu Euklidesa, przedstawionego na schemacie, należy użyć do obliczenia.

Ilustracja do pytania
A. Największego Wspólnego Dzielnika
B. największego elementu w zbiorze liczb
C. Najmniejszej Wspólnej Wielokrotności
D. najmniejszej liczby pierwszej w danym zakresie
Największy element zbioru liczb to zagadnienie, które nie ma związku z algorytmem Euklidesa. Wymaga to raczej prostego przeszukania zbioru, niż stosowania algorytmu opierającego się na operacjach arytmetycznych na dwóch liczbach. Z kolei najmniejsza liczba pierwsza w przedziale wymaga zastosowania zupełnie innych technik, jak na przykład sita Eratostenesa, które pozwala na znalezienie wszystkich liczb pierwszych mniejszych od określonej wartości. Algorytm Euklidesa nie jest w tym przypadku użyteczny, gdyż nie zajmuje się on pojęciem liczby pierwszej. Najmniejsza Wspólna Wielokrotność (NWW) to zagadnienie, które choć związane z NWD, wymaga innego podejścia. NWW można obliczyć mając już wyznaczony NWD dwóch liczb, korzystając ze wzoru NWW(a, b) = (a * b) / NWD(a, b). Dlatego algorytm Euklidesa może być pomocnym narzędziem w obliczaniu NWW, ale sam w sobie nie jest przeznaczony do bezpośredniego jej wyznaczania. Typowym błędem jest myślenie, że algorytmy matematyczne mają bardziej uniwersalne zastosowanie niż w rzeczywistości, co prowadzi do niewłaściwego użycia takich narzędzi. Algorytm Euklidesa jest wysoce wyspecjalizowany, dlatego warto zrozumieć jego ograniczenia i specyficzne zastosowania w kontekście matematyki i inżynierii komputerowej.

Pytanie 38

W dwóch przypadkach opisano mechanizm znany jako Binding. Jego celem jest

W Android Studio:
<TextView android:text="@{viewmodel.userName}" />
W XAML:
<Label Text="{Binding Source={x:Reference slider2}, Path=Value}" />
A. przetwarzanie zdarzeń kontrolek interfejsu użytkownika przez wywoływanie odpowiednich funkcji
B. wiązanie oraz eksportowanie plików z różnych modułów aplikacji
C. wiązać właściwości (property) elementu interfejsu użytkownika z danymi lub właściwością innego obiektu
D. zarządzanie mechanizmem obietnic (promises) lub obserwatora (observable) w programowaniu asynchronicznym
Bardzo często można natknąć się na nieporozumienia dotyczące roli mechanizmu binding w nowoczesnych aplikacjach. Wiele osób błędnie utożsamia binding z obsługą zdarzeń, czyli na przykład automatycznym wywoływaniem funkcji po kliknięciu przycisku czy zmianie wartości na jakimś polu. Owszem, w interfejsach użytkownika obsługa zdarzeń jest istotna, ale binding to zupełnie inny poziom – on „przyczepia” dane (np. wartość liczbową, tekst, stan checkboxa) do właściwości elementów UI, tak by zmiana w jednym miejscu od razu aktualizowała drugie. Drugim typowym błędem jest mylenie bindingu z mechanizmami programowania asynchronicznego, jak promises czy observable – to trochę inna bajka. Promisy służą do obsługi operacji asynchronicznych, np. pobierania danych z sieci, a obserwatory pozwalają reagować na strumienie zdarzeń, jednak sam binding nie jest tym samym i nie odpowiada bezpośrednio za asynchroniczne zarządzanie danymi. Kolejnym nieporozumieniem bywa traktowanie bindingu jako coś związanego z eksportowaniem plików czy ogólnie zarządzaniem modułami aplikacji – to już w ogóle inny obszar, bardziej związany z organizacją środowiska, budowaniem aplikacji czy strukturą projektów. Z mojego doświadczenia wynika, że takie pomieszanie pojęć wynika głównie z powierzchownego poznania frameworków i chęci uproszczenia sobie obrazu działania aplikacji. Binding to fundament nowoczesnych interfejsów, ale nie zastępuje ani obsługi zdarzeń, ani nie jest narzędziem do zarządzania plikami czy asynchronicznością. On po prostu pozwala utrzymać spójność pomiędzy warstwą logiki a widokiem, co w praktyce czyni kod mniej podatnym na błędy i bardziej „żywym”, reagującym na zmiany.

Pytanie 39

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. Bezpieczeństwa
C. Wydajnościowe
D. Interfejsu
Testy jednostkowe, choć niezwykle ważne, koncentrują się na weryfikacji małych fragmentów kodu, zwykle pojedynczych funkcji lub metod. Mają one na celu upewnienie się, że każdy komponent działa zgodnie z oczekiwaniami. W kontekście pytania, które odnosi się do mierzenia czasu logowania i wydajności pod obciążeniem, testy jednostkowe nie są odpowiednie, ponieważ nie sprawdzają, jak system radzi sobie z różnym obciążeniem. Testy interfejsu koncentrują się na sprawdzaniu, czy użytkownik może wchodzić w interakcje z systemem w sposób intuicyjny i bezbłędny. Nie dotyczą jednak aspektów wydajnościowych, takich jak czas renderowania czy czas logowania przy dużym obciążeniu. Z kolei testy bezpieczeństwa są niezbędne do identyfikacji luk w systemie, które mogłyby być wykorzystane przez atakujących. Skupiają się na takich aspektach jak kontrola dostępu, ochrona danych i odporność na ataki typu DDoS. W pytaniu jednak nie ma odniesienia do kwestii bezpieczeństwa, takich jak czy system jest odporny na eskalację uprawnień czy ataki typu SQL Injection. Często błędnie myśli się, że wystarczy sprawdzić podstawowe funkcje aplikacji, ignorując, jak zachowuje się ona pod obciążeniem, co jest krytycznym aspektem jej rzeczywistej użyteczności w środowisku produkcyjnym. Aby zapewnić pełną jakość aplikacji, konieczne jest przeprowadzanie wszystkich typów testów odpowiednio do ich celu, ale w kontekście pytania tylko testy wydajnościowe bezpośrednio odnoszą się do przedstawionych zagadnień związanych z czasem odpowiedzi i obciążeniem systemowym.

Pytanie 40

Tworząc aplikację opartą na obiektach, należy założyć, że program będzie zarządzany przez

A. definicję warunków końcowego rozwiązania
B. zbiór instancji klas współpracujących ze sobą
C. moduły zawierające funkcje oraz zmienne globalne
D. pętlę dyspozytora, która w zależności od zdarzenia wywoła właściwą funkcję
Często spotykam się z przekonaniem, że budowanie programów opartych na modułach z funkcjami i zmiennymi globalnymi jest wystarczające, zwłaszcza w mniejszych projektach. Jednak takie podejście prowadzi do dużej trudności w utrzymaniu i rozwoju aplikacji, szczególnie gdy program zaczyna rosnąć. Globalne zmienne powodują tzw. efekt uboczny – nie wiadomo gdzie i kiedy ich stan się zmienia, co niesamowicie utrudnia debugowanie i wprowadzanie nowych funkcjonalności. Pętle dyspozytora i reakcja na zdarzenia to raczej domena programowania proceduralnego lub prostych systemów sterowania, ale nie oddają istoty programowania obiektowego – tu nie chodzi o centralne zarządzanie funkcjami, tylko o to, żeby obiekty same wiedziały, jak mają na siebie reagować. Zdarza mi się widzieć takie podejście w starszych aplikacjach, gdzie cała logika mieści się w jednym dużym pliku z wielką pętlą i masą instrukcji warunkowych – naprawdę trudno takie rozwiązania rozwijać bez wpadania w spaghetti code. Co do definicji warunków końcowych jako sposobu zarządzania programem, to jest to raczej element algorytmiki, a nie struktury aplikacji obiektowej. Moim zdaniem takie myślenie wynika z braku zrozumienia, jak ważna jest modularność i enkapsulacja w programowaniu obiektowym. Branżowe standardy (np. SOLID, DRY) podkreślają, że kod dobrze podzielony na obiekty i odpowiedzialności minimalizuje błędy i pozwala łatwo rozbudowywać aplikacje. Wspólna praca wielu instancji klas, każdej z jasno zdefiniowaną rolą, pozwala na tworzenie dużo bardziej elastycznych i odpornych na zmiany systemów. Jeśli ktoś nadal opiera projekt na globalnych zmiennych czy centralnej pętli, to prędzej czy później napotka na ścianę komplikacji, której można łatwo uniknąć, stosując paradygmat obiektowy.