Wyniki egzaminu

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

Egzamin zdany!

Wynik: 21/40 punktów (52,5%)

Wymagane minimum: 20 punktów (50%)

Pochwal się swoim wynikiem!
Szczegółowe wyniki:
Pytanie 1

Jaką rolę odgrywa interpreter w kontekście programowania?

A. Zoptymalizowuje wydajność aplikacji w środowisku produkcyjnym
B. Przekłada kod źródłowy na język maszynowy w trakcie działania programu
C. Generuje plik wykonywalny dla systemu operacyjnego
D. Łączy kod źródłowy z zewnętrznymi bibliotekami
Interpreter tłumaczy kod źródłowy na język maszynowy instrukcja po instrukcji, co oznacza, że każda linia kodu jest analizowana i wykonywana na bieżąco. Dzięki temu programy interpretowane, takie jak te w Pythonie, Ruby czy JavaScript, mogą być szybko testowane i uruchamiane bez konieczności wcześniejszej kompilacji. Interpretacja pozwala na elastyczność w procesie rozwoju, ponieważ zmiany w kodzie są widoczne natychmiast po zapisaniu pliku. To czyni interpreter idealnym narzędziem do prototypowania i budowania aplikacji w dynamicznych środowiskach.

Pytanie 2

Jakie są kluczowe różnice między typami stałoprzecinkowymi a zmiennoprzecinkowymi?

A. Typy stałoprzecinkowe obsługują liczby ujemne, natomiast typy zmiennoprzecinkowe tylko dodatnie
B. Typy stałoprzecinkowe wymagają większej ilości pamięci niż typy zmiennoprzecinkowe
C. Typy zmiennoprzecinkowe przechowują wyłącznie liczby ujemne
D. Typy stałoprzecinkowe przechowują liczby całkowite, a typy zmiennoprzecinkowe przechowują liczby z ułamkami dziesiętnymi
Stałoprzecinkowe typy obsługują zarówno liczby dodatnie, jak i ujemne – stwierdzenie, że obsługują tylko liczby dodatnie, jest błędne. Stałoprzecinkowe typy danych nie wymagają więcej pamięci niż zmiennoprzecinkowe – wręcz przeciwnie, typy takie jak 'float' zajmują więcej miejsca ze względu na możliwość przechowywania części ułamkowych. Zmiennoprzecinkowe nie przechowują wyłącznie liczb ujemnych – mogą przechowywać zarówno liczby dodatnie, jak i ujemne, co czyni je bardziej wszechstronnymi w niektórych aplikacjach.

Pytanie 3

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

A. Local Storage
B. WebSockets
C. Media Queries w CSS
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 4

W jakim języku został stworzony framework Angular?

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

Pytanie 5

Jaką rolę odgrywa destruktor w definicji klasy?

A. Realizuje testy jednostkowe klasy
B. Ustawia wartości pól klasy
C. Generuje nowe instancje klasy
D. Usuwa instancje i zwalnia pamięć
Destruktor to specjalna metoda klasy, która jest automatycznie wywoływana w momencie, gdy obiekt przestaje być używany. Jego zadaniem jest zwalnianie zasobów, takich jak pamięć dynamiczna, uchwyty do plików lub połączenia sieciowe. Destruktor ma tę samą nazwę co klasa, poprzedzoną symbolem `~` w C++ (`~Samochod()`). Destruktor zapobiega wyciekom pamięci i zapewnia, że wszystkie zasoby są poprawnie zwalniane po zakończeniu pracy obiektu. Jest to kluczowy element zarządzania cyklem życia obiektu w językach takich jak C++.

Pytanie 6

Jakie są cechy biblioteki statycznej w zestawieniu z dynamiczną?

A. Jest wczytywana do pamięci podczas działania aplikacji
B. Może być zmieniana w czasie działania programu
C. Nie potrzebuje obecności pliku wykonywalnego
D. Zostaje dodana do pliku wykonywalnego w trakcie kompilacji
Biblioteki dynamiczne są ładowane do pamięci podczas działania programu, co pozwala na oszczędność miejsca i elastyczność w aktualizacjach. Twierdzenie, że biblioteka nie wymaga obecności pliku wykonywalnego, jest błędne – biblioteka musi być dostępna w systemie, aby program mógł z niej korzystać. Możliwość modyfikacji biblioteki w trakcie działania programu dotyczy tylko bibliotek dynamicznych, a nie statycznych, ponieważ kod bibliotek statycznych jest na stałe wkompilowany w aplikację.

Pytanie 7

Zalecenia standardu WCAG 2.0 dotyczące percepcji koncentrują się na

A. zrozumieniu i wiarygodności prezentowanych treści na stronie
B. prezentacji elementów interfejsu użytkownika
C. zapewnieniu odpowiedniej ilości czasu na przeczytanie i zrozumienie treści
D. umożliwieniu interakcji między komponentami użytkownika za pomocą klawiatury
Pierwsza z niepoprawnych odpowiedzi odnosi się do zrozumienia i rzetelności w dostarczonych treściach na stronie, co jest ważnym aspektem, ale nie dotyczy bezpośrednio percepcji komponentów interfejsu użytkownika. Zrozumienie treści jest związane z czytelnością tekstu oraz jego strukturalną formą, co nie jest bezpośrednio związane z interfejsem. Kolejna niepoprawna odpowiedź, dotycząca zapewnienia wystarczającej ilości czasu na przeczytanie i przetworzenie treści, odnosi się bardziej do zasad dostępności dotyczących czasu, które są istotne dla użytkowników z różnymi zdolnościami przetwarzania informacji, ale nie dotyczą samej percepcji komponentów interfejsu. Ostatnia odpowiedź, dotycząca zapewnienia interakcji pomiędzy komponentami użytkownika przy użyciu klawiatury, również nie odnosi się bezpośrednio do percepcji, a bardziej do interakcji użytkownika z systemem. Choć interakcja jest istotna, kluczowe jest zrozumienie, że percepcja skupia się na sposobie, w jaki użytkownicy dostrzegają i interpretują te komponenty, a nie na ich interakcji. Dlatego też, te odpowiedzi, choć dotyczą ważnych kwestii dostępności, nie są zgodne z istotą pytania.

Pytanie 8

Jakie jest znaczenie klasy abstrakcyjnej?

A. Klasa, która zawsze dziedziczy z klasy bazowej
B. Klasa, która może być dziedziczona, ale nie można jej instancjonować
C. Klasa, która może zawierać zarówno metody zdefiniowane, jak i niezdefiniowane (czysto wirtualne)
D. Klasa, która nie może posiadać żadnych metod
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 9

Który z wymienionych algorytmów sortujących posiada średnią złożoność obliczeniową równą O(n log n)?

A. Sortowanie szybkie (QuickSort)
B. Sortowanie przez wstawianie
C. Sortowanie przez wybór
D. Sortowanie bąbelkowe
Sortowanie przez wstawianie jest dość powolne, z tą złożonością O(n²). W zasadzie fajnie sprawdza się tylko w małych zbiorach lub gdy tablica już jest mniej więcej posortowana. A jeśli chodzi o sortowanie bąbelkowe, to chyba nie ma co się łudzić, jest jednym z najgorszych algorytmów, też O(n²). I sortowanie przez wybór? Tutaj też nie ma rewelacji, bo porównuje się i wybiera najmniejszy element w każdej iteracji, co znacznie spowalnia działanie, zwłaszcza przy dużych tablicach. Tak że generalnie, lepiej unikać tych algorytmów, jeśli to możliwe.

Pytanie 10

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

A. Protokół komunikacji między różnymi bazami danych
B. System zarządzania plikami statycznymi w aplikacjach SPA
C. Mechanizm bezpieczeństwa określający, które domeny mogą uzyskiwać dostęp do zasobów na serwerze
D. Metoda kompresji danych w aplikacjach webowych
CORS to nie protokół komunikacji między różnymi bazami danych, co sugeruje pierwsza z niepoprawnych odpowiedzi. Protokoły takie jak JDBC czy ODBC są odpowiedzialne za komunikację między bazami danych, a nie CORS. CORS nie jest też metodą kompresji danych w aplikacjach webowych, co mogłoby wprowadzać w błąd w kontekście optymalizacji transferu danych. Kompresja danych jest realizowana przez inne technologie, takie jak Gzip, które zmniejszają rozmiar przesyłanych informacji, ale nie mają związku z ograniczeniami dostępu do zasobów. Ponadto, CORS nie ma nic wspólnego z zarządzaniem plikami statycznymi w aplikacjach SPA. W rzeczywistości, pliki statyczne mogą być serwowane z różnych źródeł, a CORS odgrywa kluczową rolę w ustalaniu, czy te źródła mogą być dostępne przez przeglądarkę. To zrozumienie jest kluczowe, ponieważ wiele osób myli pojęcia związane z komunikacją w sieci, co prowadzi do fałszywych przekonań. Zatem ważne jest, aby nie tylko znać definicje, ale także rozumieć, jak różne technologie współdziałają ze sobą w kontekście bezpieczeństwa i dostępu do danych.

Pytanie 11

Jakie środowisko developerskie służy do tworzenia aplikacji na platformę iOS?

A. Visual Studio Code
B. XCode
C. Studio Androida
D. Eclipse
Android Studio to środowisko przeznaczone do tworzenia aplikacji na system Android, a nie iOS. Visual Studio Code to wieloplatformowe IDE, ale jego natywne wsparcie dla aplikacji iOS jest ograniczone w porównaniu do XCode. Eclipse jest używane głównie do programowania w językach Java i C++, ale nie jest narzędziem pierwszego wyboru dla aplikacji iOS, które wymagają XCode do kompilacji i wdrożenia na urządzenia Apple.

Pytanie 12

Co zostanie wyświetlone po wykonaniu poniższego kodu?

class Animal {
  constructor(name) {
    this.name = name;
  }
  speak() {
    return `${this.name} makes a noise.`;
  }
}

class Dog extends Animal {
  speak() {
    return `${this.name} barks.`;
  }
}

let dog = new Dog('Rex');
console.log(dog.speak());
A. Rex makes a noise.
B. Error: speak is not defined
C. Rex barks.
D. undefined
Odpowiedź "Rex barks." jest prawidłowa, ponieważ kod definiuje klasę Dog, która dziedziczy po klasie Animal. W klasie Animal mamy metodę speak(), która zwraca tekst wskazujący na dźwięk wydawany przez zwierzę. Kiedy tworzymy instancję klasy Dog, przekazujemy jej imię 'Rex'. Następnie, kiedy wywołujemy metodę speak() na obiekcie dog, zostaje użyta metoda zdefiniowana w klasie Dog, a nie ta z klasy Animal. To dlatego zwracany tekst to 'Rex barks.', co jest poprawnym i oczekiwanym wynikiem. Przykładowo, w praktycznych zastosowaniach, jeśli miałbyś różne klasy zwierząt, można by je zdefiniować w podobny sposób, gdzie każde zwierzę mogłoby mieć swoją unikalną implementację metody speak(), co wprowadza elastyczność i możliwości rozszerzalności w kodowaniu.

Pytanie 13

Zawarty w ramce opis licencji sugeruje, że mamy do czynienia z licencją

Rodzaj licencji, który zapewnia otwarty dostęp do oprogramowania dla wszystkich użytkowników programu, którego dotyczy: prawo do darmowego użytkowania, kopiowania, rozpowszechniania oraz tworzenia modyfikacji, ulepszania i rozbudowania.
A. Open Source
B. Freeware
C. OEM
D. Shareware
Opis podany w pytaniu idealnie pasuje do koncepcji licencji Open Source. W praktyce oznacza to, że każdy użytkownik ma nie tylko prawo korzystać z oprogramowania za darmo, ale także może pobierać kod źródłowy, analizować go, modyfikować, ulepszać i nawet udostępniać dalej własne warianty. To daje ogromne możliwości rozwoju – nie tylko dla pojedynczych programistów, lecz przede wszystkim dla całych społeczności, które budują narzędzia i rozwiązania dużo szybciej niż zamknięte firmy. Przykłady? Linux, GIMP, LibreOffice, czy nawet przeglądarka Firefox. Moim zdaniem, to jest wręcz fundament nowoczesnego IT – wiele firm (nawet tych największych, typu Google czy Microsoft) opiera się dziś na rozwiązaniach Open Source, bo to daje elastyczność, bezpieczeństwo i transparentność. Branżowe standardy, np. licencja GNU GPL lub MIT, jasno określają zasady współdzielenia i ochrony praw autorskich. Dobra praktyka to zawsze sprawdzić warunki licencji przed wdrożeniem projektu w firmie albo szkole. Fajnie jest też pamiętać, że Open Source to nie tylko darmowość, ale przede wszystkim filozofia dzielenia się wiedzą, co w informatyce często prowadzi do innowacji i lepszej jakości kodu.

Pytanie 14

Zademonstrowana pętla wykorzystuje obiekt random do:

var random = new Random();
String pulaZnakow = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ";
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. uzupełniania tablicy danymi w postaci liczb pseudolosowych
B. jednorazowego wylosowania znaku z określonego zestawu znaków
C. stworzenia losowego napisu o długości 8 znaków składającego się z liter
D. wielokrotnego generowania liczby, aby stworzyć ciąg z liczb pseudolosowych
Kod, który został przedstawiony, to typowy przykład generowania losowego napisu, takiego jak hasło czy token sesji. Random służy tutaj do wielokrotnego losowania indeksów z określonego zakresu, które następnie są używane do pobierania znaków z puli liter. W efekcie – po przejściu całej pętli – zmienna 'wynik' zawiera napis złożony z 8 losowo dobranych liter z podanego zestawu. Tak się właśnie w praktyce koduje np. generator jednorazowych haseł lub krótkich identyfikatorów użytkowników. Często takie rozwiązania spotyka się w aplikacjach internetowych, gdzie bezpieczeństwo i nieprzewidywalność takich danych są kluczowe. Zresztą, korzystanie z Random i gotowej puli znaków to branżowy standard, jeśli chodzi o prostą losowość tekstową (chociaż do kryptografii są lepsze klasy, np. RNGCryptoServiceProvider). Warto też pamiętać, że pętle for idealnie nadają się do składania ciągów o z góry ustalonej długości, co jest bardzo czytelne i zgodne z dobrymi praktykami C#. Ogólnie, ten sposób generowania losowego stringa jest szybki, łatwy do zrozumienia i nieźle się skaluje – no i sprawdza się rewelacyjnie w różnych projektach, gdzie trzeba wygenerować coś pseudo-losowego, ale czytelnego dla człowieka. Sam się kiedyś złapałem na tym, jak często taki kod się przydaje przy rejestracji użytkowników czy obsłudze prostych quizów online.

Pytanie 15

W podanym fragmencie kodu Java wskaż, która zmienna może przechować wartość "T":

int zm1;
float zm2;
char zm3;
boolean zm4;
A. zm1
B. zm3
C. zm4
D. zm2
Zmienna o nazwie zm3 została zadeklarowana jako typu char co oznacza że może przechowywać pojedynczy znak w tym przypadku wartość T. Typ char w języku Java jest używany do przechowywania znaków Unicode co czyni go idealnym do obsługi liter jako danych. Każdy znak jest przechowywany jako 16-bitowa wartość liczby całkowitej co umożliwia reprezentację szerokiego zakresu symboli w tym litery cyfry i inne znaki specjalne. Przykładowymi zastosowaniami typu char są przypadki gdzie konieczne jest przechowywanie i przetwarzanie liter np. w sytuacjach gdy aplikacja wymaga manipulacji pojedyńczymi znakami w tekście czy analizą ich wartości w kontekście porównywania danych. Dobre praktyki przy pracy z typem char obejmują świadome zarządzanie pamięcią i unikanie niepotrzebnych konwersji do innych typów danych co może prowadzić do strat precyzji lub nieoczekiwanych rezultatów. Ważne jest także zrozumienie jak znaki są kodowane i dekodowane szczególnie w kontekście międzynarodowym gdzie prawidłowa obsługa znaków Unicode jest kluczowa dla zapewnienia kompatybilności i poprawnego działania aplikacji w różnych językach.

Pytanie 16

W programowaniu obiektowym odpowiednikami zmiennych oraz funkcji w programowaniu strukturalnym są

A. hermetyzacja oraz dziedziczenie
B. pola i metody
C. metody statyczne i abstrakcyjne
D. pola i kwalifikatory dostępu
Pola i metody to absolutna podstawa, jeśli chodzi o programowanie obiektowe. Właśnie one są najbliższym odpowiednikiem zmiennych i funkcji z podejścia strukturalnego. Moim zdaniem, gdy uczysz się OOP, warto od razu wyłapać tę analogię – pola (czyli inaczej: atrybuty, właściwości, fields) przechowują stan obiektu, a metody (czyli funkcje w klasie) definiują, co obiekt potrafi zrobić. Przykład z życia: klasa Samochód ma pole kolor, które opisuje jego cechę oraz metodę jedź(), która realizuje jakąś akcję. W praktyce programiści bardzo często modelują swoje klasy tak, aby pola były prywatne (zgodnie z zasadą hermetyzacji), a dostęp do nich zapewniały metody publiczne – tzw. gettery i settery. Standardy branżowe, np. JavaBeans w Javie czy konwencje C#, też polegają na tym, że pola odzwierciedlają dane, a metody operacje na tych danych. Z mojego doświadczenia wynika, że rozumienie tej relacji ułatwia zarówno pisanie czytelnego kodu, jak i jego dalsze rozwijanie. To właśnie dzięki rozdzieleniu na pola i metody klasy mogą odwzorowywać obiekty z realnego świata i ich zachowania, co jest głównym celem programowania obiektowego.

Pytanie 17

Co to jest WebSocket?

A. Protokół komunikacyjny zapewniający komunikację dwukierunkową przez pojedyncze połączenie TCP
B. Standard zapisu danych w formacie binarnym
C. Biblioteka JavaScript do tworzenia dynamicznych formularzy
D. Narzędzie do testowania aplikacji webowych
Zrozumienie podstawowych różnic między protokołami komunikacyjnymi jest kluczowe w kontekście nowoczesnych technologii webowych. Wiele osób myli WebSocket z narzędziami do testowania aplikacji webowych, co prowadzi do nieporozumień. Narzędzia te, choć niezbędne w procesie rozwijania i testowania aplikacji, nie zajmują się rzeczywistą komunikacją między klientem a serwerem, a raczej służą do analizy i debugowania interakcji. Innym powszechnym błędnym wyobrażeniem jest mylenie WebSocket z formatami zapisu danych, co jest całkowicie innym zagadnieniem. Protokół WebSocket nie definiuje sposobu, w jaki dane są zapisywane, ale raczej sposób, w jaki te dane są przesyłane w czasie rzeczywistym. Co więcej, pomysł, że WebSocket jest biblioteką JavaScript do tworzenia dynamicznych formularzy, jest również nieprawidłowy. WebSocket jest protokołem, który wymaga implementacji zarówno po stronie serwera, jak i klienta, a nie tylko narzędzi do interakcji z formularzami. W związku z tym, brak świadomości dotyczącej tych różnic może prowadzić do nieefektywnego projektowania aplikacji, w których kluczowym elementem jest efektywna komunikacja w czasie rzeczywistym. Aby skutecznie wdrożyć nowoczesne rozwiązania webowe, warto zrozumieć, jak WebSocket współdziała z innymi technologiami, takimi jak AJAX czy REST, zamiast skupiać się na mylonych koncepcjach, które mogą wprowadzać w błąd podczas projektowania systemów.

Pytanie 18

Którą funkcję w C++ można zastosować do dynamicznego przydzielania pamięci dla tablicy?

A. delete[]
B. sizeof()
C. free()
D. malloc()
Funkcja 'malloc()' w języku C i C++ służy do dynamicznego alokowania pamięci dla tablic i innych struktur danych. Jest to kluczowa funkcja pozwalająca na przydzielenie określonej ilości bajtów w czasie wykonywania programu, co zwiększa elastyczność zarządzania pamięcią. Używając 'malloc()', programista może utworzyć tablicę o zmiennym rozmiarze, który nie musi być znany w czasie kompilacji. Dynamiczne alokowanie pamięci jest powszechnie stosowane w aplikacjach wymagających dużych ilości danych lub wtedy, gdy konieczne jest efektywne wykorzystanie zasobów systemowych.

Pytanie 19

Początkowym celem środowisk IDE takich jak: lntellij IDEA, Eclipse, NetBeans jest programowanie w języku

A. Java
B. C#
C. C++
D. Python
C# jest językiem programowania opracowanym przez firmę Microsoft, który jest głównie używany w ekosystemie .NET. Chociaż istnieją IDE, które wspierają C#, takie jak Visual Studio, to IntelliJ IDEA, Eclipse i NetBeans nie zostały zaprojektowane z myślą o tym języku. C++ jest językiem programowania o dużych możliwościach, stosowanym głównie w systemach operacyjnych, oprogramowaniu sterownikowym oraz aplikacjach wymagających wysokiej wydajności. Chociaż istnieją wtyczki do Eclipse, które wspierają C++, to głównym celem tych IDE nie jest rozwój w tym języku, a ich główne funkcje koncentrują się na Java. Python, znany ze swojej prostoty i przyjazności dla początkujących, ma również swoje dedykowane środowiska IDE, takie jak PyCharm i Anaconda, które są bardziej optymalne dla tego języka. IDE, takie jak IntelliJ IDEA, Eclipse i NetBeans, nie oferują pełnego wsparcia dla Pythona, co sprawia, że programowanie w tym języku w tych środowiskach nie jest tak efektywne, jak w dedykowanych narzędziach.

Pytanie 20

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

A. Backlog sprintu
B. Diagram Gantta
C. Product backlog
D. Harmonogram projektu
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 21

Który komponent systemu komputerowego zajmuje się transferem danych pomiędzy procesorem a pamięcią RAM?

A. Kontroler DMA
B. Zasilacz
C. Karta graficzna
D. Mostek północny (Northbridge)
Kontroler DMA (Direct Memory Access) to komponent, który umożliwia transfer danych pomiędzy urządzeniami peryferyjnymi a pamięcią RAM bez bezpośredniego zaangażowania procesora. Choć odgrywa on istotną rolę w wydajności systemu, nie jest odpowiedzialny za bezpośrednią komunikację pomiędzy procesorem a pamięcią RAM. Jego zadaniem jest odciążenie procesora, ale nie zastępuje funkcji mostka północnego. Karta graficzna, z kolei, jest odpowiedzialna za renderowanie grafiki i przetwarzanie obrazów, a jej działanie jest ściśle związane z zadaniami wizualnymi, a nie z przesyłaniem danych pomiędzy CPU a RAM. Zasilacz natomiast jest komponentem, który dostarcza energię elektryczną do wszystkich części komputera. Choć niezbędny do funkcjonowania systemu, zasilacz nie ma żadnego wpływu na przesyłanie danych czy komunikację pomiędzy procesorem a pamięcią. W związku z tym, żaden z wymienionych elementów nie może pełnić roli mostka północnego, co czyni je niewłaściwymi odpowiedziami na to pytanie.

Pytanie 22

Jakie korzyści płyną z użycia pseudokodu przy tworzeniu algorytmu?

A. Generowanie dynamicznych struktur danych
B. Zrozumiałość dla osób nieznających się na programowaniu
C. Łatwość w zmianie kodu maszynowego
D. Możliwość szybkie zrealizowania algorytmu w którymkolwiek języku
Zaletą wykorzystania pseudokodu podczas projektowania algorytmu jest jego czytelność i prostota, dzięki czemu jest zrozumiały nawet dla osób, które nie są biegłe w programowaniu. Pseudokod pozwala skupić się na logice działania algorytmu bez konieczności przestrzegania ścisłej składni konkretnego języka programowania. Dzięki temu proces projektowania jest szybszy, a algorytm można łatwo przełożyć na dowolny język programowania. Pseudokod ułatwia również współpracę między programistami i analitykami, wspierając tworzenie i dokumentowanie złożonych rozwiązań.

Pytanie 23

Jakie są kluczowe etapy resuscytacji krążeniowo-oddechowej?

A. 10 uciśnięć klatki piersiowej bez wdechów
B. 30 uciśnięć klatki piersiowej na przemian z 2 wdechami ratowniczymi
C. 20 uciśnięć klatki piersiowej na przemian z 5 wdechami ratowniczymi
D. 30 wdechów ratowniczych bez uciśnięć
30 uciśnięć klatki piersiowej na przemian z 2 wdechami ratowniczymi to standardowy protokół resuscytacji krążeniowo-oddechowej (RKO) zgodny z wytycznymi Europejskiej Rady Resuscytacji (ERC). Uciśnięcia wykonywane są na głębokość około 5-6 cm w tempie 100-120 uciśnięć na minutę. Po 30 uciśnięciach wykonuje się 2 wdechy ratownicze, które powinny być wykonywane z odpowiednią siłą, aby unieść klatkę piersiową poszkodowanego. Taka sekwencja jest podstawą pierwszej pomocy i może uratować życie osoby, u której doszło do zatrzymania akcji serca. Resuscytację należy kontynuować do momentu przybycia służb ratunkowych lub odzyskania przytomności przez poszkodowanego.

Pytanie 24

Które z wymienionych stwierdzeń najtrafniej charakteryzuje klasę dziedziczącą?

A. Klasa, która nie może posiadać konstruktorów ani destruktorów
B. Klasa, która dzieli swoje pola z klasami zaprzyjaźnionymi
C. Klasa, która wykorzystuje pola i metody innej klasy bez ich ponownej definicji
D. Klasa, która umożliwia wielokrotne dziedziczenie pól prywatnych
Klasa nie dzieli swoich pól z zaprzyjaźnionymi klasami – zaprzyjaźnione klasy mają jedynie dostęp do prywatnych składowych, ale to nie jest mechanizm dziedziczenia. Stwierdzenie o braku konstruktorów i destruktorów jest błędne – każda klasa, w tym dziedziczona, może mieć konstruktory i destruktory, które umożliwiają inicjalizację oraz zwalnianie zasobów. Dziedziczenie nie pozwala również na wielokrotne dziedziczenie prywatnych pól, ponieważ prywatne składowe klasy bazowej są niedostępne dla klas pochodnych.

Pytanie 25

Jakie kroki należy podjąć po wykryciu błędu w kodzie podczas testowania?

A. Usunąć moduł, który zawiera błąd
B. Pominąć błąd, jeżeli aplikacja funkcjonuje poprawnie
C. Naprawić błąd i przeprowadzić ponowne testy aplikacji
D. Zgłosić błąd użytkownikowi końcowemu
Po znalezieniu błędu w kodzie podczas testowania kluczowym krokiem jest poprawienie błędu i ponowne przetestowanie aplikacji. Taki cykl iteracyjny pozwala na eliminację błędów i zapewnienie, że aplikacja działa zgodnie z oczekiwaniami. Testowanie po każdej poprawce jest niezbędne, aby upewnić się, że wprowadzone zmiany nie wpłynęły negatywnie na inne części aplikacji. Taka praktyka jest integralną częścią Continuous Integration (CI) i Continuous Deployment (CD), które zakładają częste wdrażanie i testowanie kodu. Poprawienie błędów na wczesnym etapie rozwoju minimalizuje koszty i czas potrzebny na naprawę błędów w fazie produkcyjnej, co przyczynia się do stabilności i wysokiej jakości końcowego produktu.

Pytanie 26

W celu wdrożenia w aplikacji internetowej mechanizmu zbierania danych statystycznych na komputerach użytkowników, można użyć

A. ciasteczka
B. formulacje
C. sesje
D. buforowanie
Ciasteczka, czyli tzw. cookies, to naprawdę podstawowy, a zarazem bardzo skuteczny mechanizm wykorzystywany w aplikacjach internetowych właśnie do zbierania i przechowywania danych statystycznych na komputerach użytkowników. Przeglądarki obsługują je praktycznie od zawsze i każda strona, która chce śledzić zachowanie odwiedzających, korzysta z cookies – choćby do zapamiętywania wizyt, identyfikowania użytkowników czy przechowywania preferencji. Co istotne, ciasteczka działają po stronie klienta, więc idealnie nadają się do przechowywania niewielkich ilości informacji bez konieczności ciągłego odpytywania serwera. W praktyce branżowej cookies są fundamentem dla narzędzi analitycznych, takich jak Google Analytics – to właśnie tam są zapisywane unikalne identyfikatory użytkowników, sesji czy kanałów ruchu. Z mojego doświadczenia mogę dodać, że jeśli ktoś kiedyś chciałby zbudować własny system analityczny, to zacznie właśnie od ciasteczek, bo są łatwo dostępne przez JavaScript i bardzo dobrze wspierane przez standardy sieciowe (np. RFC 6265). Warto też pamiętać o kwestiach prywatności i RODO, bo dzisiaj strony muszą informować użytkowników o użyciu cookies. Niemniej, jeśli chodzi o mechanizm zbierania statystyk na komputerze użytkownika, to cookies są wręcz nie do zastąpienia.

Pytanie 27

Kod przedstawiony w języku XML/XAML określa:

<Switch
    android:id = "@+id/switch1"
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"
    android:background = "#00ffff"
    android:text = "Switch"
    tools:layout_editor_absoluteX = "176dp"
    tools:layout_editor_absoluteY = "389dp" />
A. listę rozwijaną
B. stepper
C. przełącznik
D. suwak
Kod przedstawiony w pytaniu to klasyczny przykład wykorzystania komponentu Switch w Androidzie. Switch, jak sama nazwa wskazuje, służy do przełączania między dwoma stanami — najczęściej włącz/wyłącz, aktywne/nieaktywne. Z punktu widzenia interfejsów mobilnych, przełącznik bardzo często znajduje zastosowanie w ustawieniach aplikacji, np. do szybkiego włączania trybu ciemnego, aktywacji powiadomień czy zezwalania na lokalizację. Ten konkretny xml zawiera podstawowe atrybuty, jak android:id, layout_width, layout_height oraz background, czyli kolor tła, co od razu sugeruje, że nie jest to np. dropdown czy suwak. Co ciekawe, Switch różni się od CheckBoxa tym, że wizualnie lepiej komunikuje zmianę trybu (przesuwający się znacznik), co moim zdaniem zwiększa użyteczność, szczególnie jeśli użytkownik ma szybko zrozumieć, co ustawia. Standardy Material Design wręcz zalecają stosowanie Switch do kontrolowania pojedynczych ustawień, bo jest to bardziej czytelne niż inne widgety. Warto pamiętać, że Switch ma różne warianty i można go rozbudować o obsługę zdarzeń onCheckedChangeListener w kodzie Java albo Kotlin, przez co staje się bardzo elastyczny. Odpowiedź przełącznik jest więc zgodna ze wszystkimi cechami tej kontrolki i jej zastosowaniami w praktyce.

Pytanie 28

Użycie modyfikatora abstract w definicji metody w klasie wskazuje, że

A. trzeba zaimplementować tę metodę w tej klasie
B. klasy pochodne nie mogą implementować tej metody
C. klasa ta stanowi podstawę dla innych klas
D. dziedziczenie po tej klasie jest niedozwolone
Niektóre z odpowiedzi mogą wydawać się na pierwszy rzut oka logiczne, ale wynikają raczej z nieprecyzyjnego rozumienia mechanizmów programowania obiektowego. Zacznijmy od tego, że użycie modyfikatora abstract w samej metodzie nigdy nie oznacza konieczności natychmiastowej implementacji tej metody w tej samej klasie – wręcz przeciwnie, to sygnał, że metoda nie ma jeszcze swojego kodu i zostanie dopiero zaimplementowana w klasie pochodnej. To właśnie klasy dziedziczące mają obowiązek dostarczyć konkretną wersję tej funkcji. Kolejna kwestia to dziedziczenie – modyfikator abstract w żadnym wypadku nie zabrania dziedziczenia po tej klasie, raczej wręcz przeciwnie, bo cała idea polega na tym, żeby posłużyć się taką klasą jako bazą do tworzenia wyspecjalizowanych klas pochodnych. Częstym błędem jest też zakładanie, że klasy pochodne nie mogą implementować tych metod – to zupełnie odwrotnie, bo właśnie po to te metody są abstrakcyjne, żeby wymusić ich nadpisanie. Zdarza się, że początkujący mylą pojęcia abstract i sealed/final (klasa zamknięta na dziedziczenie), co prowadzi do błędnych wniosków. Generalnie warto pamiętać, że modyfikator abstract jest narzędziem do budowania elastycznych, rozszerzalnych struktur kodu, gdzie część funkcjonalności jest celowo zostawiona do uzupełnienia przez potomków. To nie jest mechanizm ograniczający, tylko wręcz przeciwnie – otwierający drogę do projektowania uniwersalnych, przyszłościowych rozwiązań. Takie podejście jest szeroko stosowane w branży, np. w frameworkach czy bibliotekach, gdzie wielu developerów rozbudowuje istniejącą logikę o własną specyfikę działania.

Pytanie 29

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

A. dyskopatia
B. zespół cieśni kanału nadgarstka
C. kifoza
D. zespół suchego oka
Zespół cieśni kanału nadgarstka to jedna z najczęstszych chorób zawodowych wśród osób pracujących przy komputerze, zwłaszcza programistów czy grafików. Objawia się on bólem, drętwieniem oraz czasem nawet zaburzeniami czucia w obrębie pierwszych trzech palców ręki – dokładnie tak, jak opisano w pytaniu. Dzieje się tak dlatego, że nerw pośrodkowy, który przebiega przez wąski kanał w nadgarstku, jest uciskany na skutek długotrwałego powtarzania tych samych ruchów albo nieprawidłowego ułożenia dłoni na myszce czy klawiaturze. Moim zdaniem temat jest mega ważny, bo wiele osób bagatelizuje drobne drętwienia, a potem kończy się to nawet koniecznością zabiegu! W praktyce najlepiej stosować ergonomiczną klawiaturę i myszkę, robić krótkie przerwy co godzinę i ćwiczyć rozluźnianie nadgarstków. W branży IT coraz częściej zwraca się uwagę na profilaktykę tych schorzeń – nawet firmy zapewniają konsultacje z fizjoterapeutą, a niektórzy znajomi mają specjalne podkładki pod nadgarstki. No i jeszcze jedno – ignorowanie objawów może prowadzić do trwałego uszkodzenia nerwu, więc naprawdę warto od razu reagować na pierwsze sygnały. W literaturze branżowej (np. w wytycznych BHP dla programistów) podkreśla się, że ergonomiczne miejsce pracy i właściwe nawyki to klucz, żeby nie nabawić się tej przypadłości. Z mojego doświadczenia, nawet zmiana kąta nachylenia klawiatury potrafi zrobić dużą różnicę.

Pytanie 30

Który algorytm sortowania opiera się na metodzie "dziel i zwyciężaj"?

A. Sortowanie bąbelkowe
B. Sortowanie szybkie (QuickSort)
C. Sortowanie przez wybór
D. Sortowanie przez wstawianie
QuickSort to algorytm sortowania wykorzystujący podejście 'dziel i zwyciężaj', co oznacza, że dzieli tablicę na mniejsze części wokół elementu zwanego pivotem, a następnie rekurencyjnie sortuje każdą z tych części. Ta strategia pozwala na efektywne sortowanie dużych zbiorów danych w czasie O(n log n) w większości przypadków. Dziel i zwyciężaj to potężne narzędzie algorytmiczne, które znajduje zastosowanie w wielu innych algorytmach, takich jak Merge Sort i algorytmy wyszukiwania binarnego. QuickSort jest często używany w aplikacjach wymagających szybkiego przetwarzania dużych ilości danych.

Pytanie 31

Z podanej definicji pola licznik można wywnioskować, iż

class MojaKlasa
{
    private static int licznik;
    ...
A. bieżąca wartość pola jest wspólna dla wszystkich instancji klasy
B. bieżąca wartość pola jest wspólna dla wszystkich instancji klasy i nie może być zmieniana
C. pole nie może być zmieniane w kodzie klasy
D. pole jest związane z określoną instancją klasy i jego wartość jest unikalna tylko dla tej instancji
Warto się chwilę zatrzymać i przeanalizować, skąd biorą się błędne przekonania dotyczące pól statycznych. Bardzo częstym nieporozumieniem jest utożsamianie słowa static z czymś „niezmiennym” albo uniemożliwiającym modyfikacje. Tymczasem static oznacza tyle, że pole nie jest związane z pojedynczym obiektem, tylko z całą klasą – czyli wszystkie obiekty tej klasy dzielą jedną, wspólną wartość licznik. To nie jest tak, że static czyni pole stałym – żeby pole było niezmienne, potrzeba słowa kluczowego final (w Javie), a tutaj go ewidentnie nie ma. Często osoby początkujące mylą static z final i stąd pojawia się przekonanie, że pole nie może być modyfikowane – co nie jest prawdą. Równie błędne jest zakładanie, że każde pole, które nie jest static, jest automatycznie unikalne per instancja. Gdybyśmy usunęli static z definicji licznik, wtedy rzeczywiście każda instancja MojaKlasa miałaby swoją własną wersję tej zmiennej, ale w tym przypadku wszystkie obiekty współdzielą tę samą wartość. Jeszcze inny błąd to przekonanie, że pole prywatne (private) nie może być zmieniane w kodzie klasy – w rzeczywistości private ogranicza dostęp do pola tylko do wnętrza klasy, ale metody tej klasy mają pełne prawo je modyfikować. Tak więc, patrząc z perspektywy dobrych praktyk programistycznych i samej składni, static to po prostu cecha, która decyduje o zakresie współdzielenia pola pomiędzy instancjami, a nie o jego niezmienności czy widoczności na zewnątrz. Moim zdaniem kluczowe jest wyciągnięcie z tego wniosku, że static to współdzielenie, a nie blokada zmian – i na tym polega istota poprawnej odpowiedzi w tym pytaniu.

Pytanie 32

Jakiego kwalifikatora powinno się użyć dla metody, aby umożliwić do niej dostęp jedynie z wnętrza tej klasy oraz klas dziedziczących, a także, by metoda ta nie była dostępna w żadnej funkcji?

A. private
B. public
C. protected
D. reinterpret_cast
Wybór innego kwalifikatora niż protected jest dość częstym błędem, zwłaszcza wśród osób, które mają pierwszą styczność z programowaniem obiektowym w C++ czy Javie. public faktycznie pozwala na dostęp do metody wszędzie – zarówno z poziomu innych klas, funkcji globalnych, jak i z wnętrza klasy czy klas pochodnych. W praktyce oznacza to całkowity brak ograniczeń, co naraża kod na przypadkowe lub niepożądane użycie metody z zewnątrz. Z mojego doświadczenia wynika, że początkujący często wybierają public z przyzwyczajenia, nie zastanawiając się nad konsekwencjami. Z kolei private to już przeciwna skrajność – metoda z tym kwalifikatorem jest dostępna wyłącznie w obrębie tej klasy, nie ma do niej dostępu ani klasa dziedzicząca, ani żadna funkcja zewnętrzna. Wydaje się to bezpieczne, ale kiedy budujesz hierarchię klas, bardzo szybko okazuje się, że zamykasz sobie dostęp do przydatnych funkcji w podklasach, co bywa frustrujące i wymusza obejścia. reinterpret_cast natomiast nie jest żadnym kwalifikatorem dostępu, a po prostu operatorem rzutowania typów w C++. To narzędzie do bardzo specyficznych zadań, takich jak rzutowania wskaźników między niepowiązanymi typami – użycie go zamiast protected jest ewidentnym nieporozumieniem i wynika raczej z pomylenia pojęć niż z błędnej logiki. W sumie, największym problemem w tych odpowiedziach jest niezrozumienie zakresu widoczności, jaki oferują poszczególne kwalifikatory. Warto zawsze wrócić do podstaw i pamiętać, że właściwy dobór tych słów kluczowych ma ogromne znaczenie dla bezpieczeństwa i czytelności kodu. W profesjonalnych projektach zasadą jest: ograniczaj dostęp tak bardzo, jak to możliwe, i udostępniaj tylko tam, gdzie to konieczne – protected daje tu optymalny kompromis.

Pytanie 33

Które narzędzie służy do zarządzania zależnościami w projekcie JavaScript?

A. postman
B. npm
C. git
D. docker
npm, czyli Node Package Manager, jest kluczowym narzędziem w ekosystemie JavaScript, którego głównym celem jest zarządzanie zależnościami projektów. Umożliwia to instalowanie, aktualizowanie oraz usuwanie paczek (modułów), które są niezbędne do budowy aplikacji. Przykładowo, jeśli twój projekt wymaga biblioteki React, możesz ją łatwo zainstalować za pomocą polecenia `npm install react`, co automatycznie dodaje ją do pliku 'package.json', co ułatwia późniejsze zarządzanie wersjami. Dodatkowo, npm wspiera skrypty, co pozwala na automatyzację wielu procesów, takich jak testowanie czy budowanie aplikacji. Stosowanie npm jest zgodne z najlepszymi praktykami, ponieważ pozwala na utrzymanie spójności w projekcie oraz ułatwia współpracę zespołową, ułatwiając innym programistom instalowanie tych samych zależności w identycznych wersjach. Obecnie npm jest standardem wśród menedżerów pakietów dla JavaScript, co czyni go niezbędnym narzędziem dla każdego developera.

Pytanie 34

Jaką nazwę elementu interfejsu należy wprowadzić w pierwszej linii kodu, na miejscu <??? aby został on wyświetlony w podany sposób?

<???
    android:layout_margin="50dp"
    android:switchMinWidth="60dp"
    android:text="Zgadzasz się?"
    android:textOff="NIE"
    android:testOn="TAK" />
Ilustracja do pytania
A. Spinner
B. RatingBar
C. SeekBar
D. Switch
Switch to bardzo charakterystyczny element interfejsu Androida, który służy do przełączania między dwoma stanami, np. włącz/wyłącz, tak/nie. Na screenie wyraźnie widać typowy suwak z okrągłym przyciskiem, który przemieszcza się na boki – dokładnie tak działa Switch. W kodzie XML także pojawiają się atrybuty takie jak text, textOff, textOn – one są właściwe właśnie dla komponentu Switch, bo pozwalają podpisać każdy ze stanów na przełączniku. Praktycznie w każdej nowoczesnej aplikacji spotyka się Switcha do wyrażania zgody, akceptacji regulaminu albo przełączania opcji (np. tryb ciemny). Z mojego doświadczenia to jest dużo wygodniejsze dla użytkownika niż klasyczne checkboxy, bo od razu widać, który stan jest aktywny – a UX-owcy też bardzo to chwalą. Warto pamiętać, że Switch ma swoje domyślne style zgodne z Material Design, więc aplikacja wygląda nowocześnie bez dodatkowej pracy. Dobrą praktyką jest wykorzystywanie Switcha właśnie wtedy, gdy potrzebujemy zmiany binarnej, a nie kilku opcji do wyboru. Jeśli ktoś myśli o bardziej zaawansowanych interfejsach, to Switch pozwala łatwo reagować na zmianę stanu w kodzie Java/Kotlin poprzez listener OnCheckedChangeListener. No i jest to jeden z tych komponentów, które naprawdę warto znać, bo są podstawą w każdym projekcie mobilnym.

Pytanie 35

Jakie narzędzie programowe jest odpowiedzialne za konwersję kodu źródłowego na formę zrozumiałą dla maszyny, weryfikuje wszystkie polecenia pod kątem ewentualnych błędów, a następnie generuje moduł do wykonania?

A. interpreter
B. debugger
C. kompilator
D. dekompilator
Wybór narzędzi takich jak interpreter, debugger czy dekompilator jako odpowiedzi na to pytanie wynika często z niepełnego rozumienia ich rzeczywistej roli w procesie programowania. Interpreter, choć rzeczywiście przetwarza kod źródłowy, robi to w zupełnie inny sposób niż kompilator – tłumaczy instrukcje linia po linii w trakcie wykonywania, przez co nie generuje trwałego pliku wykonywalnego. To dobre rozwiązanie na etapie szybkiego prototypowania czy pracy z językami skryptowymi typu Python, ale nie nadaje się w sytuacjach, gdzie zależy nam na pełnej weryfikacji kodu i zoptymalizowanym pliku wynikowym. Debugger natomiast jest całkowicie osobnym narzędziem – jego rolą jest analiza działania już napisanego programu. Pozwala zatrzymać wykonanie, sprawdzić wartości zmiennych, wyłapać tzw. bugi – co jest nieocenione w pracy nad większymi projektami. Jednak debugger nie tłumaczy kodu, ani nie tworzy plików wykonywalnych, więc nie odpowiada za żadną formę translacji kodu źródłowego na kod maszynowy. Z kolei dekompilator to narzędzie służące do procesu odwrotnego niż kompilacja – próbuje z kodu maszynowego lub bajt-kodu wygenerować kod źródłowy, co jest wykorzystywane np. przy analizie programów bez dostępu do oryginalnych źródeł. Myślenie, że te narzędzia odpowiadają za kompilację, to dość częsty błąd, szczególnie na początku nauki programowania – czasem łatwo pomylić działania narzędzi, które mają styczność z kodem na różnych etapach jego życia. W praktyce, gdy mówimy o weryfikacji kodu pod kątem błędów i generowaniu pliku do uruchomienia, jedynym narzędziem spełniającym te wymagania jest kompilator. To on realizuje standardy języków programowania i dba o to, by efekt końcowy był nie tylko poprawny, ale też wydajny i zgodny z oczekiwaniami użytkownika.

Pytanie 36

W przedsiębiorstwie IT obowiązują określone zasady dotyczące zarządzania projektami, co wskazuje, że firma wykorzystuje model zarządzania

  • Prace dzielimy na sprinty 1 tygodniowe.
  • Każdy sprint obejmuje mały fragment funkcjonalności aplikacji.
  • Sprint rozpoczynamy od podziału prac i dyskusji.
  • Sprint kończymy na zatwierdzeniu testów przez klienta.
A. spiralny
B. zwinny
C. kaskadowy
D. prototypowy
Wybrałeś zarządzanie zwinne – i to jest strzał w dziesiątkę. W praktyce, podejścia zwinne, jak Scrum czy Kanban, opierają się właśnie na podziale pracy na krótkie iteracje, czyli tzw. sprinty. W opisie z pytania mamy tygodniowe sprinty, czyli czas, gdy zespół skupia się na realizacji konkretnego, małego fragmentu produktu. Rozpoczęcie sprintu to planowanie i dyskusja w zespole, a zakończenie – akceptacja przez klienta, zazwyczaj po przeprowadzeniu testów. Takie podejście jest w IT bardzo cenione, bo pozwala szybko reagować na zmiany i stale dostarczać działające fragmenty aplikacji. Z mojego doświadczenia, firmy IT prawie zawsze wybierają taki model, jeśli klient wymaga elastyczności. Typowe dla zwinnnych metod są też codzienne spotkania (daily stand-up), retrospektywy i bliski kontakt z klientem, który daje feedback na bieżąco. Warto wiedzieć, że metody zwinne są opisane np. w Agile Manifesto i są rekomendowane przez wiele organizacji branżowych, takich jak PMI Agile czy Scrum.org. Dzięki temu zespoły mogą szybciej dostarczać wartość, minimalizować ryzyko i lepiej zarządzać wymaganiami klienta. Co istotne, zwinność to nie tylko sposób pracy, ale cały sposób myślenia o projekcie – nastawienie na ciągłą poprawę i współpracę. Tak naprawdę, większość nowoczesnych projektów IT nie wyobraża sobie dziś pracy inaczej niż w modelu zwinnym.

Pytanie 37

Jaki rodzaj licencji umożliwia dowolne zmienianie oraz rozpowszechnianie kodu źródłowego?

A. Licencja OEM
B. Licencja komercyjna
C. Licencja shareware
D. Licencja GNU GPL
Licencja komercyjna ogranicza możliwość modyfikacji kodu i zazwyczaj wymaga zakupu oprogramowania na określonych warunkach. Licencja shareware pozwala na testowanie oprogramowania przed zakupem, ale nie uprawnia do modyfikacji ani redystrybucji kodu. Licencja OEM (Original Equipment Manufacturer) jest związana z oprogramowaniem dostarczanym przez producenta sprzętu i ogranicza możliwość instalacji na innym urządzeniu lub modyfikacji kodu źródłowego.

Pytanie 38

Który z języków programowania jest powszechnie stosowany do tworzenia interfejsów użytkownika przy użyciu XAML?

A. Java
B. C#
C. C++
D. Objective-C
C++ jest często używany do tworzenia aplikacji desktopowych, ale w przypadku interfejsów użytkownika XAML jest bardziej związany z C#. Java jest językiem wykorzystywanym głównie do tworzenia aplikacji na Androida oraz aplikacji webowych i backendowych, ale nie jest typowo używany do programowania interfejsów w XAML. Objective-C to starszy język programowania dla systemów Apple i nie jest związany z XAML, który jest specyficzny dla technologii Microsoftu.

Pytanie 39

Jakie oprogramowanie służy jako przykład programu do komunikacji audio-wideo?

A. Slack
B. Microsoft Teams
C. Notion
D. Google Drive
Microsoft Teams to naprawdę fajne narzędzie do komunikacji. Łączy w sobie czat, wideo i audio, więc wszystko masz w jednym miejscu. Zostało stworzone przez Microsoft, żeby ułatwić współpracę w zespołach. To idealne, gdy trzeba prowadzić spotkania online z kilkoma osobami. Myślę, że to super rozwiązanie dla firm, które pracują zdalnie. Dzięki WebRTC jakość transmisji audio i wideo jest naprawdę wysoka. Można w nim organizować spotkania, webinary, a nawet stworzyć przestrzeń dla zespołów projektowych, gdzie można dzielić się plikami i prowadzić dyskusje. A jak jeszcze połączysz go z innymi aplikacjami Microsoft 365, jak OneNote czy SharePoint, to masz pełny zestaw do zarządzania projektami. Dobrze też, że Microsoft Teams dba o ochronę danych osobowych, więc jest bezpieczny dla różnych organizacji.

Pytanie 40

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. 6
B. 596
C. 5.96
D. 5
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.