Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 8 czerwca 2026 16:15
  • Data zakończenia: 8 czerwca 2026 16:30

Egzamin zdany!

Wynik: 25/40 punktów (62,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

Jaki jest zasadniczy cel ataku phishingowego?

A. Kradzież haseł z pamięci operacyjnej urządzenia
B. Uniemożliwienie dostępu do usług internetowych
C. Zbieranie danych osobowych za pomocą podszywających się stron lub wiadomości
D. Zakłócanie pracy sieci przez nadmiarowe zapytania
Głównym celem ataku phishingowego jest przejęcie danych osobowych ofiary, co realizowane jest poprzez wykorzystanie fałszywych stron internetowych lub wiadomości. Atakujący tworzą atrakcyjne i wiarygodne kopie legalnych stron, często podszywając się pod znane instytucje bankowe, portale społecznościowe czy serwisy e-commerce. Użytkownik, nieświadomy zagrożenia, wprowadza swoje dane logowania, numery kart kredytowych lub inne wrażliwe informacje, które trafiają w ręce cyberprzestępców. Aby ułatwić ten proces, phisherzy często wykorzystują techniki inżynierii społecznej, takie jak fałszywe powiadomienia o konieczności weryfikacji konta. Przykłady skutecznych ataków phishingowych obejmują kampanie wysyłania e-maili, które informują użytkowników o rzekomych problemach z kontem, kierując ich na podszyte strony. Standardy bezpieczeństwa, takie jak DMARC, SPF i DKIM, są kluczowe dla ochrony przed tego rodzaju atakami, jednak ich brak lub niewłaściwe wdrożenie zwiększa podatność na phishing.

Pytanie 2

W systemie RGB kolor Pale Green przedstawia się jako RGB(152, 251, 152). Jaki jest szesnastkowy kod tego koloru?

A. AO FB AO
B. AO FE AO
C. 98 FE98
D. 98FB98
Kolor Pale Green w systemie RGB jest reprezentowany przez wartości RGB(152, 251, 152). Aby przekształcić te wartości na format szesnastkowy, należy każdy z komponentów koloru (czerwony, zielony, niebieski) przekształcić na format heksadecymalny. Wartość 152 w systemie dziesiętnym odpowiada 98 w systemie szesnastkowym, a 251 w systemie dziesiętnym odpowiada FE w systemie szesnastkowym. Dlatego, łącząc te wartości w kolejności od komponentu czerwonego, zielonego, do niebieskiego, uzyskujemy kod szesnastkowy 98FE98. Kod ten może być używany w projektach graficznych oraz w CSS do definiowania kolorów tła, tekstów i innych elementów. Użycie formatu szesnastkowego w projektowaniu stron internetowych oraz w aplikacjach jest zgodne z zasadami standardu W3C dotyczącego kolorów w HTML i CSS, co zapewnia spójność wizualną i ułatwia pracę z kolorami.

Pytanie 3

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

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

Pytanie 4

Jakie narzędzie najlepiej sprawdza się w przekształcaniu liczby szesnastkowej na binarną?

A. Program do edycji tekstu
B. Kalkulator programisty
C. Aplikacja internetowa
D. Program do arkuszy kalkulacyjnych
Kalkulator programisty jest najbardziej odpowiednim narzędziem do konwersji liczby szesnastkowej na binarną ze względu na swoje wyspecjalizowane funkcje matematyczne i programistyczne. Narzędzia te umożliwiają użytkownikom łatwe przekształcanie różnych systemów liczbowych, w tym konwersji z systemu szesnastkowego (hex) na system binarny. Kalkulatory programistyczne często zawierają dedykowane opcje dla konwersji liczbowej, co pozwala na szybkie i dokładne uzyskanie wyników bez potrzeby stosowania skomplikowanych algorytmów lub wzorów. Na przykład, aby przekształcić liczbę szesnastkową '1A' na binarną, użytkownik wprowadza '1A' do kalkulatora, a wynik '00011010' zostaje automatycznie wygenerowany. Dodatkowo, wiele kalkulatorów programistycznych jest zgodnych z międzynarodowymi standardami, co zapewnia ich wiarygodność w obliczeniach. Warto również zauważyć, że kalkulatory programistyczne mogą obsługiwać konwersje z różnych systemów liczbowych, co czyni je wszechstronnym narzędziem w pracy z danymi cyfrowymi i kodowaniem. Dzięki temu, kalkulator programisty stanowi idealne rozwiązanie dla programistów i inżynierów, którzy regularnie pracują z różnymi formatami danych.

Pytanie 5

Jak określa się proces, w trakcie którego klasa przejmuje właściwości innej klasy w programowaniu obiektowym?

A. Polimorfizm
B. Abstrakcja
C. Hermetyzacja
D. Dziedziczenie
Dziedziczenie to kluczowa cecha programowania obiektowego (OOP), która pozwala jednej klasie (klasie pochodnej) przejmować cechy i zachowania innej klasy (klasy bazowej). Dzięki dziedziczeniu można wielokrotnie wykorzystywać kod, co prowadzi do większej modularności i zmniejszenia redundancji. Dziedziczenie umożliwia rozszerzanie funkcjonalności klas bazowych poprzez dodawanie nowych metod lub modyfikowanie istniejących, bez konieczności ingerencji w oryginalny kod. Przykład w C++: `class Pojazd { ... }; class Samochod : public Pojazd { ... };` – `Samochod` dziedziczy wszystkie publiczne i chronione (protected) elementy klasy `Pojazd`.

Pytanie 6

W zestawieniu zaprezentowano doświadczenie zawodowe pracowników firmy IT. Do stworzenia aplikacji front-end powinien/powinna zostać wyznaczony/a

PracownikZnajomość technologii lub programów
AnnaInkscape, Corel Draw
KrzysztofAngular
PatrykHTML, CSS
EwaDjango, .NET
A. Anna
B. Krzysztof
C. Patryk
D. Ewa
Krzysztof to naprawdę świetny wybór na budowę aplikacji front-end, bo zna Angulara, który jest jednym z najpopularniejszych frameworków do aplikacji jednostronicowych. Dzięki Angularowi można tworzyć dynamiczne i responsywne interfejsy, co jest mega ważne w projektach front-end. Ogólnie rzecz biorąc, ten framework opiera się na komponentach, co zdecydowanie ułatwia pracę z kodem i pozwala na jego ponowne wykorzystanie. W połączeniu z TypeScriptem, Angular daje duże możliwości, bo mocne typowanie zmniejsza ryzyko błędów i poprawia czytelność kodu. Zrozumienie, jak działa aplikacja i jakie są dobre praktyki, takie jak modularność czy testowanie, też jest istotne, żeby wykorzystać Angulara w pełni. Krzysztof ma tę wiedzę i potrafi wdrażać najlepsze praktyki, jak architektura MVC, co sprawia, że aplikacje są bardziej skalowalne i łatwiejsze w utrzymaniu. Dodatkowo, Angular robi też sporo, żeby aplikacje działały szybko, co jest ważne dla doświadczenia użytkownika. Dlatego wybierając Krzysztofa, mamy pewność, że projekt będzie zgodny z nowymi standardami i spełni oczekiwania użytkowników w zakresie interfejsu.

Pytanie 7

Programem służącym do monitorowania błędów oraz organizacji projektów jest:

A. Jira
B. Jasmine
C. Git
D. Bugzilla
Jira to narzędzie, które zdecydowanie wyróżnia się w kwestii zarządzania projektami programistycznymi oraz monitorowania błędów. Z mojego doświadczenia wynika, że praktycznie każda większa firma IT używa Jiry do śledzenia zgłoszeń, tzw. ticketów, które mogą dotyczyć zarówno zadań, jak i błędów do naprawienia. Co istotne, Jira pozwala na bardzo rozbudowaną konfigurację – można tworzyć workflow, automatyzować przypisania zadań, integrować ją z repozytoriami kodów (np. GitHub, Bitbucket), testami automatycznymi, a nawet narzędziami do continuous integration. Standardem branżowym jest prowadzenie rejestru błędów (bug tracker) i backlogu zadań właśnie w Jirze, bo wszystko odbywa się w jednym miejscu, a zespół ma przejrzysty widok postępów. Bardzo fajna jest opcja generowania raportów – łatwo można sprawdzić, ile błędów zostało naprawionych, ile czeka na poprawki czy jak poszczególni członkowie zespołu realizują swoje zadania. Jira jest też zgodna z metodykami Agile, np. Scrum czy Kanban, co dodatkowo ułatwia zarządzanie sprintami, planowanie i retrospektywy. Uważam, że znajomość tego narzędzia to podstawa dla każdego, kto myśli o pracy w branży IT na poważnie. Warto też wiedzieć, że Jira obsługuje zarówno małe zespoły, jak i międzynarodowe projekty, bo jest bardzo skalowalna i można ją dostosować praktycznie do każdego procesu.

Pytanie 8

Co to jest Docker?

A. System zarządzania bazami danych
B. Framework JavaScript do tworzenia aplikacji mobilnych
C. Narzędzie do automatyzacji procesu tworzenia dokumentacji
D. Platforma do tworzenia, wdrażania i uruchamiania aplikacji w kontenerach
Docker to platforma, która umożliwia tworzenie, wdrażanie i uruchamianie aplikacji w kontenerach. Kontenery to lekkie, przenośne jednostki, które zawierają wszystko, co potrzebne do uruchomienia aplikacji, w tym kod źródłowy, biblioteki i zależności. Dzięki Dockerowi programiści mogą łatwo tworzyć środowiska, które są zgodne z produkcją, co zmniejsza ryzyko błędów związanych z różnicami między tymi środowiskami. Przykładowo, jeśli tworzysz aplikację webową, możesz użyć Dockera do uruchomienia bazy danych w kontenerze, co pozwala na łatwe zarządzanie jej wersjami oraz konfiguracją. Docker staje się standardem w wielu firmach i projektach open source, ponieważ umożliwia szybsze wdrażanie aplikacji oraz automatyzację wielu procesów. Dzięki konteneryzacji można również łatwo skalować aplikacje, co jest niezwykle ważne w przypadku rosnącego ruchu użytkowników.

Pytanie 9

Która z poniższych nie jest zasadą czystego kodu (clean code)?

A. Jedna odpowiedzialność funkcji
B. Maksymalna złożoność funkcji
C. Konsekwentne nazewnictwo
D. Samodokumentujący się kod
Maksymalna złożoność funkcji to pojęcie, które odnosi się do zasady, że funkcje powinny być jak najmniej złożone, aby były zrozumiałe i łatwe w utrzymaniu. Czysty kod promuje ideę, że każda funkcja powinna mieć jasno określoną odpowiedzialność, co w praktyce oznacza ograniczenie jej złożoności. Przykładem może być rozdzielenie złożonej logiki biznesowej na kilka prostszych funkcji, co ułatwia ich testowanie i ponowne wykorzystanie. Warto zwrócić uwagę, że zgodnie z zasadą KISS (Keep It Simple, Stupid) dąży się do prostoty w projektowaniu kodu, co nie tylko zwiększa jego czytelność, ale także minimalizuje ryzyko błędów. Dobrze napisany kod powinien być również samodokumentujący się, co oznacza, że jego struktura i nazwy zmiennych powinny jasno wskazywać na ich funkcjonalność. Przestrzeganie zasady maksymalnej złożoności funkcji jest kluczowe w kontekście długoterminowego utrzymania aplikacji, ponieważ zmniejsza koszty związane z modyfikacjami oraz poprawkami.

Pytanie 10

Celem mechanizmu obietnic (ang. promises) w języku JavaScript jest

A. zastąpienie mechanizmu dziedziczenia w programowaniu obiektowym
B. zarządzanie funkcjonalnością związaną z kodem asynchronicznym
C. ulepszenie czytelności kodu synchronicznego
D. zarządzanie przechwytywaniem błędów aplikacji
Często można się pogubić, czym dokładnie są promises w JavaScript, zwłaszcza jeśli ktoś kojarzy je luźno z innymi mechanizmami programowania obiektowego czy obsługą błędów. Promises mają swoje korzenie w potrzebie efektywnego zarządzania asynchronicznością, czyli wykonywaniem operacji, które nie kończą się od razu, na przykład pobieraniem danych z sieci czy operacjami wejścia-wyjścia. To, że promises jakoś „ulepszają czytelność kodu synchronicznego”, jest trochę nadinterpretacją – bo one nie poprawiają kodu synchronicznego, tylko asynchroniczny czynią bardziej czytelnym. Dziedziczenie w programowaniu obiektowym, zarówno prototypowe, jak i klasyczne, to zupełnie inna para kaloszy – promises nie mają nic wspólnego z zastępowaniem tych mechanizmów, bo ich zadaniem nie jest kształtowanie struktury obiektów, a raczej kontrolowanie przepływu kodu w czasie. Zarządzanie przechwytywaniem błędów też nie jest głównym celem promises – choć rzeczywiście pozwalają na łatwiejszą obsługę błędów w kodzie asynchronicznym poprzez catch(), to jednak nie są uniwersalnym systemem zarządzania wyjątkami. Typowym błędem myślowym jest też mylenie promises z callbackami lub myślenie, że rozwiązują one wszystkie problemy związane z błędami – a to nie do końca prawda, bo promise jedynie porządkuje asynchroniczność i pozwala na prostsze reakcji na sukcesy i porażki asynchronicznych operacji. W praktyce promises to nie magiczna broń na wszystko, tylko bardzo sprytne narzędzie do ogarnięcia operacji nieblokujących w sposób czytelny, przewidywalny i zgodny ze współczesnymi standardami branżowymi.

Pytanie 11

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

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

Pytanie 12

Wskaż algorytm sortowania, który nie jest stabilny?

A. sortowanie przez zliczanie
B. sortowanie bąbelkowe
C. sortowanie szybkie
D. sortowanie przez wstawianie
Sortowanie szybkie (Quick Sort) to algorytm, który faktycznie nie jest stabilny w swojej podstawowej wersji. To znaczy, jeśli w kolekcji są dwa identyczne elementy pod względem klucza sortowania, po wykonaniu Quick Sort ich kolejność względem siebie może się zmienić. Z moich doświadczeń wynika, że to może mieć znaczenie, na przykład gdy sortujemy obiekty według jednego pola, ale chcemy zachować kolejność według innego – czasem w praktyce, np. przy obsłudze rekordów w bazach danych, stabilność sortowania gwarantuje spójność wyników. Quick Sort jest jednak bardzo popularny, bo ogólnie działa bardzo szybko i jest efektywny pamięciowo, stąd często go się używa tam, gdzie stabilność nie jest wymagana. W niektórych implementacjach można próbować uczynić Quick Sort stabilnym, ale wymaga to dodatkowych zabiegów i nie jest standardem – biblioteki standardowe (np. C++ std::sort) właśnie z tego powodu nie gwarantują stabilności Quick Sorta. W praktycznych projektach, jeśli zależy Ci na stabilności, lepiej użyć sortowania przez wstawianie lub przez zliczanie. Sortowanie bąbelkowe i przez wstawianie są wręcz typowe do nauki stabilnych algorytmów, a sortowanie przez zliczanie nawet dla dużych zbiorów cały czas pilnuje kolejności równych elementów. Quick Sort jest świetny, ale warto znać jego ograniczenia, szczególnie w aplikacjach biznesowych albo pracy z dużymi, złożonymi strukturami danych.

Pytanie 13

Jakie są kluczowe zasady WCAG 2.0?

A. Elastyczna, prosta, przejrzysta, trwała
B. Ewolucyjna, interaktywna, efektywna
C. Percepcyjna, operacyjna, zrozumiała, solidna
D. Dostosowana, błyskawiczna, mobilna, dostępna
Niepoprawne odpowiedzi nie odzwierciedlają kluczowych zasad WCAG 2.0. Pierwsza z nich, określająca elementy jako postępowe, responsywne, efektywne, nie ujęła fundamentalnych wymogów dotyczących dostępności. Postępowe i responsywne odnoszą się bardziej do designu i wydajności strony, a nie do jej dostępności dla osób z różnymi niepełnosprawnościami. Wymagania dotyczące percepcji i interakcji z treścią są kluczowe dla WCAG 2.0, ale nie są poruszane w tej opcji. Kolejna odpowiedź wskazuje na cechy: dostosowana, szybka, mobilna, dostępna, co również nie odpowiada zasadom WCAG. Użyte terminy nie koncentrują się na dostępności treści, a bardziej na wydajności i dostosowywaniu do urządzeń mobilnych, pomijając kluczowe aspekty związane z percepcją i interaktywnością. Ostatnia niepoprawna odpowiedź, która zawiera elastyczność, prostotę, przejrzystość i trwałość, również nie odpowiada rzeczywistym zasadom WCAG. Choć te cechy są pożądane w projektowaniu stron internetowych, nie są częścią formalnych zasad WCAG, które koncentrują się na konkretnej dostępności treści dla osób z ograniczeniami. W rezultacie, te odpowiedzi nie spełniają wymaganych kryteriów dostępności.

Pytanie 14

Jakie pola powinny być umieszczone w klasie nadrzędnej w strukturze dziedziczenia?

A. Pola, które są wykorzystywane tylko w funkcjach statycznych
B. Pola, które są charakterystyczne jedynie dla pojedynczej klasy pochodnej
C. Pola, które są wspólne dla wszystkich klas pochodnych
D. Pola, które są tylko prywatne
W klasie bazowej w hierarchii dziedziczenia umieszcza się pola, które są wspólne dla wszystkich klas pochodnych. Dzięki temu klasy pochodne mogą dziedziczyć te same właściwości, co eliminuje konieczność ich wielokrotnego definiowania. Jest to jedna z głównych zalet programowania obiektowego, umożliwiająca reużywalność kodu i zwiększenie spójności w projekcie. Przykładem może być klasa 'Pracownik', która zawiera pola takie jak 'imię', 'nazwisko' i 'wynagrodzenie', a klasy pochodne, takie jak 'Inżynier' czy 'Księgowy', mogą dziedziczyć te same pola, dodając jedynie specyficzne właściwości dla swojej roli.

Pytanie 15

Co to jest framework?

A. platforma programistyczna oferująca określone komponenty oraz narzucająca szkielet lub metodologię tworzenia aplikacji
B. oprogramowanie, które za pomocą metody drag and drop pozwala na stworzenie interfejsu aplikacji
C. narzędzie przeznaczone do opracowywania, edytowania, testowania i uruchamiania oprogramowania
D. zbiór procedur, danych oraz złożonych typów danych używanych w kodzie źródłowym aplikacji
Framework to coś więcej niż zwykły zestaw bibliotek czy narzędzi. To cała platforma programistyczna, która oferuje gotowe komponenty, ale przede wszystkim narzuca określony sposób tworzenia aplikacji – taki szkielet, według którego trzeba się poruszać. Przykładowo, w świecie frontendu świetnym przypadkiem jest React albo Angular. Programista nie pisze wszystkiego od zera, tylko korzysta z gotowych mechanizmów, jak obsługa routingu, zarządzanie stanem czy komponenty UI. Ale framework wymusza też określony styl pracy – określa, gdzie i w jaki sposób powinny być implementowane poszczególne elementy aplikacji (np. kontrolery, modele, widoki, serwisy). Z mojego doświadczenia to bardzo ułatwia rozwój większych projektów, bo narzuca porządek i pozwala trzymać się dobrych praktyk. Taka architektura jest zgodna ze standardami branżowymi – jak MVC czy architektura warstwowa. Dobrze zaprojektowany framework pozwala skupić się na logice biznesowej zamiast na technikaliach i powtarzalnych zadaniach. W praktyce bardzo przyspiesza wdrożenie zespołu i utrzymanie projektu, bo każdy wie, czego się spodziewać po strukturze kodu. To trochę jak korzystanie z planu budynku zamiast budowania domku bez projektu – mniej chaosu, więcej przewidywalności.

Pytanie 16

Który z poniższych opisów najlepiej charakteryzuje system informatyczny?

A. Zbiór urządzeń technicznych używanych w pracy biurowej
B. Sieć komputerowa, która umożliwia komunikację pomiędzy użytkownikami
C. Oprogramowanie wspierające jedynie zarządzanie danymi osobowymi
D. Zespół ludzi, procedur, oprogramowania i sprzętu służący do przetwarzania danych
Pierwsza z niepoprawnych odpowiedzi definiuje system informatyczny jedynie jako zespół urządzeń technicznych używanych do pracy biurowej. Tego rodzaju podejście jest zbyt wąskie i nie obejmuje istotnych elementów, takich jak ludzie i procedury, które są kluczowe w kontekście przetwarzania danych. Oprogramowanie i procedury są równie ważne, ponieważ stanowią podstawę dla skutecznego działania systemu informatycznego. Kolejna odpowiedź ogranicza się wyłącznie do oprogramowania wspierającego zarządzanie danymi osobowymi, co również jest nieprawidłowe. Systemy informatyczne są zdecydowanie bardziej złożone i obejmują szereg funkcjonalności, takich jak zarządzanie procesami, analizę biznesową czy integrację z innymi systemami. Ostatnia odpowiedź odnosi się do sieci komputerowej, co jest tylko jednym z komponentów systemu informatycznego. Sieć komputerowa może być wykorzystywana do komunikacji, ale nie definiuje całego systemu, ponieważ brak w niej odniesienia do ludzi, procedur i oprogramowania, które są kluczowe dla pełnego zrozumienia roli systemu informatycznego w organizacji.

Pytanie 17

Wskaż poprawny komentarz jednoliniowy, który można dodać w linii 3 w miejscu znaków zapytania, aby był zgodny ze składnią i opisywał operację przeprowadzaną w tej linii?

string[] langs = {"C++", "C#", "Java", "Python"};
foreach (string i in langs) {
    Console.WriteLine(i);    ???
}
A. // wypełnienie elementu tablicy
B. # wypełnienie elementu tablicy
C. // wyświetlenie elementu tablicy
D. # wyświetlenie elementu tablicy
Odpowiedź // wyswietlenie elementu tablicy jest poprawna, ponieważ komentarze jednoliniowe w języku C# rozpoczynają się od dwóch ukośników: //. W tym przypadku linia Console.WriteLine(i); odpowiedzialna jest za wyświetlenie elementu tablicy na konsoli. Komentarz ten poprawnie opisuje, co robi dana linia kodu, co jest dobrą praktyką w programowaniu, ponieważ ułatwia zrozumienie funkcji kodu innym programistom lub nawet nam samym w przyszłości. Komentarze są szczególnie przydatne, gdy kod jest skomplikowany i wymaga wyjaśnień. Warto zawsze stosować komentarze, by opisywały one istotne fragmenty kodu, co znacząco zwiększa jego czytelność i utrzymywalność. Praktyka dodawania takich opisów jest zgodna z zasadami czystego kodu, które promują czytelność i zrozumiałość. Dzięki takim komentarzom osoby przeglądające kod mogą szybko zorientować się, jakie funkcje pełnią poszczególne jego fragmenty, co usprawnia proces debugowania i dalszego rozwoju oprogramowania.

Pytanie 18

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

A. Sortowanie przez wstawianie
B. Sortowanie szybkie (QuickSort)
C. Sortowanie przez wybór
D. Sortowanie bąbelkowe
Sortowanie przez wybór polega na wyszukiwaniu najmniejszego elementu w każdej iteracji i umieszczaniu go na początku tablicy, co prowadzi do złożoności O(n²). Sortowanie bąbelkowe również działa w czasie O(n²) i nie wykorzystuje strategii dziel i zwyciężaj. Sortowanie przez wstawianie polega na stopniowym umieszczaniu elementów w odpowiedniej pozycji, ale nie dzieli tablicy na mniejsze części jak QuickSort, co sprawia, że jest mniej wydajne dla dużych zbiorów danych.

Pytanie 19

Jaką instrukcję należy wykorzystać do poprawnej deklaracji zmiennej typu string w C++?

A. string name = "Jan"
B. bool name = "Jan"
C. int name = "Jan"
D. float name = "Jan"
Ta deklaracja 'string name = "Jan"' to naprawdę dobry sposób na zdefiniowanie zmiennej łańcuchowej w C++. Wiesz, 'string' to typ danych, 'name' to nazwa tej zmiennej, a 'Jan' to wartość, która jest jej przypisana. Typ 'string' jest częścią biblioteki <string> i daje nam wiele możliwości, gdy pracujemy z tekstem. Możemy łączyć, porównywać i modyfikować różne łańcuchy znaków bez większego problemu. To jest mega ważne w aplikacjach, które mają do czynienia z danymi tekstowymi, interfejsami użytkownika czy analizą danych, które wprowadzamy.

Pytanie 20

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

A. Sortowanie przez wstawianie
B. Sortowanie szybkie (QuickSort)
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 21

Sposób deklaracji Klasa2 wskazuje, że

W C++ i C#:
class Klasa2 : Klasa1
W Java:
class Klasa2 extends Klasa1
W Python:
class Klasa2(Klasa1):
A. Klasa1 dziedziczy od Klasa2
B. Klasa2 dziedziczy od Klasa1
C. Klasa2 stanowi klasę bazową
D. Klasa1 jest dzieckiem Klasy2
Deklaracja Klasa2 jako klasy dziedziczącej po Klasa1 oznacza, że Klasa2 przejmuje wszystkie publiczne i chronione (protected) pola oraz metody klasy bazowej (Klasa1). Dziedziczenie to jeden z filarów programowania obiektowego, który umożliwia ponowne wykorzystanie kodu i rozszerzanie funkcjonalności istniejących klas. Dzięki temu Klasa2 może nie tylko korzystać z metod Klasa1, ale także nadpisywać je, co jest kluczowe dla implementacji polimorfizmu. Dziedziczenie pozwala na budowanie hierarchii klas, co prowadzi do lepszego zarządzania kodem i ułatwia jego skalowalność. Przykładem może być klasa Pojazd, z której dziedziczy klasa Samochod, rozszerzając jej funkcjonalność o dodatkowe cechy i metody specyficzne dla samochodów.

Pytanie 22

Która z metodologii w zarządzaniu projektami umożliwia łatwe dostosowywanie się do zmieniających się potrzeb klienta?

A. Scrum
B. Model spiralny
C. Model Waterfall
D. Kanban
Waterfall to model sekwencyjny, który nie zakłada elastyczności – raz określone wymagania muszą być zrealizowane zgodnie z pierwotnym planem, co utrudnia adaptację do zmian. Kanban umożliwia optymalizację przepływu pracy, ale nie kładzie tak dużego nacisku na iteracyjne dostarczanie funkcjonalności jak Scrum. Model spiralny łączy prototypowanie i iteracje, ale jego struktura nie jest tak elastyczna jak w przypadku Scruma, gdzie zmiany mogą być wprowadzane niemal na każdym etapie sprintu.

Pytanie 23

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

A. kod Java
B. obsługa wciśniętego przycisku
C. obsługa przycisku ekranu dotykowego
D. kod XML
Często można się pomylić, sądząc, że narzędzia do projektowania interfejsów użytkownika generują od razu kod w takich językach jak Java czy implementują obsługę konkretnych zdarzeń, np. wciśnięcia przycisku. Z mojego doświadczenia wynika, że to jeden z najczęstszych błędów myślowych na początku nauki programowania. W praktyce, narzędzia typu drag&drop koncentrują się na warstwie prezentacyjnej – opisują, jak mają wyglądać poszczególne elementy, ale nie zajmują się logiką działania. Kod Java albo inny kod źródłowy odpowiedzialny za obsługę zdarzeń czy funkcjonalności aplikacji musi być dopisany ręcznie przez programistę. Automatyczne generowanie kodu logicznego przez edytory graficzne jest raczej niezalecane, bo prowadzi do trudnego w utrzymaniu kodu i sprawia, że aplikacja traci na przejrzystości. Jeśli chodzi o obsługę wciśnięcia przycisku czy przycisku ekranu dotykowego, to są to akcje, które definiuje się później w kodzie źródłowym – na przykład poprzez implementację listenerów w kodzie Java w Androidzie albo przez bindingi w innych frameworkach. Te narzędzia mają za zadanie generować opis struktury interfejsu, a nie jego zachowanie. Często spotyka się też przekonanie, że to właśnie kod Java stanowi podstawę aplikacji – oczywiście to prawda, ale nie w kontekście automatycznego generowania przez narzędzia graficzne; one skupiają się na XML, który jest dużo bardziej uniwersalny do takich celów. Moim zdaniem najlepszą praktyką jest wyraźne oddzielenie warstwy prezentacji (np. XML) od logiki biznesowej i ręcznego kodowania zdarzeń, bo to pozwala na wygodne rozwijanie i utrzymywanie aplikacji, szczególnie w większych zespołach.

Pytanie 24

Jaką technologię stosuje się do powiązania aplikacji internetowej z systemem baz danych?

A. SQL
B. JavaScript
C. HTTP
D. CSS
HTTP to protokół, który pozwala na przesyłanie danych między przeglądarką a serwerem, ale to nie to samo, co narzędzie do zarządzania danymi w bazach. CSS się zajmuje stylizowaniem stron i nie ma nic wspólnego z bazami danych. JavaScript z kolei to język do robienia fajnych, interaktywnych rzeczy na stronach, ale sam w sobie nie ogarnie bazy danych. Musisz użyć jakiegoś dodatkowego narzędzia, na przykład Node.js albo ORM.

Pytanie 25

Jakie znaczenie ma polimorfizm w programowaniu obiektowym?

A. Dzieli program na klasy oraz obiekty
B. Ogranicza dostęp do atrybutów klasy
C. Pozwala na tworzenie obiektów z wielu różnych klas równocześnie
D. Umożliwia jednej metodzie działać w różnorodny sposób w zależności od klasy, do której należy
Polimorfizm to zdolność obiektów do używania tej samej metody lub interfejsu, ale z różnymi implementacjami, w zależności od klasy obiektu. Dzięki polimorfizmowi można wywołać metodę `obiekt.wyswietl()`, która zachowuje się inaczej w klasie `Samochod` i inaczej w klasie `Motocykl`, mimo że nazwa metody pozostaje taka sama. Polimorfizm ułatwia rozbudowę aplikacji, ponieważ nowe klasy mogą być dodawane bez modyfikacji istniejącego kodu, co zwiększa elastyczność i rozszerzalność programu. Jest to jedna z najważniejszych zasad programowania obiektowego, obok dziedziczenia i hermetyzacji.

Pytanie 26

Diagramem, który służy do śledzenia realizacji zadań przez członków zespołu projektowego, może być

A. Venna
B. aktywnosci UML
C. Gantta
D. związków encji
Diagram Gantta to moim zdaniem jeden z najbardziej praktycznych narzędzi używanych w zarządzaniu projektami, zwłaszcza tam, gdzie zależy nam na zobrazowaniu postępu prac. Ten diagram pozwala nie tylko zobaczyć, jakie zadania są zaplanowane na określony czas, ale też kto za nie odpowiada i jak się mają względem siebie. Osobiście uważam, że z Ganttem łatwiej ogarnąć, kiedy które zadanie się zaczyna, kiedy kończy i czy przypadkiem nie koliduje z innymi. Praktyka pokazuje, że bez takiej wizualizacji łatwo o chaos, szczególnie w większych projektach, gdzie zespół jest rozproszony lub działa zdalnie. Pracując z zespołami spotkałem się z sytuacjami, gdzie właśnie Gantta używało się na codziennych "standupach" do oceny postępu i przydzielania nowych zadań. Standardy branżowe, jak np. PMBOK czy metodyka PRINCE2, także polecają diagram Gantta do śledzenia i raportowania statusu projektu. Co ciekawe, narzędzie to jest wykorzystywane zarówno w klasycznym podejściu do zarządzania projektami, jak i coraz częściej w zespołach zwinnych, choć tam bywa trochę uproszczone. Generalnie – jak dla mnie, umiejętność czytania i tworzenia diagramów Gantta to absolutna podstawa, jeśli ktoś myśli poważnie o pracy przy projektach, niezależnie od branży.

Pytanie 27

Co oznacza pojęcie TDD w kontekście programowania?

A. Task Deployment Diagram - schemat wdrażania zadań w projekcie
B. Test-Driven Development - praktyka pisania testów przed implementacją kodu
C. Technical Design Document - dokumentacja techniczna projektu
D. Type Definition Document - dokumentacja typów danych w aplikacji
Pojęcia takie jak Type Definition Document, Technical Design Document, czy Task Deployment Diagram są związane z dokumentacją i zarządzaniem projektami, a niekoniecznie z samym procesem programowania, jakim jest TDD. Type Definition Document odnosi się do szczegółowego opisu typów danych używanych w aplikacji, co jest ważne, ale nie wpływa na proces tworzenia kodu i testowania. Z kolei Technical Design Document to dokument, który opisuje architekturę i techniczne aspekty projektu, ale nie stanowi podstawy dla praktyki TDD, w której testy są kluczowym elementem cyklu życia oprogramowania. Task Deployment Diagram to wizualizacja procesu wdrażania zadań w projekcie, co ma zastosowanie w zarządzaniu projektami, lecz nie odnosi się do samego wytwarzania oprogramowania. Takie nieporozumienia mogą wynikać z mylnego przekonania, że dokumentacja jest kluczowym elementem procesu programowania, co nie jest do końca prawdą. W rzeczywistości, TDD skupia się na iteracyjnym rozwoju poprzez testy, co prowadzi do lepszej jakości kodu, a jego podstawą jest koncepcja "testy przed kodem", a nie tworzenie dokumentacji czy schematów. Zrozumienie TDD jako podejścia programistycznego, które koncentruje się na testach, a nie na dokumentowaniu typu danych czy architektury, jest kluczowe dla właściwego podejścia do programowania w nowoczesnych projektach IT.

Pytanie 28

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

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

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

Pytanie 29

Jaką kategorię reprezentuje typ danych "array"?

A. Typ wskaźników
B. Typ danych złożony
C. Typ danych prosty
D. Typ logiczny
Tablica ('array') jest przykładem złożonego typu danych, który pozwala na przechowywanie wielu wartości tego samego typu pod wspólną nazwą. Każdy element tablicy jest dostępny za pomocą indeksu, co umożliwia szybkie i efektywne operacje na dużych zbiorach danych. Tablice są szeroko wykorzystywane w programowaniu do przechowywania list, macierzy i innych struktur, gdzie konieczne jest przechowywanie dużych ilości danych tego samego rodzaju. Dzięki tablicom można zorganizować dane w sposób uporządkowany, co ułatwia ich przetwarzanie, sortowanie i wyszukiwanie.

Pytanie 30

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

A. Łączy kod źródłowy z zewnętrznymi bibliotekami
B. Zoptymalizowuje wydajność aplikacji w środowisku produkcyjnym
C. Generuje plik wykonywalny dla systemu operacyjnego
D. Przekłada kod źródłowy na język maszynowy w trakcie działania programu
Tworzenie pliku wykonywalnego jest cechą kompilatora, który generuje gotowy program działający niezależnie od kodu źródłowego. Łączenie kodu z bibliotekami zewnętrznymi to zadanie linkera, który przygotowuje aplikację do uruchomienia, a nie interpretera. Optymalizacja działania aplikacji w środowisku produkcyjnym to rola profilerów i narzędzi do monitorowania wydajności, a nie interpretera, który nie ingeruje w działanie programu po jego uruchomieniu.

Pytanie 31

Jaka jest podstawowa funkcja narzędzia do zarządzania projektami?

A. Opracowanie bazy danych dla projektu
B. Poprawa wydajności kodu programu
C. Produkcja animacji komputerowych
D. Zarządzanie zadaniami i czasem w projekcie
Zarządzanie zadaniami i czasem to naprawdę kluczowa sprawa w projektach. Dzięki narzędziom takim jak Microsoft Project, Jira, Trello, czy Monday, zespoły mogą lepiej planować, przydzielać role i śledzić, co się dzieje. Możliwości tych narzędzi pozwalają ustalać deadline’y, priorytety, a nawet automatycznie przypominają o zbliżających się terminach. To super pomaga w unikaniu opóźnień i pozwala lepiej zorganizować pracę. Wizualizacja projektu w formie osi czasu czy tablicy kanban też jest mega przydatna, bo wszystko staje się bardziej czytelne.

Pytanie 32

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

A. Tworzenie prywatnych kopii pól dla każdej instancji
B. Umożliwienie dzielenia pól klasy pomiędzy zaprzyjaźnione klasy
C. Wywołanie destruktora klasy bez jej usuwania
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 33

Która z poniższych technologii służy do tworzenia interfejsu użytkownika zarówno dla aplikacji webowych jak i mobilnych?

A. Vue.js
B. Angular
C. React Native
D. jQuery
Wybór technologii do tworzenia interfejsu użytkownika, które nie są odpowiednie do budowy aplikacji mobilnych, może prowadzić do wielu nieporozumień. Rozważając Angular, warto zauważyć, że jest to framework stworzony do budowy aplikacji webowych, który wprowadza koncepcje związane z programowaniem obiektowym oraz architekturą MVVM. Chociaż Angular może być używany w połączeniu z narzędziami do kompilacji aplikacji mobilnych, takimi jak Ionic, nie jest to jego pierwotne przeznaczenie, co może prowadzić do problemów z wydajnością i użytkowaniem. Vue.js to kolejny framework skoncentrowany na tworzeniu interfejsów webowych, który zyskał popularność dzięki prostocie oraz elastyczności. Jednakże, podobnie jak w przypadku Angulara, nie jest on zaprojektowany z myślą o aplikacjach mobilnych, co ogranicza jego zastosowanie w tej dziedzinie. Z kolei jQuery, będący biblioteką JavaScript, został stworzony z myślą o ułatwieniu manipulacji DOM oraz obsługi zdarzeń w aplikacjach webowych. Choć jQuery było niezwykle popularne w przeszłości, obecnie jego użycie w aplikacjach mobilnych jest rzadkie i niezalecane, ponieważ nowoczesne frameworki takie jak React i React Native oferują znacznie bardziej rozbudowane możliwości. Wybierając odpowiednią technologię, warto kierować się jej przeznaczeniem oraz możliwościami, aby uniknąć nieefektywności oraz problemów w realizacji projektów.

Pytanie 34

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

A. przeprowadzane na podstawie dokumentu zawierającego przypadki testowe
B. przeprowadzane przez grupę docelowych użytkowników aplikacji
C. podzielone na testy funkcjonalne, wydajnościowe oraz skalowalności
D. realizowane przez zespół testerów zatrudnionych przez firmę Google
Pierwsza z niepoprawnych odpowiedzi wskazuje na to, że testy Beta są wykonywane przez grupę zatrudnionych testerów z firmy Google. Jest to błędne założenie, ponieważ testy Beta są w rzeczywistości przeprowadzane przez rzeczywistych użytkowników, którzy nie są profesjonalnymi testerami. Użytkownicy ci mogą być entuzjastami technologii, a ich opinie są wartościowe, ponieważ odzwierciedlają rzeczywiste doświadczenia i oczekiwania rynku. Kolejna niepoprawna odpowiedź sugeruje, że testy Beta są podzielone na testy funkcjonalne, wydajnościowe i skalowalności. Choć te kategorie testów są istotne w cyklu życia oprogramowania, testy Beta koncentrują się głównie na ogólnym doświadczeniu użytkownika i funkcjonalności aplikacji w praktyce. Ostatnia niepoprawna odpowiedź wskazuje, że testy Beta są przeprowadzane w oparciu o dokument z przypadkami testowymi. W rzeczywistości, testy Beta są bardziej elastyczne i opierają się na rzeczywistych interakcjach użytkowników z aplikacją, co oznacza, że nie są one sztywno zdefiniowane przez dokumentację, a raczej na podstawie ich naturalnego użytkowania. Wszelkie założenia dotyczące formalnych przypadków testowych są więc mylące w kontekście testów Beta.

Pytanie 35

Mobilna aplikacja przedstawia listę, w której każdy element można dotknąć palcem, aby zobaczyć jego detale. Zdarzenie, które odpowiada tej czynności, to

A. button clicked.
B. tapped.
C. value changed.
D. toggled.
Zdarzenie 'tapped' oznacza, że stuknęliśmy w coś na liście na naszym telefonie. To takie podstawowe zdarzenie, które przydaje się w aplikacjach mobilnych. Dzięki temu możemy wchodzić w interakcje z różnymi elementami, na przykład, gdy klikniemy na coś w liście, pojawią się dodatkowe szczegóły. Ta obsługa zdarzeń 'tap' jest naprawdę ważna w aplikacjach mobilnych, bo to w zasadzie główny sposób, w jaki poruszamy się po interfejsie.

Pytanie 36

Jakie jest podstawowe zadanie firewalla w systemie komputerowym?

A. Zarządzanie ruchem sieciowym i blokowanie nieautoryzowanego dostępu
B. Zapobieganie wyciekom informacji na skutek awarii systemu
C. Szyfrowanie danych przesyłanych w sieci
D. Ochrona danych na poziomie aplikacji internetowych
Wiele osób myli zadania firewalla z innymi elementami zabezpieczeń komputerowych, co jest dość zrozumiałe, bo dzisiejsze systemy bezpieczeństwa podlegają ciągłym zmianom i rozwojowi. Szyfrowanie danych w sieci to domena zupełnie innych rozwiązań, jak np. protokoły VPN, TLS czy IPSec – one dbają o to, żeby nikt nie podejrzał przesyłanych informacji, ale nie filtrują ruchu ani nie blokują dostępu. Jeśli chodzi o zapobieganie wyciekom informacji w przypadku awarii systemu, to raczej zadanie systemów backupu, kontrolerów integralności czy szyfrowania dysków. Firewall nie chroni przed fizyczną utratą danych ani przypadkową ich ekspozycją podczas awarii; nie jest narzędziem do zarządzania kopią zapasową, tylko do nadzorowania ruchu. Z kolei ochrona danych na poziomie aplikacji internetowych to specjalizacja mechanizmów typu WAF (Web Application Firewall), które skupiają się na wykrywaniu i blokowaniu ataków warstwy aplikacji jak SQL injection czy XSS, a klasyczny firewall działa głównie na poziomie adresów IP, portów i protokołów. Częsty błąd, jaki obserwuję, to wrzucanie wszystkich zabezpieczeń do jednego worka i określanie firewalla jako "wszystko w jednym". W praktyce skuteczne bezpieczeństwo to zestaw różnych narzędzi, z których każde pełni odrębną i jasno zdefiniowaną funkcję. Firewall to po prostu pierwsza linia obrony sieci – steruje, kto może się połączyć, a nie szyfruje czy naprawia awarie. Warto o tym pamiętać przy projektowaniu i ocenie polityk bezpieczeństwa w każdej organizacji.

Pytanie 37

Jaki numer telefonu należy wybrać, aby skontaktować się z pogotowiem ratunkowym w Polsce?

A. 113
B. 997
C. 112
D. 998
Numer 112 to tzw. europejski numer alarmowy, który działa nie tylko w Polsce, ale i w całej Unii Europejskiej oraz kilku innych krajach. Z mojego doświadczenia wynika, że warto nawykowo korzystać właśnie z tego numeru, bo jest on uniwersalny i obsługiwany przez wszystkie sieci – zarówno stacjonarne, jak i komórkowe. W praktyce, dzwoniąc pod 112, łączymy się z centralą, która przekieruje nas do odpowiednich służb (pogotowie ratunkowe, policja, straż pożarna), w zależności od sytuacji. To ogromne ułatwienie, szczególnie gdy jesteśmy zestresowani albo w nieznanym miejscu. Moim zdaniem to też ważny aspekt, że osoby z zagranicy mogą łatwo uzyskać pomoc, bo 112 jest rozpoznawalny praktycznie wszędzie w Europie. Zgodnie z przepisami unijnymi, ten numer powinien być promowany jako podstawowy do wzywania pomocy w nagłych przypadkach – stąd jego obecność nawet na automatach telefonicznych czy instrukcjach bezpieczeństwa w zakładach pracy, szkołach, komunikacji miejskiej. Dodatkowo, jeśli nie wiemy, którą dokładnie służbę wezwać, operator 112 pomoże nam to ustalić i połączy z odpowiednim dyspozytorem. Osobiście uważam, że zapamiętanie tego numeru to podstawa, bo można uratować komuś życie – nawet przez przypadek, będąc świadkiem jakiegoś wypadku czy innego zdarzenia. Warto pamiętać, że 112 działa również, gdy telefon nie ma karty SIM (chociaż nie wszędzie to się sprawdza w praktyce, to z mojego rozeznania wynika, że w Polsce powinno zadziałać).

Pytanie 38

Która metoda tablicy w JavaScript dodaje nowy element na końcu tablicy?

A. unshift()
B. pop()
C. push()
D. shift()
Metoda push() w JavaScript jest kluczowym narzędziem do dodawania nowych elementów na końcu tablicy. Jest to technika powszechnie stosowana w programowaniu, która pozwala na dynamiczne zarządzanie danymi w aplikacjach. Stosując push(), zyskujemy możliwość zwiększania rozmiaru tablicy w locie, co jest szczególnie przydatne w przypadku pracy z danymi, które mogą się zmieniać lub być nieprzewidywalne. Na przykład, jeśli mamy tablicę przechowującą listę zakupów, możemy dodać nowy przedmiot za pomocą metody push: `zakupy.push('jogurt');`. Warto również zauważyć, że metoda ta zwraca nową długość tablicy po dodaniu elementu, co może być użyteczne w kontekście dalszego przetwarzania lub sprawdzania zawartości tablicy. Zastosowanie tej metody jest zgodne z zasadami dobrego programowania w JavaScript, które zaleca efektywne gospodarowanie pamięcią i elastyczne zarządzanie strukturami danych.

Pytanie 39

W jakiej sytuacji wykorzystanie stosu będzie korzystniejsze niż lista podczas projektowania zestawu danych?

A. Gdy dane muszą być uporządkowane
B. Gdy ważne jest szybkie znajdowanie elementów
C. Gdy kolejność przetwarzania danych jest odwrócona (LIFO)
D. Gdy chcemy usunąć element z końca
Lista umożliwia liniowy dostęp do elementów i pozwala na dodawanie/usuwanie elementów w dowolnym miejscu, ale nie działa na zasadzie LIFO – dostęp do ostatniego elementu nie jest tak szybki jak w stosie. Kolejka działa zgodnie z zasadą FIFO (First In First Out), co oznacza, że elementy są przetwarzane w kolejności ich dodania, co jest odwrotnością stosu. Tablica dwuwymiarowa to struktura służąca do przechowywania danych w formie macierzy, umożliwiająca indeksowany dostęp, ale nie wspiera bezpośrednio operacji LIFO ani FIFO.

Pytanie 40

Zapisany fragment w Pythonie ilustruje:

pierwiastki = {"N":"Azot","O":"Tlen","P":"Fosfor","Si":"Siarka"}
A. kolejkę (LIFO)
B. stos
C. tablicę asocjacyjną (słownik)
D. strukturę danych
W tym pytaniu chodziło o rozpoznanie tablicy asocjacyjnej (czyli słownika) w języku Python. Taka struktura danych pozwala bardzo szybko przypisywać wartości do kluczy i potem je równie sprawnie odnajdywać, co jest superpraktyczne w codziennych zadaniach programistycznych. Taki słownik, jak w przykładzie, gdzie symbole pierwiastków są kluczami, a ich polskie nazwy wartościami, pokazuje typowe zastosowanie tej struktury do przechowywania powiązanych danych bez konieczności przeszukiwania całej listy po kolei. Moim zdaniem słowniki to w ogóle jeden z najwygodniejszych wynalazków Pythona – nie musisz się martwić o kolejność, wystarczy znać klucz i już masz wartość. W branży wykorzystuje się słowniki na potęgę: do mapowania konfiguracji, przechowywania danych z plików JSON, czy nawet jako szybki cache. Warto dodać, że słowniki w Pythonie od wersji 3.7 zachowują kolejność dodania elementów, co czasem pomaga w czytelności kodu, chociaż to raczej miły „bonus” niż must-have. W kontekście dobrych praktyk zawodowych zawsze pilnuję, żeby klucze były niezmiennikami (np. stringi czy liczby), bo tego wymaga Python, a wartości mogą być dowolne. Jeżeli ktoś planuje automatyzować jakieś procesy lub pracować z danymi, bez słowników się nie obejdzie. To trochę taki niepozorny, a bardzo potężny „narzędzie” w arsenale każdego programisty.