Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 3 maja 2026 21:14
  • Data zakończenia: 3 maja 2026 21:33

Egzamin zdany!

Wynik: 27/40 punktów (67,5%)

Wymagane minimum: 20 punktów (50%)

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

Jakie narzędzie najlepiej wykorzystać do testowania API REST?

A. Selenium
B. Jasmine
C. Postman
D. Git
Postman to jedno z najpopularniejszych narzędzi do testowania API REST, które oferuje wiele funkcji ułatwiających pracę z interfejsami programistycznymi. Jego intuicyjny interfejs użytkownika pozwala na łatwe wysyłanie zapytań HTTP, takich jak GET, POST, PUT, DELETE, co jest kluczowe w testowaniu API. Dzięki wsparciu dla kolekcji zapytań, użytkownicy mogą organizować i grupować swoje testy, co ułatwia zarządzanie projektem i iteracyjne testowanie. Ponadto, Postman umożliwia automatyzację testów poprzez skrypty testowe, które można uruchomić po wykonaniu zapytania, co pozwala na szybką weryfikację odpowiedzi API i ich zgodności z oczekiwaniami. Narzędzie wspiera także integracje z CI/CD, co czyni je idealnym dla zespołów pracujących w metodykach Agile. Postman jest zgodny z najlepszymi praktykami branżowymi, takimi jak RESTful API design, co czyni go niezbędnym w każdym projekcie wykorzystującym API.

Pytanie 2

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

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

Pytanie 3

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

int x = 5;
int y = 10;
Console.WriteLine($"Suma {x} i {y} wynosi {x + y}");
A. Error: niewłaściwa składnia
B. Suma 5 i 10 wynosi x + y
C. Suma x i y wynosi 15
D. Suma 5 i 10 wynosi 15
Kod w języku C# wykonuje operację dodawania dwóch zmiennych, x i y, oraz wyświetla wynik w sformatowanym ciągu tekstowym. Poprawna odpowiedź to 'Suma 5 i 10 wynosi 15', ponieważ zmienna x ma wartość 5, a zmienna y ma wartość 10. Kiedy dodajemy te dwie liczby, otrzymujemy 15. Warto zwrócić uwagę na wykorzystanie interpolacji ciągów, co jest istotnym elementem w nowoczesnym C#. Umożliwia to w prosty sposób łączyć tekst z wartościami zmiennych, co zwiększa czytelność kodu. Interpolacja jest szczególnie przydatna w kontekście generowania komunikatów użytkownika i raportów. Przykład zastosowania może obejmować aplikacje, które prezentują wyniki obliczeń lub statystyki, gdzie ważne jest, aby w przyjazny sposób przedstawiać dane. Dobre praktyki programistyczne sugerują, aby unikać twardego kodowania wartości zamiast tego używać zmiennych, co ułatwia późniejsze modyfikacje i utrzymanie kodu.

Pytanie 4

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

b = a++;
Zapis drugi:
b = ++a;
A. Bez względu na zastosowany sposób, w zmiennej b zawsze uzyskamy ten sam rezultat.
B. Wartość zmiennej b będzie wyższa po użyciu drugiego zapisu w porównaniu do pierwszego.
C. Drugi zapis nie jest zgodny ze składnią, co doprowadzi do błędów kompilacji.
D. Tylko przy użyciu pierwszego zapisu zmienna a zostanie zwiększona o 1.
W językach programowania z rodziny C (w tym C++ i Java) istnieją dwie formy inkrementacji: preinkrementacja (++x) i postinkrementacja (x++). Preinkrementacja zwiększa wartość zmiennej przed jej użyciem w wyrażeniu, natomiast postinkrementacja zwiększa ją dopiero po zakończeniu aktualnej operacji. Oznacza to, że w przypadku postinkrementacji, wartość zmiennej przed zwiększeniem zostanie użyta w bieżącym wyrażeniu, a dopiero potem następuje jej zwiększenie o 1. Ta subtelna różnica ma istotne znaczenie, zwłaszcza w pętlach i wyrażeniach logicznych, gdzie każda iteracja wpływa na wynik. W praktyce preinkrementacja jest nieco bardziej efektywna, ponieważ nie wymaga przechowywania kopii pierwotnej wartości zmiennej, co przekłada się na minimalnie lepszą wydajność w niektórych przypadkach.

Pytanie 5

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

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

Pytanie 6

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

A. RAD koncentruje się tylko na testowaniu programów
B. RAD pozwala na szybkie tworzenie prototypów i rozwijanie aplikacji przy minimalnej ilości kodu
C. RAD nie oferuje żadnych narzędzi do debugowania
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 7

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

A. 00000101
B. 11111101
C. 10000101
D. 11111011
Pierwsza z niepoprawnych odpowiedzi, która przedstawia wartość 00000101, jest błędna, ponieważ jest to binarna reprezentacja liczby 5, a nie -5. Kod uzupełnieniowy do dwóch wymaga przedstawienia liczby ujemnej poprzez inwersję bitów i dodanie jedynki. Ta odpowiedź nie ma zastosowania przy obliczaniu liczb ujemnych, stąd jest niewłaściwa. Kolejna odpowiedź, 11111101, również jest nieprawidłowa. W przypadku tej liczby, zainwersowanie bitów liczby 5 dawałoby 11111010, a dodanie 1 do tej wartości prowadziłoby do 11111011, co wskazuje, że ta odpowiedź nie jest zgodna z zasadą uzupełnienia do dwóch. Ostatnia z niepoprawnych odpowiedzi, 10000101, jest również błędna, ponieważ nie odpowiada żadnej z reprezentacji liczby -5. Gdybyśmy spróbowali konwertować ją z powrotem na wartość dziesiętną, otrzymalibyśmy 133, co jest zdecydowanie niepoprawne. Warto zauważyć, że każda z tych niepoprawnych odpowiedzi wskazuje na brak zrozumienia zasad konwersji liczb ujemnych w systemie binarnym, co jest kluczowe w informatyce i programowaniu, a ich użycie w praktycznych aplikacjach mogłoby prowadzić do poważnych błędów w obliczeniach.

Pytanie 8

Przedstawione w filmie działania wykorzystują narzędzie

A. generatora GUI przekształcającego kod do języka XAML
B. kompilatora dla interfejsu graficznego
C. debuggera analizującego wykonujący kod
D. generatora kodu java
Patrząc na wszystkie dostępne opcje, łatwo się pomylić, bo terminologia może być trochę podchwytliwa. Debugger analizujący wykonujący kod rzeczywiście jest kluczowym narzędziem w pracy programisty, ale jego zadaniem jest szukanie błędów i obserwowanie działania programu w czasie rzeczywistym, a nie generowanie kodu czy interfejsów. Myślę, że sporo osób utożsamia narzędzia developerskie z debuggerem, bo to jedno z najczęściej używanych rozwiązań – jednak tutaj akurat nie ma on nic wspólnego z przekształcaniem kodu do XAML-a. Generator kodu Java brzmi sensownie, jeśli ktoś pracuje więcej w środowiskach Javy, ale w tym przypadku mówimy o ekosystemie .NET i XAML-u, a Java ma zupełnie inne formaty i narzędzia (np. FXML dla JavaFX, ale to zupełnie inna bajka). Generator GUI przekształcający kod do języka XAML to narzędzie dedykowane platformie Microsoftu, bo XAML funkcjonuje właśnie w tych technologiach. Ostatnia odpowiedź, czyli kompilator dla interfejsu graficznego, to trochę pomieszanie pojęć – kompilator rzeczywiście tłumaczy kod na wykonywalny plik (np. EXE), ale nie jest narzędziem służącym do generowania czy przekształcania opisów interfejsów graficznych. Sporo osób może mieć tendencję do mylenia generatorów z kompilatorami, bo oba „tworzą coś automatycznie”, ale ich przeznaczenie jest zupełnie inne. Moim zdaniem najważniejsze to rozumieć, że generatory GUI ułatwiają życie, pozwalając szybko przenieść projekt interfejsu do kodu XAML, a reszta narzędzi ma zupełnie inne zadania. To rozróżnienie jest naprawdę kluczowe w branży.

Pytanie 9

Metoda tworzenia algorytmu polegająca na dzieleniu go na dwa lub więcej mniejszych podproblemów, aż do momentu, gdy ich rozwiązanie stanie się proste, jest techniką

A. dziel i zwyciężaj
B. komiwojażera
C. najkrótszej ścieżki
D. heurystyczną
Strategia znana jako 'dziel i zwyciężaj' to sposób, w jaki można podejść do rozwiązywania problemów w algorytmice. Chodzi o to, żeby rozdzielić większy problem na mniejsze kawałki, które są już łatwiejsze do ogarnięcia. Robimy to, aż każdy z tych kawałków da się rozwiązać bez większego trudu. Jak już mamy rozwiązania tych mniejszych problemów, to je łączymy, żeby uzyskać odpowiedź na nasz pierwotny problem. Przykłady? No to mamy algorytm sortowania szybkiego (Quicksort) oraz Mergesort, które świetnie sobie radzą z porządkowaniem danych, dzieląc je na mniejsze części. Jak patrzy się na to z perspektywy analizy algorytmów, to ta strategia często prowadzi do lepszej złożoności obliczeniowej, co sprawia, że jest naprawdę przydatna w praktyce, zwłaszcza w informatyce. W książce Cormena i innych, 'Introduction to Algorithms', można znaleźć sporo informacji na temat tych metod i ich zastosowań, co czyni je naprawdę istotnymi w obszarze programowania i analizy danych.

Pytanie 10

Aby tworzyć aplikacje desktopowe w języku Java, można wybrać jedno z poniższych środowisk

A. NetBeans
B. PyCharm
C. Ms Visual Studio
D. SharpDevelop
Odpowiedzi, które nie wskazują NetBeansa, świadczą o pewnym niezrozumieniu specyfiki narzędzi programistycznych dedykowanych różnym językom i platformom. SharpDevelop to środowisko przeznaczone głównie do programowania w językach z rodziny .NET, takich jak C# czy VB.NET – sam używałem go kiedyś do nauki Windows Forms i pamiętam, że Java w nim po prostu nie ruszy. PyCharm z kolei jest bardzo wygodny dla deweloperów Pythona, szczególnie przy projektach webowych i automatyzacji, jednak nawet nie obsługuje Javy, a już na pewno nie posiada żadnych narzędzi do budowy desktopowych GUI w tym języku. Visual Studio natomiast jest wręcz flagowym rozwiązaniem Microsoftu dla C#, C++ oraz aplikacji .NET – owszem, daje rewelacyjne możliwości dla aplikacji okienkowych, zwłaszcza pod Windows, ale dla Javy wsparcie jest praktycznie zerowe albo bardzo ograniczone przez zewnętrzne wtyczki, które i tak nie zapewniają pełnej integracji. Typowym problemem jest tu mylenie pojęcia środowiska programistycznego z uniwersalnością języków – niestety, nie każde IDE nadaje się do każdego języka i nie każde posiada narzędzia do projektowania GUI właśnie w tym konkretnym ekosystemie. Branżowe dobre praktyki zalecają, aby zawsze dobierać środowisko pod konkretny język i platformę, bo tylko wtedy można w pełni wykorzystać możliwości narzędzi, bibliotek i automatyzacji. W przypadku Javy, praktycznie wszyscy doświadczeni programiści desktopowi korzystają z NetBeansa, Eclipse lub IntelliJ IDEA, bo tylko te IDE mają pełne wsparcie dla projektów typu Swing, JavaFX czy AWT. Warto pamiętać, że próby tworzenia desktopowych aplikacji w Javie przy użyciu narzędzi przeznaczonych do innych języków zwykle kończą się na niepotrzebnych komplikacjach i traceniu czasu na obejścia oraz konfigurowanie środowiska, które po prostu nie jest do tego stworzone. To jeden z tych przypadków, gdzie wybór odpowiedniego narzędzia ma naprawdę duży wpływ na efektywność i jakość pracy.

Pytanie 11

Cytat przedstawia charakterystykę metodyki RAD. Pełne znaczenie tego skrótu można przetłumaczyć na język polski jako:

...(RAD)..., is both a general term for adaptive software development approaches, and the name for James Martin's method of rapid development.

In general, RAD approaches to software development put less emphasis on planning and more emphasis on an adaptive process. Prototypes are often used in addition to or sometimes even instead of design specifications.

Źródło: https://en.wikipedia.org/

A. zintegrowane środowisko programistyczne
B. prototypowanie wsparte testami jednostkowymi
C. środowisko refaktoryzacji aplikacji
D. środowisko szybkiego rozwoju aplikacji
RAD, czyli Rapid Application Development, tłumaczy się na polski najczęściej jako „środowisko szybkiego rozwoju aplikacji” albo „metodyka szybkiego wytwarzania oprogramowania”. To podejście stawia na błyskawiczne prototypowanie i szybkie iteracje zamiast długiego, formalnego planowania. Bardziej niż na dokumentacji, skupia się na tworzeniu działających wersji aplikacji, które można testować i na bieżąco modyfikować zgodnie z tym, czego oczekuje klient lub zespół użytkowników. W praktyce, przykładowy projekt w RAD to np. budowa aplikacji, gdzie klient dostaje wstępny prototyp po tygodniu, a nie po miesiącu – i od razu może zgłaszać uwagi. Bardzo często stosuje się narzędzia typu CASE (Computer-Aided Software Engineering), które pozwalają szybko generować kod i prototypy GUI bez żmudnego pisania wszystkiego od zera. W świecie profesjonalnych firm IT, RAD jest chętnie wykorzystywany, kiedy czas wdrożenia jest kluczowy, na przykład w startupach, które muszą szybko przetestować swój pomysł rynkowy. Moim zdaniem, nawet jeśli nie wszystkie projekty się do tego nadają, to znajomość RAD jest bardzo przydatna dla każdego programisty – pozwala lepiej zrozumieć, jak można pracować zwinnie i elastycznie, bez zbędnego formalizmu. RAD to nie tylko metodyka, ale też praktyczny styl myślenia o aplikacjach – szybciej, więcej, elastyczniej. Warto się tym zainteresować, szczególnie jeśli komuś zależy na czasie i wczesnych efektach pracy.

Pytanie 12

Które z poniższych NIE jest typem wartości zwracanej przez funkcję w języku JavaScript?

A. Undefined
B. Method
C. Number
D. Object
Wybór odpowiedzi związanej z 'Method' jako typem wartości zwracanej przez funkcję w JavaScript może wynikać z nieporozumienia dotyczącego różnicy pomiędzy funkcją a metodą. Warto wiedzieć, że w JavaScript funkcje są obiektami pierwszej klasy, co oznacza, że mogą być przypisywane do zmiennych, przekazywane jako argumenty oraz zwracane z innych funkcji. Wśród typów wartości, które mogą być zwracane przez funkcje, znajdują się obiekty, liczby, stringi oraz typ undefined, co jest wynikiem zachowań typowych dla tego języka. Kiedy funkcja nie zwraca żadnej wartości, domyślnie zwraca undefined. Typowe błędy myślowe pojawiają się, gdy programiści mylą koncepcje funkcji i metod lub mylą pojęcia typów danych. Często mogą założyć, że metoda jest równoważna typowi zwracanemu, co nie jest zgodne z definicjami w programowaniu obiektowym. Obiekt w JavaScript może mieć wiele metod, które są funkcjami, ale to nie czyni metody typem zwracanym. Przykładem tego może być zdefiniowanie obiektu z wieloma funkcjami, które działają na jego danych. To jasno pokazuje, że metody są połączeniem funkcji z obiektami, a nie typami wartości. Ważne jest, aby podczas nauki języka JavaScript skupić się na zrozumieniu struktury języka oraz jego zasad, co pomoże unikać zamieszania związanych z terminologią oraz zastosowaniem tych koncepcji w praktyce.

Pytanie 13

Który z poniższych jest popularnym systemem zarządzania bazami danych NoSQL?

A. MongoDB
B. Oracle
C. PostgreSQL
D. MySQL
MongoDB to jeden z najbardziej popularnych systemów zarządzania bazami danych NoSQL, który został zaprojektowany z myślą o elastyczności, skalowalności i prostocie użytkowania. W odróżnieniu od tradycyjnych baz danych SQL, MongoDB przechowuje dane w formacie dokumentów BSON, co umożliwia łatwą integrację z danymi o zmiennej strukturze. Dzięki temu programiści mogą szybko prototypować aplikacje i wprowadzać zmiany w modelu danych bez konieczności przeprowadzania skomplikowanych migracji schematów. MongoDB znajduje zastosowanie w wielu nowoczesnych aplikacjach, od startupów po duże przedsiębiorstwa, w takich dziedzinach jak analiza danych, zarządzanie treścią, czy aplikacje mobilne. W praktyce, dzięki rozproszonej architekturze, możliwe jest łatwe skalowanie poziome, co oznacza dodawanie nowych instancji bazy danych w miarę rosnących potrzeb. Warto również zwrócić uwagę na bogate wsparcie dla technologii chmurowych oraz ekosystem narzędzi analitycznych, co czyni MongoDB świetnym wyborem dla aplikacji wymagających dużej wydajności i elastyczności.

Pytanie 14

Które z wymienionych praw autorskich nie wygasa po pewnym czasie?

A. Prawa pokrewne
B. Autorskie prawa majątkowe
C. Licencje wolnego oprogramowania
D. Autorskie prawa osobiste
Autorskie prawa osobiste to rodzaj praw autorskich, które nie wygasają po upływie określonego czasu i są bezterminowe. Obejmują one prawo do autorstwa, oznaczania dzieła swoim nazwiskiem oraz sprzeciwiania się wszelkim zmianom, które mogłyby naruszać reputację twórcy. Prawa osobiste są niezbywalne, co oznacza, że nie można ich przenieść na inną osobę ani sprzedać. Nawet po śmierci twórcy, prawo do ochrony integralności jego dzieła jest respektowane. W praktyce oznacza to, że choć prawa majątkowe mogą wygasnąć (np. po 70 latach od śmierci autora), prawo do bycia uznanym za twórcę trwa wiecznie.

Pytanie 15

Który z poniższych składników NIE jest konieczny do stworzenia klasy w C++?

A. Definicja funkcji członkowskich klasy
B. Zastosowanie słowa kluczowego class
C. Deklaracja atrybutów klasy
D. Definicja destruktora
Do utworzenia klasy w C++ nie jest wymagana definicja destruktora. Destruktor to specjalna metoda klasy, która jest wywoływana automatycznie w momencie zniszczenia obiektu, ale jego obecność jest opcjonalna. Klasy, które nie operują bezpośrednio na zasobach zewnętrznych, takich jak dynamiczna pamięć lub pliki, często nie potrzebują destruktora, ponieważ domyślny destruktor generowany przez kompilator jest wystarczający. Aby utworzyć klasę, wystarczy deklaracja pól i metod oraz użycie słowa kluczowego 'class'. To sprawia, że C++ pozwala na szybkie definiowanie prostych klas, które można później rozwijać w miarę potrzeby.

Pytanie 16

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

A. Funkcjonowanie aplikacji wyłącznie w trybie offline
B. Brak podziału na role klienta i serwera
C. Przeniesienie wszystkich obliczeń na stronę klienta
D. Użycie serwera jako głównego miejsca przetwarzania danych
Użycie serwera jako centralnego miejsca przetwarzania danych jest kluczowym elementem architektury klient-serwer. Serwer pełni rolę centralnego punktu, który zarządza żądaniami klientów, przechowuje dane i zapewnia odpowiedzi na zapytania. Taki model zapewnia większe bezpieczeństwo danych, ułatwia zarządzanie zasobami i umożliwia skalowanie aplikacji w miarę wzrostu liczby użytkowników. Architektura klient-serwer jest szeroko stosowana w aplikacjach webowych, systemach bankowych oraz usługach chmurowych, gdzie konieczna jest centralizacja danych i ich ochrona.

Pytanie 17

Co należy do zadań interpretera?

A. wykonanie skryptu instrukcja po instrukcji
B. sprawdzanie składni całego programu przed jego uruchomieniem
C. ulepszanie większej części kodu, aby przyspieszyć jego wykonanie
D. przekładanie kodu na kod maszynowy
Często spotykam się z myleniem interpretera z kompilatorem i optymalizatorami kodu, co prowadzi do błędnych wyobrażeń o jego działaniu. Zacznijmy od podstaw: przekładanie kodu źródłowego na kod maszynowy to domena kompilatorów, które analizują cały program, optymalizują go i generują plik wykonywalny, który można uruchomić niezależnie od środowiska. Interpreter natomiast nie zajmuje się takim tłumaczeniem, tylko odczytuje kod i wykonuje go na bieżąco, bez zapisywania gotowego programu w formie binarnej. Kolejna kwestia to ulepszanie kodu w celu przyspieszenia jego wykonania – to zadanie specjalistycznych narzędzi optymalizujących, często wbudowanych w kompilatory. Interpreter rzadko kiedy ingeruje w optymalizację kodu, bo jego głównym zadaniem jest wierne odtworzenie logiki programu krok po kroku, a nie poprawianie jego wydajności. Jeżeli chodzi o sprawdzanie składni całego programu przed uruchomieniem, to znów domena kompilatorów – interpreter najczęściej wykrywa błędy dopiero w momencie, gdy dociera do konkretnej instrukcji podczas wykonywania skryptu. To właśnie sprawia, że łatwiej eksperymentować, ale też czasem trudniej jest znaleźć błędy, które ujawniają się dopiero w trakcie działania aplikacji. W mojej ocenie te nieporozumienia wynikają z utożsamiania terminów używanych w teorii kompilacji – warto rozróżniać narzędzia na podstawie ich faktycznej roli w cyklu życia programu. Praktyka pokazuje, że zrozumienie różnicy pomiędzy interpretacją a kompilacją jest kluczowe przy wyborze technologii do realizacji konkretnego projektu. Jeżeli zależy nam na szybkim prototypowaniu lub pracy z kodem interaktywnym – interpreter jest świetny, ale nie będzie generował kodu maszynowego ani zaawansowanie go optymalizował.

Pytanie 18

Podaj wspólną cechę wszystkich kontrolek umieszczonych w ramce

<Label Text="5" BackgroundColor="Blue" TextColor="Tan" isVisible="True" />
<Stepper BackgroundColor="Blue" Value="5" isVisible="True" />
<Entry TextColor="Tan" BackgroundColor="Blue" Placeholder="5" />
<Slider ThumbColor="Tan" BackgroundColor="Blue" Value="5" isVisible="False" />
A. wszystkie są widoczne
B. mają tło w tym samym kolorze
C. są w nich ustawione te same wartości domyślne
D. mają identyczny kolor czcionki
W tym przypadku wskazałeś/aś, że wszystkie kontrolki mają tło w tym samym kolorze, i to jest faktycznie prawidłowa odpowiedź. Gdy spojrzymy na definicje: Label ma BackgroundColor="Blue", Stepper także BackgroundColor="Blue", Entry również BackgroundColor="Blue", a Slider—no właśnie—też BackgroundColor="Blue". To pokazuje, że niezależnie od typu kontrolki, wszystkie mają ustawione tło na dokładnie ten sam kolor. W praktyce bardzo często spotyka się wymóg zachowania spójności wizualnej interfejsu, szczególnie w aplikacjach profesjonalnych czy korporacyjnych. Ustalanie wspólnego BackgroundColor jest jednym z najprostszych kroków ku temu, by UI wyglądało porządnie i było czytelne dla użytkownika końcowego. Moim zdaniem, kiedy projektuje się cały ekran lub jakąś sekcję UI, warto od razu narzucić style lub korzystać z szablonów (np. Styles w XAML czy resourcach), żeby uniknąć przypadkowych rozbieżności kolorystycznych, które potem tylko irytują i programistów, i użytkowników. W branży jest to uznawane za dobrą praktykę – jednolity background ułatwia szybkie ogarnięcie, które elementy należą do jednej grupy funkcjonalnej. Poza tym, kolor tła bywa często wykorzystywany do komunikowania stanu albo priorytetu (np. alerty na czerwono itp.), więc to naprawdę ważne, żeby takie detale były przemyślane i konsekwentnie stosowane. No i jeszcze taka ciekawostka: nie wszystkie kontrolki domyślnie wyświetlają tło, więc czasem trzeba to jawnie ustawić, żeby efekt był taki sam na każdej platformie.

Pytanie 19

Jakie funkcje realizuje polecenie "git clone"?

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

Pytanie 20

Zaprezentowany diagram Gantta odnosi się do projektu IT. Przy założeniu, że każdy członek zespołu dysponuje wystarczającymi umiejętnościami do realizacji każdego z zadań oraz że do każdego zadania można przypisać jedynie jedną osobę, która poświęci na zadanie pełny dzień pracy, to minimalna liczba członków zespołu powinna wynosić:

Ilustracja do pytania
A. 2 osoby
B. 4 osoby
C. 5 osób
D. 1 osobę
Dość często spotykaną trudnością przy analizie wykresów Gantta jest tendencja do przeceniania liczby potrzebnych zasobów – czyli członków zespołu projektowego. Wiele osób zakłada, że suma wszystkich zadań lub nawet liczba wszystkich pozycji w harmonogramie musi się równać liczbie osób, co prowadzi do zawyżonych szacunków i niepotrzebnego rozrostu zespołu. Jednak w praktyce, zgodnie ze standardami zarządzania projektami, np. PMBOK, kluczowe jest maksymalne wykorzystywanie dostępnych kompetencji przez analizę nakładania się zadań. W zadanym przykładzie w żadnym tygodniu nie występuje potrzeba pracy większej liczby osób niż dwie, nawet jeśli na pierwszy rzut oka wydaje się, że pojedyncze zadania wymagają osobnych osób w każdym okresie. Częstym błędem jest nieuwzględnianie faktu, że zadania rozkładają się w czasie i rzadko kiedy wszystkie są realizowane jednocześnie. Zakładanie potrzeby pięciu czy czterech osób wynika zwykle z przekonania, że lepiej „dmuchać na zimne”, ale to prowadzi do nieefektywności i sztucznego zwiększania kosztów – coś, czego w projektach IT bardzo się unika. W praktyce, menedżerowie zawsze starają się dobrać skład zespołu tak, by liczba osób odpowiadała rzeczywistemu zapotrzebowaniu w najbardziej wymagającym okresie, a nie przez cały czas trwania projektu. Z drugiej strony, typowym błędem jest też zbyt optymistyczne założenie, że wystarczy jedna osoba, bo wtedy niektóre zadania musiałby czekać w kolejce, co wydłuża całość projektu. Podsumowując, precyzyjna analiza wykresu Gantta pozwala na optymalizację zasobów i jest kluczową umiejętnością w zarządzaniu zespołami IT – zarówno z punktu widzenia efektywności, jak i kosztów czy terminowości wykonania zlecenia.

Pytanie 21

Jaki framework umożliwia tworzenie interaktywnych interfejsów użytkownika w języku TypeScript?

A. jQuery
B. Django
C. ASP.NET Core
D. Angular
Django to framework backendowy dla języka Python, który służy do budowy serwerów i aplikacji webowych, ale nie jest wykorzystywany do dynamicznych interfejsów użytkownika w przeglądarce. ASP.NET Core to framework od Microsoftu, przeznaczony głównie do budowy aplikacji webowych i API w języku C#, jednak nie bazuje na TypeScript. jQuery to lekka biblioteka JavaScript, która ułatwia manipulację DOM i obsługę zdarzeń, ale nie oferuje kompleksowych narzędzi do tworzenia dużych aplikacji frontendowych w TypeScript, takich jak Angular.

Pytanie 22

Jaka jest składnia komentarza jednoliniowego w języku Python?

A. #
B. ""
C. //
D. !
Komentarz jednoliniowy w Pythonie zaczynamy od znaku hash, czyli #. To jest taki uniwersalny sposób na szybkie dodanie uwagi lub wyjaśnienia bez wpływu na działanie kodu. Moim zdaniem to bardzo praktyczne – wystarczy po prostu wpisać # i reszta linii jest ignorowana przez interpreter. W dużych projektach często spotyka się krótkie komentarze obok wyrażeń, np. x += 1 # inkrementacja liczby porządkowej. Co ciekawe, Python nie posiada stricte blokowych komentarzy, jak niektóre inne języki (np. /* ... */ w C lub Java), więc hashe naprawdę często się stosuje. To niesamowicie pomaga przy czytelności kodu, szczególnie gdy wracamy do własnych plików po kilku tygodniach albo pracujemy w zespole. PEP 8, czyli oficjalny przewodnik stylu Pythona, zaleca wręcz regularne używanie komentarzy do wyjaśniania „dlaczego” coś robimy, nie tylko „co” robimy. Dobrze napisany komentarz może skrócić czas szukania błędów albo tłumaczenia rozwiązań innym. Z mojego doświadczenia, warto pilnować, by komentarze nie były przestarzałe – łatwo zapomnieć o ich aktualizacji po zmianach w kodzie. Jeśli kiedyś napotkasz kod bez #, a z innymi znakami, to od razu czerwona lampka: to raczej nie jest Python.

Pytanie 23

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
W temacie ryzyka zawodowego nietrudno o pomyłki, bo wiele osób – zwłaszcza zaczynając naukę o BHP – utożsamia je po prostu z obecnością zagrożenia albo skutków wypadków. Takie myślenie prowadzi do uproszczeń, które mogą być niebezpieczne w praktyce. Samo zagrożenie wypadkowe to jeszcze nie ryzyko – to tylko potencjalne źródło szkody. Z kolei efekty zagrożeń, czyli np. liczba wypadków w danym miejscu, to już skutek, a nie samo ryzyko. Można by powiedzieć, że ktoś, kto patrzy tylko na efekty, spogląda wstecz, zamiast oceniać, co może się wydarzyć w przyszłości. Ciężkość skutków, choć ważna, to tylko jeden z elementów oceny ryzyka. Liczy się przecież także, z jakim prawdopodobieństwem wystąpi dane zdarzenie – i dopiero połączenie tych dwóch czynników pozwala mówić sensownie o ryzyku zawodowym. Z mojego punktu widzenia to typowy błąd, że myli się pojęcie zagrożenia z ryzykiem – w rzeczywistości samo występowanie niebezpieczeństwa nie oznacza natychmiastowego ryzyka dla każdego pracownika. Praktycy BHP zawsze podkreślają, że ryzyko zawodowe to ocena, czy dane zagrożenie przy określonych okolicznościach faktycznie może doprowadzić do szkody, i jak duże jest to prawdopodobieństwo. Bez tej analizy trudno planować skuteczne działania prewencyjne i w ogóle realnie podnosić poziom bezpieczeństwa. Warto też pamiętać, że zgodnie ze standardami międzynarodowymi (np. normą ISO 45001) ryzyko zawodowe zawsze dotyczy nie tylko skutków, ale przede wszystkim prawdopodobieństwa ich wystąpienia w praktyce – i to jest właśnie kluczowa różnica względem samego zagrożenia czy skutków wypadków.

Pytanie 24

Który z poniższych aspektów najdokładniej określa cel realizacji projektu?

A. Zidentyfikowanie technologii, które mogą być zastosowane
B. Ocena postępów w czasie realizacji projektu
C. Określenie problemu i metody jego rozwiązania
D. Stworzenie harmonogramu działań
Określenie problemu i sposobu jego rozwiązania to fundamentalny cel każdego projektu. Bez jasno zdefiniowanego problemu i sprecyzowanej metody jego rozwiązania, projekt może stać się chaotyczny i nieefektywny. Precyzyjna analiza problemu pozwala na wyznaczenie celów, które prowadzą do stworzenia wartościowego produktu lub usługi. Dzięki temu zespół może skupić się na kluczowych zadaniach i efektywnie zarządzać zasobami. Określenie problemu to pierwszy krok w metodykach Agile i Waterfall, który warunkuje sukces całego przedsięwzięcia.

Pytanie 25

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

A. Kask ochronny
B. Ekran akustyczny
C. Zatyczki do uszu
D. Okulary ochronne
Ekran akustyczny to przykład środka ochrony zbiorowej, który redukuje poziom hałasu w miejscu pracy, chroniąc większą grupę pracowników jednocześnie. Środki ochrony zbiorowej mają na celu eliminowanie zagrożeń u źródła i zabezpieczanie całego środowiska pracy, a nie pojedynczych osób. Ekrany akustyczne są często stosowane w zakładach produkcyjnych, gdzie hałas maszyn może przekraczać dopuszczalne normy. Dzięki nim można zmniejszyć poziom hałasu i poprawić komfort pracy, bez konieczności wyposażania każdego pracownika w ochronniki słuchu. Środki ochrony zbiorowej są bardziej efektywne w długoterminowej perspektywie, ponieważ zmniejszają ryzyko dla wszystkich pracowników na danym stanowisku.

Pytanie 26

Który z wymienionych poniżej typów danych stanowi przykład typu stałoprzecinkowego?

A. double
B. int
C. decimal
D. float
Typ 'float' przechowuje liczby zmiennoprzecinkowe, co oznacza, że może reprezentować wartości z częściami dziesiętnymi, ale nie jest to typ stałoprzecinkowy. Typ 'double' to również typ zmiennoprzecinkowy, charakteryzujący się większą precyzją niż 'float'. Typ 'decimal' służy do przechowywania liczb zmiennoprzecinkowych z dużą dokładnością, głównie w aplikacjach finansowych, gdzie precyzja jest kluczowa, ale nie zalicza się do typów stałoprzecinkowych.

Pytanie 27

Błędy w interpretacji kodu stworzonego za pomocą React.js lub Angular można wykryć dzięki

A. narzędziom zainstalowanym po stronie serwera aplikacji
B. konsoli przeglądarki internetowej
C. kompilatorowi języka JavaScript
D. wbudowanemu debuggerowi w danym środowisku
Konsola przeglądarki to naprawdę super narzędzie do śledzenia błędów w JavaScript, a szczególnie przydatna jest, gdy piszemy coś w React.js albo Angular. Dzięki niej możesz łatwo sprawdzać logi i błędy, a nawet na żywo testować różne fragmenty swojego kodu. To naprawdę szybki sposób, żeby znaleźć problemy, bez potrzeby grzebania w całym kodzie aplikacji.

Pytanie 28

Jakie działania mogą przyczynić się do ochrony swojego cyfrowego wizerunku w sieci?

A. Niepotwierdzanie źródeł publikowanych informacji
B. Weryfikacja ustawień prywatności na platformach społecznościowych
C. Zamieszczanie wszystkich szczegółów dotyczących swojego życia prywatnego
D. Dzieleni się swoimi danymi dostępowymi z przyjaciółmi
Sprawdzanie ustawień prywatności na portalach społecznościowych jest kluczowe dla ochrony cyfrowego wizerunku. Regularne aktualizowanie ustawień prywatności pozwala na kontrolowanie, kto ma dostęp do publikowanych treści, co chroni przed nieuprawnionym wykorzystaniem zdjęć, filmów i informacji osobistych. Dostosowanie widoczności postów oraz ograniczenie udostępniania danych osobowych minimalizuje ryzyko kradzieży tożsamości i cyberprzemocy. To proste działanie znacząco podnosi poziom bezpieczeństwa w sieci i pozwala utrzymać pozytywny wizerunek w internecie.

Pytanie 29

W przedstawionych funkcjonalnie równoważnych kodach źródłowych po przeprowadzeniu operacji w zmiennej b zostanie zapisany wynik:

Python:C++/C#/Java:
x = 5.96;
b = int(x);
double x = 5.96;
int b = (int)x;
A. 5
B. 596
C. 5.96
D. 6
Odpowiedź 5 jest prawidłowa, bo w większości popularnych języków programowania, takich jak Python, C++, C#, czy Java, rzutowanie liczby zmiennoprzecinkowej (czyli typu float lub double) na typ całkowity (int) powoduje odcięcie części ułamkowej, a nie zaokrąglenie. To jest bardzo ważne, bo wiele osób intuicyjnie spodziewa się zaokrąglenia, a tu po prostu wszystko po przecinku ląduje w koszu. W przypadku podanego przykładu zmienna x ma wartość 5.96, ale po rzutowaniu na int, zarówno w Pythonie poprzez funkcję int(), jak i w pozostałych językach przez klasyczne rzutowanie (int)x, zostaje tylko 5. Dokładnie tak działa konwersja: odcina się część po przecinku niezależnie od tego, jak blisko liczba jest kolejnej całości. To niesamowicie przydatne np. podczas pracy z indeksami tablic albo gdy chcemy szybko zamienić wynik dzielenia na liczbę całkowitą. W praktyce, warto pamiętać, że takie rzutowanie nie wykonuje żadnej walidacji ani sprawdzania – jeśli liczba jest ujemna, to po prostu też odcina część ułamkową w kierunku zera, więc int(-5.96) da -5. Z mojego doświadczenia bardzo często spotyka się błąd w kodzie, kiedy ktoś oczekuje zaokrąglenia i nie otrzymuje go, bo rzutowanie zawsze odcina, nie zaokrągla. Warto znać tę różnicę przy projektowaniu algorytmów i korzystać np. z funkcji round() jeśli potrzebujemy zaokrąglenia, a nie odcinania. To takie małe niuanse, ale potem wchodzą w nawyk i bardzo ułatwiają życie podczas kodowania.

Pytanie 30

Jakie z poniższych narzędzi wspomaga projektowanie interfejsu użytkownika w aplikacjach mobilnych?

A. Android Studio Layout Editor
B. Kompilator Javy
C. Narzędzie do zarządzania bazami danych
D. PyCharm Debugger
Android Studio Layout Editor to narzędzie umożliwiające projektowanie interfejsu użytkownika aplikacji mobilnych w sposób wizualny, za pomocą metody 'przeciągnij i upuść'. Layout Editor pozwala na szybkie tworzenie responsywnych interfejsów, które automatycznie dostosowują się do różnych rozmiarów ekranów i rozdzielczości. Dzięki niemu programiści mogą łatwo dodawać elementy UI, takie jak przyciski, pola tekstowe, listy czy obrazy, oraz dostosowywać ich właściwości bez konieczności pisania dużych fragmentów kodu XML. Narzędzie to jest kluczowe dla szybkiego prototypowania aplikacji oraz iteracyjnego podejścia do budowy interfejsu użytkownika w środowisku Android Studio.

Pytanie 31

Który fragment kodu ilustruje zastosowanie rekurencji?

Blok 1:
int fn(int a) {
  if(a==1) return 1;
  return fn(a-1)+2;
}
Blok 2:
int fn(int a) {
  if(a==1) return 1;
  return (a-1)+2;
}
Blok 3:
int fn(int a) {
  if(a==1) return 1;
  return fun(a-1)+2;
}
Blok 4:
int fn(int a) {
  if(a==1) return 1;
  return 2;
}
A. Blok 1
B. Blok 4
C. Blok 2
D. Blok 3
Wiele osób myli pojęcie rekurencji z prostym przetwarzaniem argumentów funkcji albo próbą wywołania innej funkcji. W przypadku Bloku 2 mamy tylko zwykłe odejmowanie i dodawanie – funkcja fn nie wywołuje samej siebie, więc nie występuje tu rekurencja. To jest bardzo częsty błąd, gdzie ktoś widzi podobieństwo w nazwach i strukturze, ale nie dostrzega istoty rekurencji, czyli tego samowywołania z innym argumentem. Blok 3 z kolei próbuje wywołać inną funkcję (fun zamiast fn), więc to również nie jest rekurencja, tylko – w najlepszym wypadku – jakaś forma współdziałania funkcji, ale nie spełnia definicji rekurencji. Częsty błąd to mylenie rekurencji z przekazywaniem sterowania do innych funkcji. Natomiast Blok 4 jest już najprostszym przypadkiem – nie wywołuje żadnej funkcji w środku, po prostu zawsze zwraca 2, poza przypadkiem bazowym. Brak tu jakiejkolwiek logiki rekurencyjnej. W praktyce programistycznej rekurencja to bardzo specyficzny wzorzec, gdzie kluczowe jest istnienie sprawdzalnego warunku zakończenia (tzw. przypadek bazowy) oraz wywołanie tej samej funkcji, ale z „mniejszym” lub „prostszym” przypadkiem. Bez tych elementów nie można mówić o poprawnej implementacji rekurencji. Osobiście zauważyłem, że wielu uczniów próbuje używać rekurencji do wszystkiego, nie rozumiejąc, że bez samowywołania i przypadku bazowego to po prostu nie działa tak, jak powinno. Branżowe standardy jasno wskazują, że rekurencja jest narzędziem do rozwiązywania problemów, które mają naturalną strukturę rekurencyjną – na przykład przetwarzanie struktur drzewiastych, rozwiązywanie łamigłówek typu wieże Hanoi, czy sortowanie szybkie (quick sort). Jeśli jednak funkcja nie wywołuje samej siebie, nie spełnia warunków rekurencji, nawet jeśli operuje na podobnych argumentach lub odwołuje się do innych funkcji.

Pytanie 32

Wskaż termin, który w języku angielskim odnosi się do "testów wydajnościowych"?

A. security testing
B. performance testing
C. integration testing
D. unit testing
Testy wydajnościowe, czyli performance testing, to coś, co naprawdę warto mieć na uwadze. Dzięki nim możemy sprawdzić, jak nasza aplikacja działa pod dużym obciążeniem i jak szybko odpowiada na różne żądania. Moim zdaniem, to kluczowy aspekt, zwłaszcza jeśli planujemy, żeby nasza aplikacja miała wielu użytkowników. W końcu, nikt nie lubi czekać, aż coś się załaduje!

Pytanie 33

Zaprezentowany symbol odnosi się do

Ilustracja do pytania
A. Creative Commons
B. domeny publicznej
C. prawa cytatu
D. praw autorskich
Wiele osób zaczyna od skojarzenia tego symbolu z prawami autorskimi, Creative Commons albo prawem cytatu, jednak to prowadzi na manowce. Po pierwsze, standardowy symbol praw autorskich to samo „C” w kółku, bez przekreślenia – i on oznacza, że utwór jest objęty ochroną z mocy prawa i wszelkie wykorzystanie wymaga zgody twórcy lub spełnienia warunków ustawowych wyjątków. Natomiast tutaj mamy przekreślone „C”, co jednoznacznie sugeruje brak ochrony. Creative Commons to zupełnie inny zestaw symboli, z typowymi oznaczeniami: CC i różnymi dodatkami jak BY, SA, NC, ND, które precyzują warunki korzystania z utworu. Te licencje nadal wprowadzają ograniczenia, chociaż są dużo bardziej elastyczne niż klasyczne prawa autorskie – ale nigdy nie oznaczają całkowitego braku praw. Prawo cytatu z kolei to wyjątek w ustawie o prawie autorskim, który pozwala na ograniczone wykorzystywanie fragmentów cudzych utworów w określonych sytuacjach, ale nie oznacza, że cały utwór można wykorzystywać dowolnie i bez ograniczeń. Typowy błąd polega na utożsamianiu każdego oznaczenia związanych z literą C z szeroko rozumianą „wolnością” korzystania – a to nieprawda. Domena publiczna jest zupełnie oddzielną kategorią, gdzie utwór jest trwale wyjęty spod ochrony prawnej i można go używać naprawdę dowolnie. W praktyce, nieznajomość tych niuansów może prowadzić do błędów prawnych, np. nieświadomego naruszenia czyichś praw, albo niewłaściwego oznaczenia własnej pracy. W środowisku profesjonalnym bardzo ważne jest właśnie rozróżnianie tych pojęć i symboli – to wpływa na bezpieczeństwo prawne projektów i buduje zaufanie do twórcy.

Pytanie 34

Jaką cechą charakteryzuje się sieć asynchroniczna?

A. Dane są przesyłane jedynie w określonych przedziałach czasowych
B. Dane są przesyłane w sposób nieciągły, bez synchronizacji zegarów
C. Jest bardziej niezawodna od sieci synchronicznej
D. Wymaga synchronizacji zegarów
Sieci asynchroniczne to rodzaj systemów komunikacyjnych, w których dane są przesyłane w sposób nieciągły, co oznacza, że nie wymagają one synchronizacji zegarów pomiędzy urządzeniami. W takich sieciach, każda jednostka przesyła dane w dowolnym momencie, co zwiększa elastyczność i efektywność komunikacji. Przykładem zastosowania sieci asynchronicznych są systemy oparte na protokołach, takich jak UART (Universal Asynchronous Receiver-Transmitter), które są powszechnie używane w mikrokomputerach oraz różnych urządzeniach elektronicznych. W kontekście standardów, sieci asynchroniczne są często stosowane w komunikacji szeregowej, gdzie dane są przesyłane bez ustalonych ram czasowych, co pozwala na redukcję opóźnień i zwiększenie przepustowości. W praktyce, taki model komunikacji jest idealny w sytuacjach, gdzie ciągłość przesyłu danych nie jest kluczowa, jak w przypadku transmisji danych z czujników czy urządzeń IoT, gdzie urządzenia mogą nadawać dane, gdy są gotowe, a nie w ustalonych interwałach czasowych.

Pytanie 35

Która technologia służy do tworzenia responsywnych stron internetowych?

A. Media Queries w CSS
B. WebSockets
C. Local Storage
D. REST API
WebSockets to technologia, która służy do nawiązywania trwałej komunikacji między klientem a serwerem w czasie rzeczywistym, co jest szczególnie użyteczne w aplikacjach wymagających natychmiastowej wymiany danych, takich jak czaty czy gry online. Choć WebSockets umożliwiają dynamiczną interakcję, nie mają zastosowania w kontekście responsywności stron internetowych, ponieważ nie dotyczą one renderowania i dostosowywania treści do różnych rozmiarów ekranów. REST API to z kolei architektura służąca do tworzenia interfejsów programistycznych, która pozwala aplikacjom na komunikację ze sobą, ale także nie wpływa na responsywność stron. REST API jest używane głównie do wymiany danych między serwerami a aplikacjami, a nie do stylizacji i układu elementów na stronie. Local Storage to technologia pozwalająca na przechowywanie danych w przeglądarkach, co może wspierać funkcjonalność aplikacji webowych, ale również nie ma bezpośredniego związku z tworzeniem responsywnych interfejsów. Typowym błędem w myśleniu o responsywności jest mylenie technologii służących do przetwarzania danych z tymi, które są odpowiedzialne za prezentację i układ na stronie. Kluczem do efektywnego projektowania responsywnego jest zrozumienie potrzeby dostosowywania stylów CSS w zależności od urządzenia, a nie jedynie komunikacja czy przechowywanie informacji.

Pytanie 36

Jakie z wymienionych czynności można zrealizować przy pomocy składnika statycznego danej klasy?

A. Umożliwienie dzielenia pól klasy pomiędzy zaprzyjaźnione klasy
B. Wywołanie destruktora klasy bez jej usuwania
C. Tworzenie prywatnych kopii pól dla każdej instancji
D. Zachowanie wartości wspólnych dla wszystkich instancji klasy
Składnik statyczny klasy przechowuje wartości wspólne dla wszystkich instancji danej klasy. Oznacza to, że niezależnie od liczby utworzonych obiektów, istnieje tylko jedna kopia składowej statycznej, która jest współdzielona przez wszystkie instancje. Składowe statyczne są często wykorzystywane do przechowywania liczników, stałych wartości lub danych konfiguracyjnych. Metody statyczne mogą być wywoływane bezpośrednio na klasie, bez konieczności tworzenia obiektu, co czyni je niezwykle użytecznymi w przypadku funkcji narzędziowych.

Pytanie 37

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

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

Pytanie 38

Który z wymienionych algorytmów jest algorytmem opartym na iteracji?

A. QuickSort
B. Fibonacci (rekurencyjnie)
C. DFS (przeszukiwanie w głąb)
D. BubbleSort
Bubble Sort to klasyczny przykład algorytmu iteracyjnego, który sortuje elementy tablicy poprzez wielokrotne porównywanie i zamianę sąsiadujących elementów. Algorytm ten działa w pętlach, aż wszystkie elementy zostaną odpowiednio uporządkowane. Chociaż jest jednym z najprostszych algorytmów sortowania, jego złożoność O(n^2) czyni go mniej efektywnym dla dużych zbiorów danych. Bubble Sort jest często wykorzystywany w nauczaniu podstaw algorytmiki, ponieważ łatwo zrozumieć jego działanie i implementację. Pomimo niskiej efektywności, bywa stosowany w przypadkach, gdy liczba elementów jest niewielka lub zbiór danych jest wstępnie posortowany.

Pytanie 39

Jakie jest zadanie interpretera?

A. wykonywanie skryptu krok po kroku
B. optymalizacja większej części kodu, aby przyspieszyć jego wykonanie
C. tłumaczenie kodu na kod maszynowy
D. analiza składni całego programu przed jego uruchomieniem
Interpreter to takie narzędzie, które wykonuje kod linijka po linijce. Działa to tak, że odczytuje program napisany w języku wysokiego poziomu, weryfikuje co tam w nim siedzi i od razu realizuje polecenia, co sprawia, że można fajnie testować kod. Na przykład w Pythonie można łatwo sprawdzić różne fragmenty kodu, co jest mega pomocne przy pisaniu i poprawianiu oprogramowania. Wiesz, od kompilatora różni się tym, że kompilator przetwarza cały kod od razu, tworząc kod maszynowy, który później działa na komputerze. Dzięki temu interpreter jest bardziej elastyczny, można szybko przetestować nowe pomysły, ale z drugiej strony, czasami nie działa tak efektywnie jak skompilowane programy, bo każda linia kodu jest analizowana na bieżąco. Więc w przypadku dużych i wymagających aplikacji lepiej sprawdzają się kompilatory, ale interpreter to skarb, zwłaszcza w nauce i prototypowaniu.

Pytanie 40

Jakie wartości może przyjąć zmienna typu boolean?

A. O oraz każdą liczbę całkowitą
B. trzy dowolne liczby naturalne
C. 1, -1
D. true, false
Zmienna typu logicznego (boolowskiego) w językach programowania, takich jak C++, Java czy Python, może przyjmować tylko dwie wartości: true (prawda) oraz false (fałsz). Te wartości są fundamentalne w logice komputerowej, ponieważ umożliwiają podejmowanie decyzji oraz kontrolowanie przepływu programu poprzez struktury warunkowe, takie jak instrukcje if, while czy for. Na przykład, w języku Python, tworząc zmienną logiczną, możemy użyć operatorów porównania, aby określić, czy dwie wartości są równe: is_equal = (5 == 5), co ustawia is_equal na true. Zmienne logiczne są zdefiniowane w standardach programowania, takich jak IEEE 754 dla reprezentacji liczb zmiennoprzecinkowych, gdzie wartość logiczna jest kluczowa dla operacji porównawczych. Dobrze zrozumiana logika boolowska jest niezbędna dla programistów, ponieważ stanowi podstawę algorytmu decyzyjnego oraz wpływa na efektywność kodu.