Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 29 kwietnia 2026 09:57
  • Data zakończenia: 29 kwietnia 2026 10:18

Egzamin zdany!

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

Który z wymienionych frameworków jest charakterystyczny dla aplikacji komputerowych pisanych w C#?

A. Spring
B. Qt
C. React
D. WPF (Windows Presentation Foundation)
WPF (Windows Presentation Foundation) to framework firmy Microsoft, który jest powszechnie wykorzystywany do tworzenia aplikacji desktopowych w języku C#. WPF pozwala na projektowanie zaawansowanych interfejsów użytkownika (UI) z wykorzystaniem XAML (Extensible Application Markup Language), co umożliwia oddzielenie logiki aplikacji od warstwy prezentacyjnej. WPF wspiera grafikę wektorową, animacje oraz różne efekty wizualne, co czyni go idealnym narzędziem do budowy nowoczesnych, estetycznych aplikacji dla systemu Windows. Integracja z .NET i Visual Studio umożliwia szybkie tworzenie aplikacji oraz korzystanie z bogatych bibliotek i gotowych komponentów UI. WPF jest szczególnie ceniony za elastyczność, obsługę danych i możliwość tworzenia aplikacji responsywnych.

Pytanie 2

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

b = a++;
Zapis drugi:
b = ++a;
A. Tylko przy użyciu pierwszego zapisu zmienna a zostanie zwiększona o 1.
B. Bez względu na zastosowany sposób, w zmiennej b zawsze uzyskamy ten sam rezultat.
C. Wartość zmiennej b będzie wyższa po użyciu drugiego zapisu w porównaniu do pierwszego.
D. Drugi zapis nie jest zgodny ze składnią, co doprowadzi do błędów kompilacji.
Drugi zapis nie jest niezgodny ze składnią – zarówno preinkrementacja, jak i postinkrementacja są w pełni zgodne z zasadami języka i nie powodują błędów kompilacji. Niezależnie od wybranego zapisu, zmienna zostanie zwiększona, lecz kluczowa różnica polega na tym, kiedy dokładnie to następuje. Twierdzenie, że w każdym przypadku wynik będzie taki sam, jest błędne – różnice pojawiają się podczas użycia tych operatorów w bardziej złożonych wyrażeniach. Zapis pierwszy (preinkrementacja) nie jest jedynym sposobem na zwiększenie wartości zmiennej, chociaż w wielu sytuacjach jest preferowany ze względu na efektywność.

Pytanie 3

Złośliwe oprogramowanie stworzone w celu przyznania hakerom uprawnień administracyjnych do komputera ofiary bez jej świadomości, to

A. keylogger
B. wirus
C. robak
D. rootkit
Czasem łatwo się pogubić w terminologii dotyczącej malware, bo wirusy, keyloggery czy robaki pojawiają się w mediach tak często, że wszystko wydaje się jednym wielkim zagrożeniem. Wirus komputerowy to program, który potrafi się samoreplikować i infekować pliki, ale nie chodzi tu o uzyskiwanie uprawnień administracyjnych samych w sobie. Jego głównym celem zazwyczaj jest rozprzestrzenianie się i ewentualnie niszczenie danych, raczej nie jest zaprojektowany do ukrywania się na poziomie jądra systemu czy przejmowania kontroli nad systemem operacyjnym. Keylogger z kolei to narzędzie do przechwytywania klawiszy – świetne do wykradania haseł czy innych poufnych informacji, ale sam keylogger nie daje przywilejów administratora, raczej działa w tle jako zwykły program. Robak natomiast to kolejna ciekawa kategoria – potrafi się rozprzestrzeniać po sieci bez potrzeby ingerencji użytkownika, ale jego głównym zadaniem jest infekowanie kolejnych maszyn, a nie uzyskiwanie wysokich uprawnień czy ukrywanie się głęboko w systemie. W praktyce wiele osób wrzuca te terminy do jednego worka „złośliwe oprogramowanie”, ale każde z nich ma inny mechanizm działania i inne miejsce w strategii ataku. Największym błędem jest myślenie, że każdy malware od razu daje pełny dostęp do komputera – w rzeczywistości tylko nieliczne, jak rootkity, są zbudowane właśnie po to, żeby przejąć i ukryć się na poziomie systemu operacyjnego, często modyfikując nawet sterowniki czy jądro. To jest powód, dla którego standardowe narzędzia bezpieczeństwa mogą je przegapić. Moim zdaniem warto na spokojnie przejrzeć różnice między rodzajami malware, bo to podstawa, żeby dobrze zrozumieć jak się bronić – a przy okazji nie dać się złapać na branżowe uproszczenia.

Pytanie 4

Który typ testów jest wykonywany na pojedynczych komponentach lub funkcjach w izolacji?

A. Testy integracyjne
B. Testy jednostkowe
C. Testy systemowe
D. Testy akceptacyjne
Testy jednostkowe to podstawowy rodzaj testów, które koncentrują się na weryfikacji pojedynczych komponentów lub funkcji aplikacji w izolacji. Ich celem jest upewnienie się, że dany element kodu działa zgodnie z oczekiwaniami. Przykładowo, jeśli mamy funkcję, która oblicza sumę dwóch liczb, test jednostkowy sprawdzi, czy ta funkcja poprawnie zwraca wynik dla różnych zestawów danych wejściowych. Zastosowanie testów jednostkowych jest kluczowe w nowoczesnym programowaniu, ponieważ pozwala na szybkie wykrywanie błędów na wczesnym etapie rozwoju oprogramowania. Dzięki nim można również łatwiej wprowadzać zmiany w kodzie, gdyż mając pewność, że pojedyncze komponenty działają prawidłowo, można modyfikować całą aplikację bez obaw o wprowadzenie nowych błędów. W praktyce, testy jednostkowe są często zautomatyzowane i stanowią integralną część ciągłej integracji (CI), co pozwala na szybkie i efektywne testowanie kodu przy każdej zmianie. Dobre praktyki w zakresie testów jednostkowych obejmują pisanie testów przed właściwą implementacją kodu (tzw. TDD - Test Driven Development) oraz stosowanie odpowiednich narzędzi, takich jak JUnit dla Javy czy NUnit dla .NET.

Pytanie 5

Jakie metody można wykorzystać do przechowywania informacji o użytkownikach w aplikacji mobilnej na systemie Android?

A. W rejestrze systemu
B. Za pomocą plików SharedPreferences
C. Wyłącznie w zewnętrznych bazach danych
D. Tylko w pamięci RAM
Przechowywanie danych w rejestrze systemu jest typowe dla aplikacji desktopowych działających na systemach Windows i nie znajduje zastosowania w środowisku Android. Zewnętrzne bazy danych są używane do przechowywania dużych ilości danych, ale nie są optymalnym rozwiązaniem dla prostych preferencji użytkownika, ponieważ wymagają bardziej skomplikowanej konfiguracji. Przechowywanie danych wyłącznie w pamięci RAM jest rozwiązaniem tymczasowym – dane te są tracone po zamknięciu aplikacji lub ponownym uruchomieniu urządzenia, co czyni je niepraktycznymi do przechowywania trwałych ustawień użytkownika.

Pytanie 6

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

A. Dziedziczenie
B. Abstrakcja
C. Hermetyzacja
D. Polimorfizm
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 7

Który element HTML5 służy do osadzania wideo na stronie?

A. <media>
B. <video>
C. <player>
D. <movie>
Element HTML5 <video> jest standardowym tagiem służącym do osadzania wideo na stronach internetowych. Umożliwia on integrację multimediów w sposób, który jest zgodny z aktualnymi standardami sieciowymi. W porównaniu do starszych metod, które wymagały użycia zewnętrznych wtyczek, takich jak Flash, <video> pozwala na bezproblemowe odtwarzanie wideo w przeglądarkach nowej generacji, co zwiększa bezpieczeństwo i wydajność. Element ten oferuje wiele atrybutów, takich jak controls, autoplay, loop, preload, oraz width i height, które pozwalają na dostosowanie odtwarzacza do potrzeb użytkownika. Na przykład, używając atrybutu controls, można dodać przyciski odtwarzania, zatrzymywania lub regulacji głośności, co poprawia interaktywność i użyteczność. Dodatkowo, aby zapewnić dostępność treści wideo, warto stosować atrybuty takie jak <track>, który umożliwia dodawanie napisów, co jest szczególnie ważne dla osób z niepełnosprawnościami słuchowymi. Używanie <video> w projektach webowych to najlepsza praktyka, która wspiera rozwój dostępnych i przyjaznych dla użytkownika doświadczeń wizualnych.

Pytanie 8

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

A. Łączy kod źródłowy z zewnętrznymi bibliotekami
B. Generuje plik wykonywalny dla systemu operacyjnego
C. Przekłada kod źródłowy na język maszynowy w trakcie działania programu
D. Zoptymalizowuje wydajność aplikacji w środowisku produkcyjnym
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 9

Który z wymienionych elementów może stanowić część menu w aplikacji desktopowej?

A. CheckBox
B. ScrollBar
C. MenuItem
D. Canvas
CheckBox to komponent, który umożliwia wybór jednej lub wielu opcji, ale nie jest częścią systemu menu – zwykle znajduje się w formularzach lub ustawieniach aplikacji. ScrollBar to element interfejsu umożliwiający przewijanie treści w oknie aplikacji, ale nie jest elementem menu. Canvas to kontener do rysowania elementów graficznych i obiektów, ale nie pełni funkcji w kontekście tworzenia menu aplikacji desktopowych.

Pytanie 10

Które z wymienionych stwierdzeń najcelniej opisuje proces uruchamiania aplikacji?

A. Przetwarzanie kodu źródłowego przez kompilator
B. Wykonywanie programu na podstawie przetłumaczonego kodu maszynowego
C. Tłumaczenie kodu źródłowego na język pośredni
D. Generowanie pliku źródłowego
Zaczynanie od pliku źródłowego to jakby start w procesie programowania, zanim jeszcze dojdzie do kompilacji. Twierdzisz, że kompilator wykonuje kod źródłowy, ale to nie tak. Kompilator tłumaczy, a nie wykonuje ten kod. Zamiana kodu źródłowego na język pośredni, jak bytecode w Javie, to właśnie etap kompilacji. Uruchomienie następuje później, więc jest to ważne, żeby to zrozumieć.

Pytanie 11

Jakiego rodzaju zmiennej użyjesz w C++, aby przechować wartość "true"?

A. liczba całkowita
B. liczba zmiennoprzecinkowa
C. bool
D. tekst
Typ danych 'bool' w języku C++ jest przeznaczony do przechowywania wartości 'true' lub 'false'. Deklaracja 'bool isReady = true;' to przykład poprawnego przypisania wartości logicznej do zmiennej. Typ boolean jest kluczowy w warunkach decyzyjnych, pętlach i operacjach porównawczych. W programowaniu typ 'bool' jest wykorzystywany do kontroli przepływu programu, obsługi wyjątków oraz sprawdzania poprawności danych. Użycie booleanów w kodzie zwiększa jego czytelność i pozwala na bardziej przejrzyste budowanie logiki aplikacji.

Pytanie 12

Przedstawione w filmie działania wykorzystują narzędzie

A. kompilatora dla interfejsu graficznego
B. generatora kodu java
C. generatora GUI przekształcającego kod do języka XAML
D. debuggera analizującego wykonujący kod
Wybrana odpowiedź jest trafna, bo faktycznie narzędzie pokazane w filmie to generator GUI, który potrafi przekształcać kod do języka XAML. XAML (czyli Extensible Application Markup Language) jest powszechnie używany do deklaratywnego opisywania interfejsów użytkownika, na przykład w aplikacjach WPF czy UWP na platformie .NET. Jak dla mnie, korzystanie z takich generatorów to ogromna wygoda, bo pozwala błyskawicznie przenosić projekt graficzny do formatu czytelnego dla platformy Microsoftu. Z mojego doświadczenia, wiele zespołów programistycznych stosuje takie rozwiązania, żeby oszczędzić czas na ręcznym pisaniu XAML-a (co potrafi być naprawdę żmudne przy dużych projektach). Co ciekawe, takie narzędzia bardzo dobrze współpracują z designerskimi edytorami UI i potrafią zautomatyzować konwersję nawet z innych formatów graficznych, np. Sketch czy Adobe XD do XAML-a. Branżowe standardy zalecają, by wykorzystywać generatorów GUI właśnie do tego celu, bo minimalizuje to liczbę błędów, przyspiesza wdrożenie zmian i ułatwia współpracę między programistami a projektantami. Warto pamiętać, że XAML jest bardzo elastyczny i umożliwia potem ręczną edycję wygenerowanego kodu – czasem powstają drobne poprawki, ale ogólnie to naprawdę przydatne narzędzie. Ogólnie – jeśli tylko projektujesz UI pod .NET, to automatyczna konwersja do XAML-a to jest coś, co warto znać i wykorzystywać w praktyce.

Pytanie 13

W jaki sposób można ograniczyć problemy społeczne wynikające z nadmiernego używania internetu?

A. Całkowicie wycofać się z aktywności wirtualnych
B. Zachować równowagę pomiędzy relacjami w sieci a tymi w rzeczywistości
C. Zwiększać czas spędzany przy ekranie
D. Unikać spotkań z ludźmi w realnym świecie
Utrzymywanie równowagi między relacjami online i offline to kluczowy element zapobiegania problemom społecznym wynikającym z nadmiernego korzystania z internetu. Przeplatanie kontaktów wirtualnych z interakcjami twarzą w twarz wzmacnia więzi społeczne i poprawia umiejętności komunikacyjne. Równowaga między życiem cyfrowym a rzeczywistym pozwala unikać izolacji społecznej i wspiera rozwój empatii oraz zdolności interpersonalnych. Jest to szczególnie ważne w kontekście młodzieży, która może być bardziej podatna na negatywne skutki nadmiernej ekspozycji na treści online.

Pytanie 14

Jakie jest główne zadanie ochrony danych osobowych?

A. Gwarantowanie anonimowości dla internautów
B. Utrudnianie działalności organom ścigania
C. Zabezpieczenie danych osobowych przed nieautoryzowanym dostępem i ich wykorzystaniem
D. Udostępnianie danych osobowych w celach marketingowych
Ochrona danych osobowych przed nieuprawnionym dostępem i wykorzystaniem to podstawowy cel ochrony danych osobowych. Zasady ochrony prywatności, takie jak RODO (GDPR), zapewniają użytkownikom prawo do kontroli nad swoimi danymi i decydowania, kto może je przetwarzać. Firmy i organizacje muszą wdrażać środki techniczne oraz organizacyjne, aby zabezpieczyć dane przed wyciekiem, kradzieżą i nadużyciami. Przestrzeganie tych zasad nie tylko chroni jednostki, ale również buduje zaufanie klientów do przedsiębiorstw.

Pytanie 15

Jakie elementy powinny być zawarte w instrukcji dla użytkownika danej aplikacji?

A. Informacje o narzędziach programistycznych zastosowanych w procesie tworzenia aplikacji
B. Opis instalacji, konfiguracji oraz obsługi oprogramowania
C. Wyjaśnienie struktur danych wykorzystywanych w kodzie
D. Harmonogram realizacji projektu
W instrukcji użytkownika aplikacji warto, żeby był opis tego, jak zainstalować, skonfigurować i korzystać z programu. Taka dokumentacja, pisana krok po kroku, pomaga użytkownikowi przejść przez wszystkie etapy, od pobrania oprogramowania, przez instalację, aż po to, żeby w pełni wykorzystać wszystkie funkcje. Dobrze, żeby były tam też info o wymaganiach systemowych, sposobach radzenia sobie z problemami czy aktualizacjach oprogramowania. Moim zdaniem, taka dokładna instrukcja jest mega ważna, bo zmniejsza szanse na napotkanie kłopotów podczas korzystania z aplikacji i sprawia, że łatwiej jest wdrożyć ją w pracy. Jak użytkownicy mają porządnie napisaną instrukcję, to są bardziej zadowoleni i szybciej przyzwyczajają się do nowego narzędzia.

Pytanie 16

Zapisany fragment w C# wskazuje na definicję klasy Car, która:

public class Car: Vehicle {     ...   }
A. dziedziczy po Vehicle
B. jest powiązana z klasą Vehicle
C. używa prywatnych pól klasy Vehicle
D. stanowi klasę bazową (nie dziedziczy po żadnej klasie)
W przedstawionym kodzie w języku C# mamy definicję klasy Car, która dziedziczy po klasie Vehicle. Dziedziczenie to fundamentalny mechanizm programowania obiektowego, pozwalający jednej klasie przejąć właściwości i metody innej klasy. W praktyce oznacza to, że klasa Car automatycznie zyskuje dostęp do metod i właściwości publicznych oraz chronionych klasy Vehicle, co umożliwia ponowne użycie kodu i zwiększa jego przejrzystość. Dziedziczenie jest kluczowe w projektowaniu skalowalnych systemów, gdzie umożliwia tworzenie bardziej specyficznych klas na podstawie klas ogólnych, co jest zgodne z zasadą DRY (Don't Repeat Yourself). Przykładowo, jeżeli klasa Vehicle zawiera metody takie jak Start() i Stop(), klasa Car może je wykorzystać bez konieczności ponownego definiowania. Dobre praktyki w programowaniu obiektowym zalecają wykorzystywanie dziedziczenia do tworzenia hierarchii klas, które logicznie odwzorowują relacje „jest-a” pomiędzy obiektami w systemie. Ważne jest też unikanie zbyt głębokiego dziedziczenia, co może prowadzić do skomplikowanego i trudnego w utrzymaniu kodu. Zrozumienie dziedziczenia jest kluczowe dla efektywnego wykorzystania wzorców projektowych, takich jak wzorzec projektowy Adapter czy Dekorator.

Pytanie 17

Które z wymienionych stanowi przykład zagrożenia fizycznego w miejscu pracy?

A. Brak ergonomicznych miejsc pracy
B. Nieodpowiednie relacje w zespole
C. Promieniowanie UV
D. Obciążenie psychiczne
Przeciążenie psychiczne jest zagrożeniem psychospołecznym, a nie fizycznym – dotyczy zdrowia psychicznego i samopoczucia pracownika. Złe relacje w zespole są również zagrożeniem psychospołecznym, prowadzącym do konfliktów i obniżenia efektywności pracy. Brak ergonomicznych stanowisk pracy to zagrożenie ergonomiczne, które może prowadzić do problemów zdrowotnych, takich jak bóle pleców czy nadgarstków, ale nie jest klasyfikowane jako zagrożenie fizyczne. Zagrożenia fizyczne dotyczą głównie czynników środowiskowych wpływających bezpośrednio na ciało pracownika.

Pytanie 18

Które z wymienionych stanowi przykład struktury dziedziczenia?

A. Klasa Pojazd ma dziedziczenie od klasy Samochód
B. Klasa Pojazd nie dziedziczy z żadnej klasy
C. Klasa Samochód i Pojazd nie są ze sobą powiązane
D. Klasa Samochód ma dziedziczenie od klasy Pojazd
Klasa 'Pojazd' dziedzicząca po klasie 'Samochód' jest błędnym przykładem hierarchii – bardziej ogólne pojęcia powinny znajdować się wyżej w hierarchii dziedziczenia. Klasa 'Pojazd' nie dziedzicząca po żadnej klasie jest podstawową klasą bazową, ale to nie stanowi przykładu hierarchii dziedziczenia. Brak powiązań między klasami 'Samochód' i 'Pojazd' oznacza brak hierarchii – są to niezależne klasy, co eliminuje korzyści wynikające z dziedziczenia i ponownego użycia kodu.

Pytanie 19

Wskaż odpowiedź, która używa parafrazowania jako metodę aktywnego słuchania, gdy klient mówi: "Interesuje mnie aplikacja, która działa szybko, niezależnie od tego, czy korzysta z niej kilku czy tysiąc użytkowników"?

A. Czuję pewne wątpliwości w Pani głosie. Czy mogę zadać kilka pytań?
B. Jeśli dobrze zrozumiałam, chodzi o aplikację, która efektywnie obsługuje różne obciążenia
C. Dlaczego Pani potrzebuje takiej aplikacji?
D. Ilu użytkowników planuje z niej skorzystać?
Parafraza to świetna technika, która pomaga zrozumieć, co rozmówca ma na myśli. Jak w tym przypadku – odpowiedź, która mówi: 'Jeśli dobrze rozumiem, chodzi o aplikację, która radzi sobie z różnym obciążeniem,' naprawdę dobrze oddaje to, co klient próbował przekazać. Klient podkreśla, że ważne jest dla niego, aby aplikacja była wydajna, niezależnie od tego, ile osób z niej korzysta. Użycie terminu 'radzi sobie z obciążeniem' jest trafne, bo dotyczy zdolności systemu do przystosowywania się do zmieniającej się liczby użytkowników i ich aktywności. To pokazuje, że konsultant dobrze zrozumiał potrzeby klienta i otwiera możliwości do dalszej rozmowy o technicznych detalach aplikacji, a to jest kluczowe w sprzedaży i budowaniu dobrych relacji z klientem.

Pytanie 20

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. Klasa2 dziedziczy od Klasa1
B. Klasa1 jest dzieckiem Klasy2
C. Klasa1 dziedziczy od Klasa2
D. Klasa2 stanowi klasę bazową
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 21

Jaki jest kluczowy zamysł wzorca "Kompozyt" (Composite)?

A. Określenie interfejsu komunikacji pomiędzy składnikami systemu
B. Stworzenie jednej klasy do zarządzania wieloma obiektami tego samego rodzaju
C. Danie możliwości dynamicznej zmiany zachowania obiektu
D. Umożliwienie klientom obsługi obiektów oraz ich zbiorów w spójny sposób
Zarządzanie wieloma obiektami tego samego typu to cecha wzorca Fabryka (Factory) lub Builder, a nie Kompozyt. Definiowanie interfejsu komunikacji między komponentami systemu to rola wzorca Mediator, który organizuje interakcje między różnymi obiektami. Umożliwienie dynamicznej zmiany zachowania obiektu jest domeną wzorca Strategia (Strategy) lub Dekorator (Decorator), które oferują elastyczność w zakresie modyfikacji zachowania podczas działania programu.

Pytanie 22

Który z wymienionych procesów NIE jest częścią etapu kompilacji?

A. Weryfikacja błędów składniowych
B. Optymalizacja kodu
C. Analiza działania programu w czasie rzeczywistym
D. Tłumaczenie kodu źródłowego na język maszynowy
Optymalizacja kodu to integralna część kompilacji, mająca na celu zwiększenie wydajności programu poprzez usunięcie zbędnych instrukcji i usprawnienie algorytmów. Tłumaczenie kodu źródłowego na język maszynowy jest głównym zadaniem kompilatora, który generuje plik wykonywalny. Weryfikacja błędów składniowych jest jednym z pierwszych etapów kompilacji, mającym na celu upewnienie się, że kod jest poprawny pod względem składni, zanim zostanie przekształcony na kod maszynowy.

Pytanie 23

W środowisku IDE przeznaczonym do tworzenia aplikacji okienkowych zdefiniowano okno Form1. Aby wprowadzić zmiany w ustawieniach, w kolejności: tytuł okna na górnym pasku, standardowy kursor na strzałkę oraz kolor tła okna, należy dostosować następujące pola w oknie Properties:

Ilustracja do pytania
A. (Name), UseWaitCursor, BackgroundImage
B. (Name), Cursor, BackgroundImage
C. Text, UseWaitCursor, BackColor
D. Text, Cursor, BackColor
W pracy z IDE do aplikacji okienkowych, bardzo łatwo pomylić znaczenie niektórych właściwości formularza, bo wiele z nich brzmi podobnie albo wydaje się spełniać podobną funkcję. Przykładowo, pole (Name) w oknie Properties nie ma żadnego wpływu na to, co widzi użytkownik w tytule okna – to jest nazwa techniczna obiektu w kodzie, czyli identyfikator, którym odwołujemy się do formularza w trakcie programowania. To megaważna różnica! BackgroundImage natomiast służy do ustawienia grafiki jako tła, a nie koloru – czasem ktoś myli BackColor z BackgroundImage, bo oba dotyczą wyglądu, ale BackColor to czysty kolor, bez obrazków. UseWaitCursor to kolejny haczyk – ta właściwość aktywuje specjalny kursor oczekiwania (taki kręcący się kółek lub klepsydrę), a nie domyślny wskaźnik w kształcie strzałki. Ustawienie tego pola na true sprawia, że użytkownik ma wrażenie, iż aplikacja coś przetwarza – super przydatne w operacjach długotrwałych, ale nie do standardowej obsługi okna. Cursor daje pełną kontrolę nad rodzajem kursora i to jest najlepszy wybór, gdy chodzi o standardowego pointera. Wreszcie, częsty błąd to branie pod uwagę właściwości, które po prostu nie dotyczą zadanego aspektu wizualnego formularza – na przykład mylenie tego, co widzi użytkownik, z tym, jak programista nazywa obiekt. Moim zdaniem, to taki typowy skrót myślowy: patrzymy na nazwę w oknie Properties i wydaje nam się, że to musi być to, co się zmienia na ekranie, a tu czasem logika IDE płata figle. W praktyce, poprawne podejście to zawsze zajrzeć do dokumentacji lub przeprowadzić szybki test – zmienić wartość i zobaczyć, co się realnie dzieje w oknie podglądu. To podstawowa umiejętność każdego, kto na serio chce projektować wygodne i profesjonalne interfejsy, zamiast działać na ślepo.

Pytanie 24

Zaznaczone elementy w przedstawionych obramowaniach mają na celu:
Fragment kodu w WPF/XAML:

<Windows Title="Tekst"...>
Fragment kodu w Java:
public class Okno extends JFrame {
    ...
    public Okno() {
        super();
        this.setTitle("Tekst");
    }
    ...
A. uzyskanie nazwy obiektu obrazującego okno aplikacji
B. zapisanie tytułu okna do obiektu Tekst
C. przypisanie nazwy obiektu obrazującego okno aplikacji
D. ustawienie tytułu okna na "Tekst"
Odpowiadając na to pytanie, łatwo pomylić pojęcia związane z nazwą obiektu a tytułem okna aplikacji. Fragmenty kodu, które są tu pokazane, nie mają nic wspólnego z uzyskaniem czy przypisaniem nazwy obiektu programistycznego – chodzi wyłącznie o to, co użytkownik zobaczy na pasku tytułu okna po uruchomieniu programu. W językach takich jak Java, nazwa obiektu (np. instancji JFrame) to coś, co ustalamy we własnym kodzie i nie jest to tożsame z tym, co widać na ekranie. W przypadku XAML, a konkretnie atrybutów jak Title, nie przypisujemy żadnej nazwy programistycznej, lecz tylko wyświetlany tekst. Innym błędem jest sądzenie, że kod zapisuje tytuł do obiektu o nazwie „Tekst” – nie ma tu żadnej referencji do obiektu o tej nazwie; to po prostu wartość tekstowa, która będzie widoczna dla użytkownika. Takie błędne rozumowanie często wynika z mylenia pojęć 'nazwa obiektu' i 'wyświetlany tytuł', co niestety bywa źródłem nieporozumień na egzaminach. W praktyce, operując na GUI, tytuł okna nadajemy, żeby użytkownik rozpoznawał aplikację lub jej aktualny stan, a nie po to, żeby zarządzać obiektami w kodzie. Jest to raczej kwestia interfejsu użytkownika, nie stricte struktury programu. Z punktu widzenia dobrych praktyk, ważne jest, żeby pamiętać o tym rozróżnieniu i nie traktować tekstów wyświetlanych użytkownikowi jako nazw czy zmiennych w kodzie. Takie myślenie może prowadzić do niejasności i błędów, zwłaszcza przy rozbudowanych aplikacjach okienkowych, gdzie zarządzanie nazwami obiektów i elementami interfejsu powinno być jasno rozdzielone.

Pytanie 25

Które z wymienionych działań stanowi zagrożenie dla emocjonalnego dobrostanu człowieka w sieci?

A. Zła postawa podczas pracy przy komputerze
B. Przesyłanie niezaszyfrowanych plików
C. Nadmierne korzystanie z mediów społecznościowych
D. Cyberstalking
Cyberstalking to groźne zjawisko polegające na uporczywym prześladowaniu, nękaniu lub groźbach w przestrzeni internetowej. Może prowadzić do poważnych problemów emocjonalnych, takich jak lęki, depresja, a nawet zespół stresu pourazowego (PTSD). Cyberstalking narusza prywatność ofiary, wywołując poczucie zagrożenia i bezradności. Walka z tym zjawiskiem obejmuje zgłaszanie przypadków organom ścigania, blokowanie prześladowców i korzystanie z narzędzi ochrony prywatności.

Pytanie 26

Jakie czynności należy wykonać, aby zrealizować zdarzenie kliknięcia na przycisk w aplikacji desktopowej?

A. Zmienić plik XAML
B. Utworzyć metodę w systemie menu
C. Zaprojektować nowy dialog modalny
D. Powiązać zdarzenie kliknięcia z odpowiednią metodą w kodzie
Podłączenie zdarzenia kliknięcia do odpowiedniej metody w kodzie to podstawowy krok w obsłudze interakcji użytkownika z przyciskiem w aplikacjach desktopowych. W środowiskach takich jak WPF (Windows Presentation Foundation), WinForms czy Qt, każda kontrolka (np. przycisk) może posiadać przypisaną metodę, która zostanie wywołana w momencie kliknięcia. Dzięki temu możliwe jest wykonywanie operacji, takich jak otwieranie nowych okien, przetwarzanie danych lub aktualizacja interfejsu użytkownika. Prawidłowa implementacja zdarzeń jest kluczowa dla funkcjonalności aplikacji i umożliwia dynamiczne reagowanie na działania użytkownika. W środowiskach takich jak Visual Studio, proces ten jest intuicyjny i często realizowany przez mechanizm 'kliknij i przeciągnij', a następnie przypisanie kodu do wygenerowanego szkieletu funkcji.

Pytanie 27

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

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

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

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

A. zintegrowane środowisko programistyczne
B. prototypowanie wsparte testami jednostkowymi
C. środowisko szybkiego rozwoju aplikacji
D. środowisko refaktoryzacji aplikacji
Skrót RAD w świecie IT to, mimo wielu mylących rozszerzeń, nie „środowisko refaktoryzacji aplikacji”, nie „zintegrowane środowisko programistyczne” i zdecydowanie nie „prototypowanie wsparte testami jednostkowymi”. Każda z tych odpowiedzi odwołuje się do pojęć dobrze znanych w branży, ale nie ma bezpośredniego związku z tym, co oznacza RAD. Refaktoryzacja aplikacji to proces poprawiania istniejącego kodu bez zmiany jego funkcjonalności, czyli bardziej kwestia utrzymania i rozwoju jakości niż szybkiego budowania prototypów. Zintegrowane środowisko programistyczne (IDE) to narzędzia takie jak Visual Studio, Eclipse czy IntelliJ, które wspierają programistów w pisaniu kodu, debugowaniu i zarządzaniu projektami. To są środowiska, ale nie metodyki wytwarzania oprogramowania. Natomiast „prototypowanie wsparte testami jednostkowymi” to raczej fragmentaryczny opis technik stosowanych w różnych procesach projektowych, ale nie oddaje idei RAD. Typowym błędem jest mylenie narzędzi z metodykami – to dwie różne rzeczy, choć często idą w parze. RAD to podejście, które pozwala szybko dostarczać działające wersje aplikacji i testować je z użytkownikami końcowymi, zanim powstanie pełna specyfikacja. Bazuje na adaptacyjności, krótkich cyklach iteracyjnych i intensywnym wykorzystaniu prototypowania. Z mojego doświadczenia wynika, że wiele osób myśli o RAD wyłącznie jako o narzędziu lub środowisku do pisania kodu, a to dużo szersza koncepcja, wpływająca na cały sposób prowadzenia projektu. Warto dostrzegać, kiedy dany termin oznacza proces lub filozofię prowadzenia prac, a nie tylko konkretny zestaw narzędzi czy pojedynczą technikę.

Pytanie 28

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

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

Pytanie 29

Które z wymienionych oznaczeń wskazuje na liniową złożoność algorytmu?

A. O(1)
B. O(n)
C. O(log n)
D. O(n²)
Złożoność O(n) oznacza liniową zależność czasu wykonania algorytmu od rozmiaru danych wejściowych. Oznacza to, że dla każdego dodatkowego elementu algorytm wykonuje jedną dodatkową operację. Algorytmy liniowe są jednymi z najczęściej stosowanych w praktyce, ponieważ oferują dobrą równowagę między szybkością a złożonością implementacji. Przykłady algorytmów o złożoności O(n) to przeszukiwanie liniowe (Linear Search), sumowanie elementów tablicy oraz niektóre algorytmy sortowania, takie jak Counting Sort dla określonych warunków. Liniowa złożoność czyni te algorytmy bardzo efektywnymi przy przetwarzaniu dużych zbiorów danych.

Pytanie 30

Jakie operacje na plikach można uznać za podstawowe?

A. Usuwanie oraz tworzenie nowych plików
B. Otwieranie, zapisywanie, odczytywanie, zamykanie
C. Zmiana rozszerzenia plików podczas działania programu
D. Jedynie otwieranie oraz zamykanie plików
Tylko otwieranie i zamykanie plików to zbyt ograniczone podejście – zapis i odczyt są równie istotne w pracy z plikami. Usuwanie i tworzenie nowych plików to dodatkowe operacje, ale nie należą do podstawowych operacji na plikach otwartych do przetwarzania. Zmiana rozszerzenia plików w trakcie działania programu to specyficzna operacja, która nie jest częścią podstawowych operacji plikowych – może być realizowana jako część bardziej złożonych aplikacji, ale nie należy do podstawowych funkcji pracy z plikami.

Pytanie 31

Który z wymienionych frameworków służy do budowy aplikacji webowych w C#?

A. Angular
B. ASP.NET Core
C. Django
D. React.js
Django to framework dla języka Python, który nie jest związany z ekosystemem C#. Angular to framework frontendowy oparty na TypeScript, używany do tworzenia interfejsów użytkownika, ale nie pełni roli backendowego frameworka webowego w C#. React.js to biblioteka JavaScript dedykowana budowie dynamicznych komponentów frontendowych i nie jest wykorzystywana do budowy backendowych aplikacji w C#.

Pytanie 32

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

A. Task Deployment Diagram - schemat wdrażania zadań w projekcie
B. Technical Design Document - dokumentacja techniczna projektu
C. Test-Driven Development - praktyka pisania testów przed implementacją kodu
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 33

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 przez wybór
C. Sortowanie bąbelkowe
D. Sortowanie szybkie (QuickSort)
QuickSort to naprawdę jeden z najlepszych sposobów na sortowanie. W zasadzie chodzi o to, że dzielimy naszą tablicę na dwie części, z pomocą takiego specjalnego elementu, który nazywamy pivotem. W praktyce działa to tak, że mamy część mniejszą i większą od tego pivota, a potem każdą z tych części sortujemy jeszcze raz, tak jakbyśmy powtarzali cały proces. Myślę, że to działa super, szczególnie na dużych zbiorach danych, i dlatego QuickSort jest naprawdę popularny w różnych programach i aplikacjach.

Pytanie 34

Zgodnie z informacjami zawartymi w ramce, wskaż, który z rysunków ilustruje element przypisany do klasy Badge określonej w bibliotece Bootstrap?

Ilustracja do pytania
A. B
B. D
C. A
D. C
Wybrałeś wariant B i to zdecydowanie właściwy trop. Badge w Bootstrapie to nic innego jak taki mały, liczbowy wskaźnik – najczęściej widoczny przy nazwach kategorii, powiadomieniach czy komentarzach – który sygnalizuje użytkownikowi ile czegoś się pojawiło albo ile czeka akcji do wykonania. W praktyce, taki element to nie tylko liczba w kolorowym prostokącie czy kółku, ale też bardzo czytelny komunikat do użytkownika, co się ostatnio zmieniło lub co wymaga uwagi. Właśnie dlatego, w przykładzie B, mamy niebieskie prostokąty z liczbami przy różnych sekcjach (News, Comments, Updates) – to klasyczny przykład badge’a w Bootstrapie, często stylowanego klasą .badge i powiązaną kolorystyką. Warto zwrócić uwagę, że takie badge’e są nie tylko wizualne, ale też semantyczne – są rozpoznawalne przez czytniki ekranu, co jest zgodne z dobrymi praktykami dostępności (WCAG). Stosując badge’e, zwiększamy czytelność i dostępność interfejsu użytkownika, bo od razu wiadomo, gdzie coś nowego się pojawiło. Moim zdaniem, korzystanie z badge’y to jeden z prostszych i skuteczniejszych sposobów na poprawę UX – no i są bardzo łatwe do wdrożenia, wystarczy jedna klasa CSS i gotowe.

Pytanie 35

Zaprezentowany kod zawiera pola danej klasy. Które pole (pola) mogą być dostępne z poziomu głównego programu poprzez odwołanie w formie nazwaObiektu.nazwaPola?

private int p1;
private short p2;
public string p3;
protected string p4;
protected float p5;
A. p1
B. p3 i p4
C. wyłącznie p3, p4, p5
D. jedynie p3
Wiele osób myli się, zakładając, że protected albo nawet private pozwalają na dostęp do pól poprzez zwykłe odwołanie się z głównego programu, czyli pisząc coś w rodzaju nazwaObiektu.nazwaPola. To dość częsty błąd, chyba przez to, że protected brzmi jakby dawało trochę więcej wolności niż naprawdę daje. Tak naprawdę protected umożliwia dostęp tylko klasom dziedziczącym (czyli podklasom), ewentualnie klasom pakietu w niektórych językach, ale nigdy nie pozwala na bezpośredni dostęp z zewnątrz klasy, jeśli nie ma dziedziczenia. Z kolei private to już w ogóle najwyższy poziom ukrycia – nikt poza samą klasą nie może widzieć tych pól, więc wywołanie obiekt.p1 albo obiekt.p2 zwyczajnie nie przejdzie. Tak samo niektórym wydaje się, że skoro kilka pól wygląda na 'bardziej dostępne', to może da się je wywołać, ale tu liczy się wyłącznie modyfikator. Public to jedyny modyfikator umożliwiający dostęp z dowolnego miejsca w programie, w tym z głównego programu, właśnie za pomocą nazwaObiektu.nazwaPola. Modyfikatory takie jak protected czy private są podstawą hermetyzacji i chronią przed nieautoryzowaną modyfikacją, co jest kluczowe przy większych projektach. Praktycznie nikt nie powinien polegać na tym, że protected daje bezpośredni dostęp z zewnątrz – to prowadzi do nieporozumień i błędów w projektowaniu kodu. Moim zdaniem warto zapamiętać, że jeśli nie widzisz słowa public przy polu, to raczej nie możesz się do niego odwołać z głównego programu w opisany sposób. To jedno z tych zagadnień, które wydają się oczywiste po przestudiowaniu, ale potrafią zaskoczyć na egzaminie czy w pracy zespołowej.

Pytanie 36

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

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

Pytanie 37

Co oznacza skrót SOLID w programowaniu obiektowym?

A. Popularna metodologia testowania aplikacji mobilnych i webowych
B. Standard tworzenia dokumentacji technicznej dla aplikacji
C. System organizacji zadań w metodologii zwinnej używany w Scrum
D. Zbiór pięciu zasad projektowania oprogramowania ułatwiających tworzenie czytelnego kodu
Skrót SOLID odnosi się do pięciu podstawowych zasad projektowania obiektowego, które zostały sformułowane przez Roberta C. Martina. Zasady te, a mianowicie: Single Responsibility Principle (SRP), Open/Closed Principle (OCP), Liskov Substitution Principle (LSP), Interface Segregation Principle (ISP) oraz Dependency Inversion Principle (DIP), mają na celu ułatwienie tworzenia czytelnego, łatwego do modyfikacji i rozszerzenia kodu. Przykładowo, zasada SRP mówi o tym, że każda klasa powinna mieć jedną odpowiedzialność, co pozwala na łatwiejsze wprowadzanie zmian oraz testowanie. Implementacja SOLID sprzyja także lepszej organizacji kodu, co jest kluczowe w dużych projektach, gdzie złożoność i liczba współpracujących komponentów mogą prowadzić do trudności w zarządzaniu. Przykład praktyczny można zobaczyć w aplikacji używającej wzorców projektowych, gdzie zasady SOLID pomagają w tworzeniu elastycznych i dobrze zorganizowanych systemów. W branży programistycznej, przestrzeganie tych zasad jest uznawane za dobrą praktykę, co przyczynia się do zwiększenia jakości oprogramowania oraz satysfakcji zespołów developerskich.

Pytanie 38

Jaki komponent środowiska IDE jest niezbędny do tworzenia aplikacji webowych?

A. Debugger, edytor kodu, integracja z systemem kontroli wersji
B. Narzędzie do tworzenia grafiki
C. Emulator urządzeń mobilnych
D. Zarządzanie bazami danych
Debugger, edytor kodu oraz integracja z systemem kontroli wersji to kluczowe elementy środowiska IDE, które umożliwiają efektywną pracę nad aplikacjami webowymi. Debugger pozwala na wykrywanie i naprawianie błędów w czasie rzeczywistym, edytor kodu umożliwia szybkie pisanie i modyfikowanie kodu, a integracja z systemem kontroli wersji (np. Git) pozwala śledzić zmiany i współpracować w zespołach programistycznych. Te narzędzia stanowią podstawę pracy każdego dewelopera webowego.

Pytanie 39

Co to jest klasa abstrakcyjna?

A. Klasa, która może zawierać zarówno metody zdefiniowane, jak i niezdefiniowane (czysto wirtualne)
B. Klasa, która zawsze dziedziczy z klasy bazowej
C. Klasa, która nie może posiadać żadnych metod
D. Klasa, która może być dziedziczona, ale nie można jej instancjonować
Poprawną odpowiedzią jest „Klasa, która może być dziedziczona, ale nie można jej instancjonować”, ponieważ najlepiej oddaje istotę klasy abstrakcyjnej w programowaniu obiektowym. Klasa abstrakcyjna pełni rolę szablonu dla klas pochodnych – określa wspólną strukturę, zachowania lub interfejs, które powinny zostać zaimplementowane przez klasy dziedziczące. Nie można tworzyć jej obiektów, ponieważ nie reprezentuje ona kompletnego bytu, lecz raczej pojęcie ogólne. Takie podejście umożliwia stosowanie dziedziczenia i polimorfizmu, poprawia czytelność kodu oraz ułatwia jego rozbudowę i utrzymanie. Klasy abstrakcyjne są często wykorzystywane do narzucania jednolitego sposobu implementacji metod w całej hierarchii klas. Pozostałe odpowiedzi są niepoprawne, ponieważ opisują cechy, które nie definiują jednoznacznie klasy abstrakcyjnej lub są błędne. Stwierdzenie „Klasa, która zawsze dziedziczy z klasy bazowej” jest nieprawidłowe, gdyż klasa abstrakcyjna sama może być klasą bazową i nie musi dziedziczyć po innej klasie. Odpowiedź „Klasa, która może zawierać zarówno metody zdefiniowane, jak i niezdefiniowane (czysto wirtualne)” jest nieprecyzyjna – taka możliwość często występuje, ale nie jest warunkiem koniecznym, by uznać klasę za abstrakcyjną. Natomiast odpowiedź „Klasa, która nie może posiadać żadnych metod” jest całkowicie błędna, ponieważ klasy abstrakcyjne mogą zawierać zarówno metody abstrakcyjne, jak i w pełni zaimplementowane. Zrozumienie tych różnic pozwala poprawnie rozpoznać, czym naprawdę jest klasa abstrakcyjna.

Pytanie 40

Teoria wyznaczania celów definiuje właściwie sformułowany cel jako SMART, od pierwszych liter słów: specyficzny, Mierzalny, Ambitny, Realny oraz Terminowy. Wskaź, który cel wymaga wysiłku i stanowi wyzwanie dla pracownika?

A. Specyficzny
B. Mierzalny
C. Terminowy
D. Ambitny
Wielu osobom zdarza się mylić pojęcia związane z cechami dobrego celu według koncepcji SMART, co jest całkiem zrozumiałe w praktyce zarządzania. Często spotykam się z przekonaniem, że mierzalność lub terminowość są najważniejsze, bo to przecież liczby i daty, ale to tylko częściowa prawda. Cel mierzalny oznacza, że można go sprawdzić za pomocą konkretnych wskaźników czy liczb – przykładowo: „zwiększyć sprzedaż o 10%”. Pozwala to łatwo ocenić, czy zadanie zostało wykonane, ale wcale nie gwarantuje, że osiągnięcie będzie dużym wyzwaniem. Z kolei terminowość to przypisanie celu do określonego przedziału czasu, np. „do końca kwartału”, co zapewnia poczucie presji czasu, lecz nadal nie mówi nic o poziomie trudności. Specyficzność sprowadza się do jasności i jednoznaczności celu, na przykład: „poprawić efektywność obsługi klienta w działaniu X”. Wszystkie te elementy są bardzo ważne z punktu widzenia skuteczności zarządzania i planowania pracy, jednak żaden z nich sam w sobie nie wymaga od pracownika większego zaangażowania lub przełamywania własnych barier. To właśnie cecha „ambitny” sprawia, że cel wykracza poza to, co już znane i osiągnięte, stawia poprzeczkę trochę wyżej – co jest szczególnie doceniane w nowoczesnych metodykach zarządzania zasobami ludzkimi. Niezrozumienie tych niuansów prowadzi do błędów w wyznaczaniu celów, które są zbyt łatwe lub zbyt ogólne, przez co nie wpływają na realny rozwój kompetencji. Moim zdaniem warto przy każdej okazji wracać do definicji SMART i analizować, która z jego składowych rzeczywiście odpowiada za pobudzenie motywacji i poczucie wyzwania – a nie tylko za formalny porządek.