Wyniki egzaminu

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

Egzamin zdany!

Wynik: 28/40 punktów (70,0%)

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

Programista może wykorzystać framework Angular do realizacji aplikacji:

A. na komputerze
B. mobilnej
C. rodzaju front-end
D. rodzaju back-end
Angular to świetne narzędzie do tworzenia aplikacji front-endowych. Chodzi o to, że odpowiada za to, co widzi użytkownik i jak może z tym interagować. Dzięki Angular możemy budować dynamiczne i responsywne aplikacje webowe. Z tego co widzę, używamy tam komponentów, modułów i rzeczy typu dwukierunkowe wiązanie danych, co naprawdę ułatwia życie. Bez wątpienia, Angular jest jednym z najpopularniejszych frameworków do robienia interfejsów użytkownika, co tylko potwierdza jego efektywność.

Pytanie 2

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

A. Jest wczytywana do pamięci podczas działania aplikacji
B. Nie potrzebuje obecności pliku wykonywalnego
C. Zostaje dodana do pliku wykonywalnego w trakcie kompilacji
D. Może być zmieniana w czasie działania programu
Biblioteka statyczna jest dołączana do pliku wykonywalnego podczas procesu kompilacji. Oznacza to, że jej kod staje się integralną częścią aplikacji, co eliminuje konieczność ładowania jej w czasie wykonywania programu. Tego typu biblioteki charakteryzują się większym rozmiarem pliku wynikowego, ale oferują wyższą wydajność, ponieważ wszystkie funkcje są dostępne lokalnie, bez dodatkowych operacji ładowania. Przykładami bibliotek statycznych są pliki .lib w C/C++.

Pytanie 3

W sekcji, która odpowiada za obsługę wyjątku wygenerowanego przez aplikację, należy to zdefiniować

A. finally
B. catch
C. throw
D. try
Wiele osób myli poszczególne sekcje obsługi wyjątków, co jest całkiem zrozumiałe, bo składnia bywa myląca, zwłaszcza na początku nauki. Sekcja finally jest często używana do sprzątania po operacjach, które mogą zgłaszać wyjątki, takich jak zamykanie plików czy połączeń sieciowych, ale nie służy do przechwytywania wyjątków – jej kod wykonuje się zawsze, niezależnie od tego, czy wyjątek wystąpił, czy nie. To taka gwarancja, że 'posprzątasz' po swojej operacji. Słowo throw natomiast wykorzystuje się do generowania własnych wyjątków – służy do 'wyrzucenia' wyjątku, a nie do jego obsługi. Czasami to dobre rozwiązanie, jak chcesz np. zakomunikować, że coś poszło nie tak w Twojej własnej logice, ale tym nie przechwycisz wyjątku. Try z kolei to miejsce, gdzie umieszczasz kod, który potencjalnie może rzucić wyjątek – stanowi on początek bloku obsługi wyjątków, ale sam nie przechwytuje, tylko wskazuje, co trzeba monitorować. Programiści czasami błędnie zakładają, że try automatycznie coś obsługuje, ale to tak nie działa – bez catch nie przechwycisz ani jednego wyjątku. Z mojego doświadczenia wynika, że najczęstszy błąd to mylenie throw z catch, bo oba występują w kontekście wyjątków, ale ich rola jest zupełnie inna. Throw inicjuje wyjątek, catch go przechwytuje. W dobrych praktykach branżowych jednoznacznie się podkreśla, że sekcję catch stosuje się do obsługi i reagowania na wyjątki, a try i finally to tylko części tej układanki. Takie rozróżnienie pomaga potem pisać bardziej przewidywalny i stabilny kod, a to według mnie w pracy programisty bywa kluczowe.

Pytanie 4

Jakie narzędzie wspiera tworzenie aplikacji desktopowych?

A. Angular
B. WPF
C. Symfony
D. Xamarin
Wybierając narzędzia do tworzenia aplikacji desktopowych, bardzo łatwo pomylić rozwiązania webowe albo multiplatformowe z natywnymi frameworkami dla komputerów stacjonarnych. Chyba najczęstsze nieporozumienie dotyczy Angulara i Symfony – oba te narzędzia służą przede wszystkim do budowy aplikacji webowych, czyli takich, które działają w przeglądarce. Angular to framework JavaScriptowy (a właściwie TypeScriptowy), który pozwala tworzyć rozbudowane interfejsy użytkownika, lecz jego środowisko pracy to internet, nie typowy desktop. Symfony natomiast jest frameworkiem PHP przeznaczonym do budowy solidnych aplikacji serwerowych, backendowych, i choć czasem da się tworzyć coś na wzór aplikacji desktopowej z użyciem Electron czy innych pośrednich technologii, to jednak nie jest to ich naturalne środowisko. Xamarin z kolei bywa mylący, bo umożliwia tworzenie aplikacji mobilnych (Android, iOS), a także w pewnym stopniu desktopowych, zwłaszcza w kontekście Xamarin.Forms – jednak w praktyce jego główne zastosowanie to świat urządzeń mobilnych i aplikacje cross-platformowe. Wielu początkujących sądzi, że skoro Xamarin pozwala pisać w C#, to automatycznie nadaje się do każdego rodzaju aplikacji, ale to nie do końca prawda – do natywnych aplikacji desktopowych przeznaczone są inne rozwiązania, takie jak właśnie WPF. Moim zdaniem najczęstszy błąd polega na utożsamianiu „nowoczesnych frameworków” z uniwersalnością – tymczasem, żeby wybrać właściwe narzędzie, trzeba dobrze rozumieć, do jakiego środowiska jest ono zaprojektowane. W praktyce, jeśli chodzi o desktop na Windows, to WPF pozostaje jednym z kluczowych wyborów, podczas gdy reszta wymienionych technologii skupia się zupełnie na innych platformach i przypadkach użycia.

Pytanie 5

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

A. JSON
B. XML
C. SVG
D. CSV
Odpowiedź SVG (Scalable Vector Graphics) jest prawidłowa, ponieważ jest to standardowy format grafiki wektorowej, który jest szeroko stosowany do tworzenia dynamicznych wykresów i animacji w przeglądarkach internetowych. SVG pozwala na łatwe skalowanie grafik bez utraty jakości, co czyni go idealnym wyborem do aplikacji internetowych, które muszą wyświetlać wykresy w różnych rozmiarach. Przykłady zastosowania SVG obejmują interaktywne wizualizacje danych, takie jak wykresy liniowe, słupkowe czy kołowe, które można zrealizować przy użyciu biblioteki JavaScript, takiej jak D3.js. Ponadto, SVG jest kompatybilne z CSS i JavaScript, co umożliwia stylizowanie oraz dodawanie interakcji do grafik. Warto również zauważyć, że SVG jest częścią specyfikacji HTML5, co podkreśla jego znaczenie w nowoczesnym tworzeniu stron internetowych. Dobrą praktyką jest także dbanie o dostępność i zapewnianie odpowiednich atrybutów, takich jak 'title' i 'desc', aby poprawić doświadczenie użytkowników niepełnosprawnych.

Pytanie 6

Która z poniższych metod tablicowych w JavaScript nie modyfikuje oryginalnej tablicy?

A. push()
B. splice()
C. sort()
D. map()
Wybór metod, które modyfikują oryginalną tablicę w JavaScript, może prowadzić do nieporozumień, szczególnie dla osób rozpoczynających przygodę z tym językiem programowania. Metody takie jak splice(), sort() czy push() wprowadzają zmiany w oryginalnych danych, co może skutkować niezamierzonymi efektami ubocznymi. Na przykład, splice() jest używane do usuwania lub dodawania elementów w tablicy, co bezpośrednio zmienia jej strukturę. Z kolei sort() zmienia kolejność elementów w tablicy na podstawie kryteriów porównania, co może prowadzić do utraty dotychczasowego porządku, jeśli oryginalna tablica jest nadal potrzebna w jej pierwotnej formie. Push() natomiast dodaje nowe elementy na końcu tablicy, co zwiększa jej długość oraz może wpłynąć na logikę aplikacji, jeżeli elementy są wykorzystywane w innych częściach kodu. Te metody mogą prowadzić do typowych błędów myślowych, takich jak założenie, że operacje na danych są statyczne i nie wpływają na ich oryginalne formy. Dlatego w praktyce programistycznej, szczególnie w większych i bardziej złożonych projektach, istotne jest, aby być świadomym, jakie metody wpływają na oryginalne dane, aby uniknąć przypadkowych błędów oraz nieprzewidzianych konsekwencji. Używanie funkcji, które nie zmieniają oryginalnej tablicy, takich jak map(), cieszy się dużą popularnością i jest zgodne z najlepszymi praktykami w programowaniu funkcyjnym.

Pytanie 7

Jak zostanie przedstawiony poniższy kod XAML?

Ilustracja do pytania
A. Rysunek 2
B. Rysunek 1
C. Rysunek 4
D. Rysunek 3
Błędy w rozumieniu XAML mogą prowadzić do niepoprawnego renderowania interfejsu użytkownika. W przypadku przedstawionego kodu kluczowym elementem jest zrozumienie struktury StackLayout który domyślnie ustawia elementy w pionie chyba że określono Orientation jako Horizontal jak w przypadku etykiety Zgoda RODO i przełącznika co może być mylące gdyż sugeruje potrzebę zwrócenia uwagi na szczegóły. W innych rysunkach jak na przykład Rysunek 1 brak pola nazwisko wskazuje na błędne zrozumienie struktury kodu gdzie Entry dla nazwiska jest obecne ale nie jest widoczne co wskazuje na potrzebę poprawnego zrozumienia jak StackLayout renderuje elementy. Podobnie Rysunek 3 zawiera dodatkowe przyciski co sugeruje błędne zinterpretowanie przycisków nieobecnych w kodzie. Zrozumienie Slidera jest również kluczowe gdyż jego wartości i kolory wpływają na potencjalne błędne renderowanie suwaka w innych rysunkach. Błędy mogą wynikać z ignorowania tak kluczowych elementów jak IsToggled dla przełącznika co determinuje jego początkowy stan i jest często pomijanym aspektem przez mniej doświadczonych programistów. Stąd istotne jest dokładne zrozumienie jak poszczególne właściwości wpływają na końcowy wygląd interfejsu aby uniknąć typowych błędów projektowych i zapewnić funkcjonalność zgodną z oczekiwaniami użytkownika.

Pytanie 8

Zmienna o typie logicznym może mieć następujące wartości:

A. trzy dowolne liczby naturalne
B. true, false
C. 0 oraz każda liczba całkowita
D. 1, -1
Typ logiczny (boolean) może przyjąć jedynie dwie wartości: true (prawda) i false (fałsz). Jest to fundamentalna zasada w programowaniu, ponieważ zmienne logiczne są podstawą operacji warunkowych, pętli oraz sterowania przepływem programu. W językach takich jak C++, Java, Python i wielu innych, wartości logiczne pozwalają na budowanie złożonych struktur decyzyjnych. Dzięki nim programista może precyzyjnie kontrolować, które fragmenty kodu zostaną wykonane, co jest kluczowe w implementacji algorytmów oraz walidacji danych.

Pytanie 9

Które z poniższych nie jest algorytmem sortowania?

A. Bubble Sort
B. Binary Search
C. Merge Sort
D. Quick Sort
Binary Search jest algorytmem, który służy do efektywnego przeszukiwania uporządkowanych zbiorów danych, a nie do sortowania. Działa na zasadzie dzielenia zbioru na pół i eliminowania połowy z nich w każdym kroku, co pozwala na szybkie znalezienie poszukiwanej wartości. Jest to przykład algorytmu o czasie działania O(log n), co sprawia, że jest znacznie szybszy od prostego przeszukiwania liniowego. Przykładowo, gdy mamy posortowaną tablicę liczb, Binary Search może być użyty do znalezienia konkretnej liczby, eliminując w każdym kroku połowę zbioru, aż do odnalezienia wartości lub stwierdzenia, że jej nie ma. W kontekście branżowym, Binary Search jest szeroko stosowany w różnych aplikacjach, gdzie wymagane jest szybkie przeszukiwanie danych, na przykład w bazach danych i aplikacjach wyszukiwania. Kluczowe jest zrozumienie różnicy między algorytmem przeszukiwania a algorytmem sortowania; sortowanie odnosi się do organizacji danych w określonym porządku, podczas gdy Binary Search koncentruje się na znajdowaniu elementów w już posortowanych zbiorach.

Pytanie 10

Który z wymienionych etapów w procesie przetwarzania instrukcji przez procesor odbywa się jako pierwszy?

A. Rozkodowanie rozkazu (Decode)
B. Realizacja instrukcji (Execution)
C. Pobranie rozkazu z pamięci (Fetch)
D. Zapis wyników do pamięci (Write Back)
Pierwszą rzeczą, jaką robi procesor, jest pobranie rozkazu z pamięci, co nazywamy Fetch. To bardzo ważny etap w budowie komputera. Normalnie cykl wykonywania instrukcji składa się z trzech głównych kroków: pobierania, dekodowania i wykonania. W fazie Fetch procesor dobiera się do pamięci i ściąga instrukcję, którą zaraz wykona. Do tego używa rejestru wskaźnika instrukcji, czyli Instruction Pointer, który pokazuje, gdzie w pamięci jest następna instrukcja. Jak to działa w praktyce? Można to zobaczyć na przykładzie procesora x86, gdzie CPU na początku cyklu sprawdza pamięć RAM, szukając instrukcji według adresu, który podaje wskaźnik. Standardy takie jak ISA (Instruction Set Architecture) mówią, że ten krok to podstawa, bo to właśnie od niego zaczyna się wszystko, co robi procesor.

Pytanie 11

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

A. Abstrakcja
B. Polimorfizm
C. Hermetyzacja
D. Dziedziczenie
Polimorfizm to zdolność obiektów do przyjmowania różnych form w zależności od kontekstu. Pozwala to na wywoływanie metod tej samej nazwy, ale o różnych implementacjach, w zależności od typu obiektu. Hermetyzacja odnosi się do ukrywania wewnętrznych detali implementacji klasy i udostępniania tylko niezbędnych interfejsów, co zapewnia większe bezpieczeństwo kodu. Abstrakcja to proces wydzielania najistotniejszych cech obiektu i ukrywania mniej istotnych szczegółów, co pozwala na tworzenie bardziej ogólnych modeli programistycznych. Choć wszystkie te cechy są ważne w OOP, tylko dziedziczenie pozwala klasie na przejęcie cech innej klasy.

Pytanie 12

Przyjmując, że opisana hierarchia klas właściwie odzwierciedla figury geometryczne i każda figura ma zdefiniowaną metodę do obliczania pola, to w której klasie można znaleźć deklarację metody liczPole()?

Ilustracja do pytania
A. trójkąt
B. figura
C. trapez
D. czworokąt
Deklaracja metody liczPole() powinna znajdować się w klasie bazowej, czyli w tym przypadku w klasie „figura”. To podejście jest zgodne z zasadami programowania obiektowego i tzw. polimorfizmem. Dzięki temu każda klasa dziedzicząca po „figurze” jest zobowiązana do własnej implementacji tej metody. To bardzo praktyczne rozwiązanie, bo umożliwia tworzenie ogólnych kolekcji (np. List<Figura>), które mogą przechowywać obiekty różnych figur, a następnie wywoływać liczPole() na każdym z nich bez zastanawiania się, jakiego typu to dokładnie obiekt. Z mojego doświadczenia wynika, że tak właśnie projektuje się API i biblioteki geometryczne – klasa bazowa narzuca kontrakt, a szczegóły są po stronie konkretnych figur. Warto dodać, że zgodnie z dobrymi praktykami, do deklarowania takich metod używa się słowa kluczowego „abstract”, co jasno komunikuje, że metoda musi być uzupełniona w klasach potomnych. Takie podejście mocno ułatwia rozbudowę kodu, np. kiedy chcemy dodać nowy typ figury, wystarczy, że nadpiszemy liczPole(). Moim zdaniem to jeden z najfajniejszych przykładów, jak dobrze przemyślana architektura kodu oszczędza czas i nerwy programistom.

Pytanie 13

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. Ilu użytkowników planuje z niej skorzystać?
B. Czuję pewne wątpliwości w Pani głosie. Czy mogę zadać kilka pytań?
C. Dlaczego Pani potrzebuje takiej aplikacji?
D. Jeśli dobrze zrozumiałam, chodzi o aplikację, która efektywnie obsługuje różne obciążenia
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 14

Modyfikator dostępu, który znajduje się przed definicją metody Dodaj() w klasie Kalkulator, powoduje, że

protected void Dodaj() {}
A. nie jest ona dostępna z poziomu klas zaprzyjaźnionych z klasą Kalkulator
B. jest ona dostępna zarówno wewnątrz klasy, jak i w klasach dziedziczących po klasie Kalkulator
C. nie jest ona dostępna w klasach, które dziedziczą po klasie Kalkulator
D. jest ona dostępna w programie głównym i może być wywoływana na rzecz instancji klasy Kalkulator
Modyfikator dostępu protected jest kluczowym elementem programowania obiektowego, umożliwiającym kontrolę nad widocznością i dostępem do składników klasy. Gdy metoda jest oznaczona jako protected, jak w przypadku metody Dodaj() w klasie Kalkulator, oznacza to, że jest ona dostępna nie tylko w ramach tej klasy, ale również w dowolnych klasach, które dziedziczą po klasie Kalkulator. To podejście wspiera koncepcję dziedziczenia, umożliwiając klasom potomnym korzystanie z funkcjonalności klasy bazowej bez konieczności ponownego definiowania metod. Na przykład, jeśli stworzymy klasę DziecięcyKalkulator dziedziczącą po Kalkulator, metoda Dodaj() będzie dostępna w tej klasie potomnej. Takie rozwiązanie jest często stosowane w projektach, gdzie istnieje potrzeba rozszerzania funkcjonalności bazowych klas bez naruszania ich enkapsulacji. Dobre praktyki programistyczne sugerują stosowanie protected tam, gdzie chcemy umożliwić dziedziczenie oraz uniknąć nadmiernego udostępniania elementów klasy zewnętrznym użytkownikom. Dzięki temu kod staje się bardziej modularny i elastyczny, co jest istotne w dużych projektach programistycznych. Zrozumienie roli modyfikatorów dostępu, takich jak protected, jest kluczowe dla efektywnego projektowania i implementacji systemów obiektowych.

Pytanie 15

Który framework jest powszechnie wykorzystywany do tworzenia aplikacji internetowych w języku Python?

A. React.js
B. Angular
C. ASP.NET Core
D. Django
Django to framework stworzony specjalnie do budowy aplikacji webowych w języku Python. Jest jednym z najbardziej popularnych i zaawansowanych frameworków typu full-stack, który oferuje szeroki wachlarz narzędzi umożliwiających szybkie i efektywne tworzenie aplikacji internetowych. Django pozwala na tworzenie aplikacji zgodnych z zasadą DRY (Don't Repeat Yourself), co oznacza minimalizację powtarzalnego kodu. Posiada wbudowany panel administracyjny, system ORM (Object-Relational Mapping) oraz zabezpieczenia przed atakami CSRF i XSS. Dzięki Django programiści mogą skupić się na rozwijaniu logiki biznesowej, a nie na konfiguracji podstawowych funkcji aplikacji, co znacznie skraca czas wdrożenia gotowego produktu.

Pytanie 16

Jedną z zasad standardu WCAG 2.0 jest

A. stosowanie różnych palet kolorystycznych, w tym o wysokim kontraście
B. unikanie przedstawiania informacji w formie uproszczonej
C. używanie jednego, odpowiednio dużego rozmiaru czcionki
D. ograniczanie treści na stronie przez rezygnację z używania alternatywnych tekstów dla obrazów i filmów
Stosowanie różnych palet kolorystycznych, zwłaszcza takich z wysokim kontrastem, to naprawdę kluczowa sprawa w dostępności cyfrowej. Tak mówi standard WCAG 2.0, dokładniej zasada 1 – Postrzegalność. Chodzi tu głównie o kryterium sukcesu 1.4.3 (Kontrast – minimum), które wyraźnie określa, że tekst i treść graficzna muszą być czytelne dla osób z różnymi potrzebami, np. słabszym wzrokiem albo daltonizmem. Moim zdaniem warto sobie uświadomić, jak wielka to różnica. Przykładowo, jeśli tekst na stronie jest szary na białym tle, osoby starsze lub z wadami wzroku mogą po prostu nie być w stanie nic przeczytać. W praktyce, wysokokontrastowe kombinacje, np. biały tekst na czarnym tle lub na żółtym, bardzo poprawiają dostępność strony. Widać to choćby w trybach "high contrast" w systemach Windows – często osoby pracujące długo przy komputerze z tego korzystają, bo wzrok się mniej męczy. Branżowe dobre praktyki zalecają również nie polegać wyłącznie na kolorze podczas przekazywania informacji – przykładowo, jeśli błąd w formularzu jest oznaczony tylko na czerwono, osoba z daltonizmem tego nie zauważy. To wszystko pokazuje, że kolory i kontrast to nie tylko estetyka, ale klucz do równego dostępu. Z mojego doświadczenia, gdy projektuje się strony zgodnie z WCAG, dobrze jest testować różne ustawienia kontrastu albo korzystać z narzędzi jak Colour Contrast Analyser, żeby mieć pewność, że wszyscy użytkownicy skorzystają ze strony bez problemów.

Pytanie 17

Która z niżej wymienionych pozycji jest ekwiwalentem biblioteki jQuery?

A. Lodash
B. Bootstrap
C. Express.js
D. TypeScript
Bootstrap to framework CSS, który służy do stylizacji i tworzenia responsywnych interfejsów użytkownika, ale nie oferuje narzędzi do manipulacji danymi jak Lodash. TypeScript to język programowania, który rozszerza JavaScript o statyczne typowanie, ale nie pełni roli biblioteki do manipulacji obiektami i tablicami. Express.js to minimalny framework do budowy serwerów w Node.js i nie ma zastosowania w kontekście manipulacji danymi na poziomie frontendowym, jak ma to miejsce w przypadku Lodash.

Pytanie 18

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

A. definicję warunków końcowego rozwiązania
B. pętlę dyspozytora, która w zależności od zdarzenia wywoła właściwą funkcję
C. moduły zawierające funkcje oraz zmienne globalne
D. zbiór instancji klas współpracujących ze sobą
W programowaniu obiektowym najważniejsze jest właśnie to, że wszystko opiera się na współpracujących ze sobą instancjach klas, czyli obiektach. To one przechowują dane (atrybuty) i zachowania (metody), a cała logika programu kręci się wokół ich interakcji. W praktyce oznacza to, że projektując aplikację, skupiasz się na tym, jakie obiekty będą potrzebne (np. Użytkownik, Zamówienie, Produkt), jakie mają cechy i jak ze sobą współpracują. Takie podejście pozwala na łatwiejsze zarządzanie złożonymi programami – moim zdaniem dużo prościej utrzymać i rozwijać kod, gdy jest podzielony na logiczne byty. To też zgodne ze standardami jak SOLID czy wzorce projektowe typu MVC, gdzie każda część aplikacji odpowiada za coś konkretnego, a komunikacja odbywa się przez wywołania metod. Przykład? W sklepie internetowym klasy takie jak Koszyk i Produkt "rozmawiają" ze sobą: koszyk dodaje produkt, sprawdza jego stan itd. Co ciekawe, takie ułożenie bardzo ułatwia testowanie jednostkowe – testujesz zachowanie pojedynczych obiektów, zamiast całych skomplikowanych funkcji rozsianych po programie. Z własnego doświadczenia mogę powiedzieć, że praca z kodem opartym o obiekty jest po prostu przyjemniejsza, mniej chaotyczna i zdecydowanie bardziej odporna na błędy przy rozwoju projektu.

Pytanie 19

Do implementacji w aplikacji jednokierunkowej funkcji skrótu, zwanej funkcją haszującą, można wykorzystać algorytm

A. RSA
B. MD5
C. AES
D. DES
Wiele osób myli funkcje szyfrujące z funkcjami skrótu i to jest dość powszechny błąd – spotkałem się z tym wielokrotnie podczas różnych zajęć czy projektów. Algorytmy takie jak DES, AES czy RSA to klasyczne przykłady szyfrów, czyli narzędzi do szyfrowania i odszyfrowywania danych, a nie do generowania skrótu. DES i AES to algorytmy szyfrowania symetrycznego, w których ten sam klucz jest używany zarówno do szyfrowania, jak i odszyfrowywania. RSA z kolei jest przykładem szyfrowania asymetrycznego – opiera się na parze kluczy: publicznym i prywatnym. Różnica jest fundamentalna: szyfrowanie zawsze daje możliwość odzyskania oryginalnych danych przy posiadaniu właściwego klucza, natomiast funkcja skrótu ma być jednokierunkowa, czyli nie ma (w praktyce) sposobu, by z hasha odzyskać oryginał. Stosowanie DES, AES czy RSA wszędzie tam, gdzie chodzi wyłącznie o weryfikację integralności albo podpisanie niewielkiego fragmentu danych, jest nieefektywne, niezgodne z dobrymi praktykami i standardami (np. NIST czy ISO/IEC 27001). Co więcej, taka pomyłka może prowadzić do poważnych błędów w zabezpieczeniach aplikacji. Przykład: szyfrując hasło zamiast haszować, narażamy się na jego łatwe odzyskanie przez atakującego, jeśli wycieknie klucz. Funkcje skrótu (np. MD5, SHA-256) są do tego stworzone – nie pozwalają odtworzyć wejścia, dają szybkie porównania. Warto rozumieć te różnice, bo w praktyce branżowej od tego zależy bezpieczeństwo całych systemów. Moim zdaniem, zaskakująco często nawet doświadczeni programiści się tutaj mylą, zwłaszcza jeśli nie zajmują się na co dzień bezpieczeństwem IT.

Pytanie 20

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, 3]
C. [1], [1, 2], [3], [1, 2, 4]
D. [1], [2], [3], [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 21

Wskaż typy numeryczne o stałej precyzji

A. int, short, long
B. bool char, string
C. float, double
D. long long, long double
Typy numeryczne o stałej precyzji (czyli tzw. typy całkowite) to na przykład int, short, long – dokładnie te, które wskazałeś. Działają one trochę jak liczniki – przechowują liczby całkowite w określonym zakresie, bez przecinka. Moim zdaniem to podstawa, jeśli chodzi o reprezentowanie wartości typu liczba sztuk, indeks, identyfikator – wszędzie tam, gdzie nie potrzebujemy części ułamkowej. Ich precyzja wynika z tego, że są zdefiniowane w standardzie (np. w C++ czy Javie) jako liczby całkowite reprezentowane przez określoną liczbę bitów. Dla przykładu, 32-bitowy int zawsze pomieści wartości od -2 147 483 648 do 2 147 483 647 i każdy bit jest tu ważny. W praktyce, programując mikrokontrolery albo systemy wbudowane, właściwy wybór typu o stałej precyzji potrafi decydować o stabilności i wydajności całego programu. Warto też wiedzieć, że typy te – int, short, long – nie mają błędu zaokrągleń, co często zdarza się przy operacjach na liczbach zmiennoprzecinkowych. No i jeszcze takie małe spostrzeżenie: dobrym zwyczajem jest wybieranie najmniejszego typu całkowitego, który pokryje wymagany zakres, żeby zoptymalizować zużycie pamięci. Takie podejście mocno się przydaje, zwłaszcza jak się pracuje nad większym projektem, gdzie każda optymalizacja jest na wagę złota.

Pytanie 22

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. Krzysztof
B. Anna
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 23

Która technologia jest używana do tworzenia animacji na stronach internetowych?

A. HTTP Headers
B. CSS Animations
C. SQL Queries
D. XML Schema
CSS Animations to technologia, która umożliwia tworzenie zaawansowanych efektów animacyjnych na stronach internetowych, bez konieczności użycia JavaScriptu. Dzięki CSS Animations, projektanci mogą definiować kluczowe klatki (keyframes), które określają stany stylów w określonym czasie. Przykładem praktycznego zastosowania może być animacja przycisku, który zmienia kolor i rozmiar po najechaniu na niego myszką. Tego rodzaju animacje są wspierane przez wszystkie nowoczesne przeglądarki i są zgodne z W3C, co czyni je standardem w branży. Dobrze zaprojektowane animacje poprawiają doświadczenia użytkowników, ułatwiając im interakcję z elementami strony. Warto również wspomnieć, że użycie CSS do animacji jest bardziej efektywne pod względem wydajności, ponieważ procesor graficzny (GPU) może lepiej obsługiwać animacje niż tradycyjne metody, takie jak JavaScript. W kontekście projektowania responsywnego, CSS Animations pozwala na płynniejsze i bardziej estetyczne przejścia między różnymi stanami interfejsu, co jest kluczowe dla utrzymania zaangażowania użytkowników.

Pytanie 24

Co to jest lazy loading w kontekście ładowania obrazów na stronie?

A. Protokół transferu obrazów między serwerem a przeglądarką
B. Format przechowywania obrazów w pamięci podręcznej przeglądarki
C. Metoda kompresji obrazów przed wysłaniem na serwer
D. Technika ładowania obrazów dopiero w momencie, gdy stają się widoczne dla użytkownika
Lazy loading to technika, która pozwala na ładowanie obrazów oraz innych zasobów dopiero w momencie, gdy stają się one widoczne dla użytkownika na ekranie. Dzięki temu oszczędzamy zasoby sieciowe i poprawiamy czas ładowania strony, co jest szczególnie istotne w kontekście optymalizacji SEO oraz doświadczenia użytkownika. Na przykład, w przypadku długiej strony internetowej z wieloma obrazami, lazy loading sprawia, że podczas przewijania strony obrazy nie są ładowane od razu, co zmniejsza obciążenie serwera i przyspiesza wczytywanie widocznych części strony. W praktyce można zastosować atrybuty takie jak "loading='lazy'" w znaczniku <img>, co jest zgodne z nowoczesnymi standardami HTML. Ponadto, wiele bibliotek i frameworków, jak np. Intersection Observer API, umożliwia zaawansowaną implementację lazy loadingu, co sprawia, że jest to obecnie powszechnie stosowana praktyka.

Pytanie 25

Przedstawione w filmie działania wykorzystują narzędzie

A. generatora kodu java
B. generatora GUI przekształcającego kod do języka XAML
C. debuggera analizującego wykonujący kod
D. kompilatora dla interfejsu graficznego
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 26

Wskaż poprawny pod względem składniowym kod dla formatu JSON, który jest używany do wymiany danych między backendem a frontendem aplikacji.

osoby: [
  {imię: 'Anna', wiek: '31' },
  {imię: 'Krzysztof', wiek: '25' }
]
"osoby": [
  {"imię": "Anna", "wiek": 31 },
  {"imię": "Krzysztof", "wiek": 25 }
]
Kod 1Kod 2
<osoby>
  <imie>Anna</imie>
  <wiek>31</wiek>
  <imie>Krzysztof</imie>
  <wiek>25</wiek>
</osoby>
struct osoby {
  imie: {Anna}, wiek:{31};
  imie: {Krzysztof}, wiek:{25}
};
Kod 3Kod 4
A. Kod3
B. Kod2
C. Kod1
D. Kod4
Kod2 jest spoko, bo składnia jest w porządku dla JSON. Używasz odpowiednich znaków i struktur, więc wszystko gra. JSON to taki format do wymiany danych, który często wykorzystuje się w komunikacji między frontendem a backendem. Zgadza się ze standardem ECMA-404. Pamiętaj, że klucze i wartości tekstowe powinny być w podwójnych cudzysłowach, co widać w Kod2. Twój przykładowy kod pokazuje tablicę obiektów, gdzie każdy obiekt ma pary klucz-wartość, a przecinki i nawiasy klamrowe są na swoim miejscu. To naprawdę dobry sposób, bo ułatwia współpracę między różnymi elementami aplikacji. JSON ma ważne zastosowanie w AJAX, bo dzięki niemu możemy dynamicznie aktualizować treści na stronie bez jej przeładowania. To jest mega przydatne w nowoczesnych aplikacjach typu SPA, gdzie JSON odgrywa kluczową rolę w zarządzaniu stanem aplikacji i komunikacji.

Pytanie 27

Jakie są różnice między kompilatorem a interpretem?

A. Interpreter konwertuje kod źródłowy na język maszynowy przed jego kompilacją
B. Interpreter tworzy plik wykonywalny, który funkcjonuje niezależnie od otoczenia
C. Kompilator przekształca kod źródłowy na język maszynowy przed uruchomieniem aplikacji
D. Kompilator przetwarza kod na język maszynowy w momencie jego wykonywania
Kompilator zamienia kod źródłowy na język maszynowy zanim program się uruchomi. W efekcie dostajemy plik wykonywalny, taki jak .exe w Windowsie. To fajne, bo po skompilowaniu aplikacja działa samodzielnie i nie potrzeba jej tłumaczyć od nowa. Dzięki temu programy, które są skompilowane, są zazwyczaj dużo szybsze i lepiej zoptymalizowane niż te, które są interpretowane. Warto wiedzieć, że kompilatory są wykorzystywane w językach takich jak C, C++ czy Java. Kompilacja ma też tę zaletę, że można wykrywać błędy jeszcze przed uruchomieniem programu, co jest naprawdę przydatne.

Pytanie 28

Co to jest XSS (Cross-Site Scripting)?

A. Technika optymalizacji kodu JavaScript do zwiększenia wydajności strony
B. Luka bezpieczeństwa pozwalająca na wstrzyknięcie złośliwego kodu do stron przeglądanych przez innych użytkowników
C. Protokół komunikacyjny używany w aplikacjach internetowych
D. Framework do tworzenia responsywnych stron internetowych
Luka Cross-Site Scripting (XSS) jest często mylona z różnymi technikami i narzędziami stosowanymi w tworzeniu aplikacji webowych, co prowadzi do nieporozumień na temat jej rzeczywistego znaczenia i konsekwencji. Na przykład, techniki optymalizacji kodu JavaScript, które mogą wpływać na wydajność strony, nie mają nic wspólnego z zagrożeniami bezpieczeństwa wynikającymi z XSS. Optymalizacja kodu może poprawić czas ładowania strony, ale nie chroni przed atakami, które mogą wykorzystać luki w zabezpieczeniach. Ponadto, frameworki do tworzenia responsywnych stron internetowych, choć przydatne w projektowaniu, nie są instrumentami zapobiegającymi wstrzykiwaniu złośliwego kodu. Protokół komunikacyjny używany w aplikacjach internetowych również nie ma związku z XSS, ponieważ jest to podstawowy element technologii, który nie odnosi się bezpośrednio do bezpieczeństwa. Warto pamiętać, że ignorowanie zagrożeń związanych z XSS może prowadzić do poważnych incydentów bezpieczeństwa, dlatego kluczowe jest stosowanie sprawdzonych praktyk zabezpieczeń, takich jak sanitizacja danych wejściowych i monitorowanie aplikacji w celu wykrywania potencjalnych ataków.

Pytanie 29

Jakie jest przeznaczenie dokumentacji wdrożeniowej?

A. Do zarządzania bazą danych aplikacji
B. Do opisania procesu instalacji i konfiguracji aplikacji w środowisku produkcyjnym
C. Do testowania wydajności aplikacji
D. Do tworzenia zadań w systemie kontroli wersji
Dokumentacja wdrożeniowa opisuje proces instalacji i konfiguracji aplikacji w środowisku produkcyjnym. Obejmuje ona szczegółowe instrukcje dotyczące wymaganych komponentów systemowych, zależności oraz kroków niezbędnych do prawidłowego wdrożenia aplikacji. Dzięki dokumentacji wdrożeniowej administratorzy IT oraz zespoły DevOps mogą skutecznie zarządzać procesem implementacji, minimalizując ryzyko błędów i przestojów. Dokument ten zawiera również informacje o kopiach zapasowych, procedurach przywracania systemu oraz testach przeprowadzanych po wdrożeniu, co zapewnia stabilność i bezpieczeństwo aplikacji po przeniesieniu jej na serwery produkcyjne. Kompleksowa dokumentacja wdrożeniowa to kluczowy element zarządzania cyklem życia oprogramowania (SDLC).

Pytanie 30

Na równoważnych pod względem funkcjonalnym listingach fragmentów aplikacji Angular oraz React.js utworzono listę punktowaną, która zawiera:

Definicja typu:

books = ["Harry Potter", "Hobbit", "Władca pierścieni"];

Kod Angular:
<ul>
    <li *ngFor = "let book of books"> {{book}} </li>
</ul>

Kod React.js:
<ul>
    {this.books.map(book => <li key={book}> book </li>)}
</ul>
A. Jedynie jeden element o treści Harry Potter.
B. Tyle elementów, ile znajduje się w tablicy books; w każdym punkcie listy widnieje element o treści {book}.
C. Wyłącznie jeden element o treści Harry Potter, Hobbit, Władca pierścieni.
D. Taką liczbę elementów, ile znajduje się w tablicy books; w każdym punkcie listy umieszczony jest jeden element tablicy.
W pytaniu chodziło o bardzo fundamentalny mechanizm w nowoczesnych frameworkach frontendowych: dynamiczne generowanie elementów listy na podstawie danych z tablicy. Częstym błędem jest doszukiwanie się w kodzie magicznych wartości lub mylenie sposobu działania szablonów z faktycznym efektem końcowym. Przykładowo, jeśli ktoś uzna, że pojawi się jeden element z wypisaną całą tablicą jako tekst, to prawdopodobnie nie rozumie, że każda iteracja *ngFor (w Angularze) czy metoda map (w React.js) generuje fizycznie osobny <li> dla każdego wpisu. To nie jest jedno pole tekstowe, ale wiele autonomicznych elementów. Kolejna rzecz to myślenie, że pojawi się tylko pierwszy element – takie podejście wynika często z niezrozumienia zasady działania pętli w szablonach, gdzie proces rozpoczyna się dla każdego elementu po kolei. Często też myli się składnię Reacta i widzi w niej coś na kształt szablonu z placeholderem {book}, zapominając, że to wyrażenie jest oceniane w JavaScript i renderuje konkretną wartość, a nie dosłowny napis z nawiasami klamrowymi. Moim zdaniem to jeden z najpopularniejszych błędów – traktowanie składni szablonów lub JSX zbyt dosłownie, bez zrozumienia, że to dynamiczne narzędzia. Warto pamiętać, że we współczesnych aplikacjach webowych takie podejście jest normą: nie piszesz ręcznie każdego <li>, tylko generujesz je ze źródła danych. Pominięcie tego mechanizmu prowadzi do kodu nieelastycznego, trudnego w utrzymaniu i skalowaniu. Z doświadczenia wiem, że zrozumienie tej zasady znacznie przyspiesza naukę zarówno Angulara, jak i Reacta, bo ten wzorzec powtarza się praktycznie wszędzie tam, gdzie masz do czynienia z kolekcjami danych i ich wizualizacją w interfejsie użytkownika.

Pytanie 31

Jakie są kluczowe etapy realizacji projektu programistycznego?

A. Planowanie, projektowanie, debugowanie, konserwacja
B. Analiza, implementacja, testowanie, aktualizacja
C. Planowanie, analiza, implementacja, wdrożenie
D. Projektowanie, testowanie, aktualizacja, implementacja
Wiele osób myśli, że wystarczy skupić się na kodzie czy testach i sukces przyjdzie sam, ale w praktyce kluczowe jest zachowanie właściwej sekwencji i kompletności działań. Często spotykam się z przekonaniem, że projektowanie albo debugowanie są najważniejszymi krokami, jednak bez wcześniejszego gruntownego planowania i analizy trudno mówić o efektywności czy przewidywalności rezultatów. Przykładowo, debugowanie to bardzo istotny element pracy programisty, ale samo w sobie nie stanowi etapu realizacji projektu – jest raczej czynnością wykonywaną w toku implementacji i testowania. Z kolei aktualizacja i konserwacja, choć ważne, zaliczają się już do utrzymania systemu po wdrożeniu, a nie do pierwotnego cyklu tworzenia oprogramowania. W niektórych odpowiedziach zabrakło chociażby analizy wymagań, co jest podstawowym etapem według standardów takich jak ISO/IEC/IEEE 12207 czy wytycznych PMBOK. Pominięcie wdrożenia lub zamiana jego kolejności z innym etapem, jak projektowanie albo testowanie, prowadzi do problemów z odpowiedzialnością za przekazanie produktu końcowego. Również połączenie implementacji z aktualizacją to pomieszanie faz projektowych z fazami utrzymania. Takie uproszczenia wynikają często z mylenia faz samego developmentu z późniejszymi procesami eksploatacji. W praktyce, żeby uniknąć błędów takich jak niedopracowana architektura czy chaos przy wdrożeniu, trzeba konsekwentnie stosować pełną sekwencję: planowanie, analiza, implementacja, a na końcu wdrożenie. To jest podejście zgodne i z klasycznym waterfall, i z nowszymi praktykami agile, gdzie nawet jeśli fazy się zazębiają, wciąż mają swoje miejsce. Z mojego doświadczenia, skracanie lub pomijanie tych etapów to prosta droga do kosztownych poprawek i niezadowolenia klienta, dlatego warto je znać i stosować świadomie.

Pytanie 32

Wynik dodawania liczb binarnych 1101 i 1001 to

A. 10111
B. 1110
C. 10110
D. 1001
Dodając liczby binarne 1101 i 1001, otrzymujemy wynik 10110. Wynika to z zasad dodawania bitów, gdzie sumujemy od prawej do lewej, pamiętając o przeniesieniu, gdy suma przekracza 1 (czyli tak jakby pojawia się „dwójka” w systemie dziesiętnym). Tutaj: 1+1=0 i przeniesienie 1, później 0+0+1=1, dalej 1+0=1, potem 1+1=0 i znowu przeniesienie 1, ostatni przeniesiony bit daje nam 1 na początku, więc cały wynik to 10110. Taki sposób sumowania jest podstawą działania procesorów – praktycznie w każdym sprzęcie elektronicznym obliczenia wykonują się właśnie binarnie. To nie tylko teoria – gdy programujesz mikrokontrolery albo pracujesz z układami cyfrowymi, te operacje to chleb powszedni. Moim zdaniem warto ogarnąć ten temat, bo dzięki temu łatwiej zrozumiesz działanie sumatorów w logice cyfrowej czy nawet podstawowe algorytmy komputerowe. W branży IT umiejętność szybkiego przeliczenia binarnego to raczej podstawa, szczególnie jak zabierasz się za elektronikę czy programowanie niskopoziomowe. Dla przykładu – większość protokołów sieciowych, maski IP itp. opiera się właśnie na operacjach binarnych, więc znajomość tego tematu zdecydowanie się przydaje. Poza tym, zgodnie z normami opisu algorytmów (np. IEEE), operacje na bitach są podstawową abstrakcją w projektowaniu sprzętu i oprogramowania.

Pytanie 33

Który z wymienionych poniżej przykładów ilustruje użycie systemu informatycznego w działalności gospodarczej?

A. System nawigacji GPS
B. System wentylacji
C. System sterowania ruchem miejskim
D. E-sklep
E-sklep, jako przykład zastosowania systemu informatycznego w działalności biznesowej, reprezentuje złożony ekosystem technologiczny, który umożliwia przedsiębiorstwom sprzedaż produktów i usług w Internecie. E-sklepy wykorzystują różnorodne technologie, takie jak systemy zarządzania treścią (CMS), bazy danych oraz systemy płatności, co pozwala na efektywne zarządzanie ofertą, realizację zamówień oraz obsługę klienta. Przykładem może być platforma Shopify, która oferuje funkcjonalności umożliwiające łatwe tworzenie i zarządzanie sklepem online. E-sklepy są zgodne z różnymi standardami, takimi jak PCI DSS, które zapewniają bezpieczeństwo transakcji płatniczych. Dzięki integracji z systemami analitycznymi, właściciele e-sklepów mogą śledzić zachowania użytkowników, co pozwala na optymalizację oferty oraz strategii marketingowej. Tego rodzaju rozwiązania informatyczne fundamentalnie zmieniają sposób, w jaki przedsiębiorstwa prowadzą działalność i komunikują się z klientami, czyniąc procesy bardziej wydajnymi i zautomatyzowanymi.

Pytanie 34

Jakie jest podstawowe zastosowanie wzorca projektowego Singleton?

A. Optymalizacja pamięci poprzez dziedziczenie
B. Tworzenie wielu instancji obiektu na podstawie klasy
C. Szybsza komunikacja pomiędzy obiektami
D. Zapewnienie jednej instancji obiektu w aplikacji
Wzorzec projektowy Singleton jest jednym z najbardziej rozpoznawalnych wzorców w świecie programowania obiektowego. Jego głównym celem jest zapewnienie istnienia dokładnie jednej instancji danej klasy w całej aplikacji, co jest kluczowe w sytuacjach, gdy posiadanie wielu instancji mogłoby prowadzić do problemów z synchronizacją lub niepożądanymi skutkami w stanach programu. Singleton jest często stosowany w kontekście zarządzania zasobami, takimi jak połączenia z bazą danych, gdzie jednoczesne posiadanie wielu połączeń może prowadzić do nieefektywnego wykorzystania zasobów. Wzorzec ten jest również używany do implementowania globalnych punktów dostępu, co umożliwia centralne zarządzanie pewnymi zasobami lub stanami w aplikacji. Z punktu widzenia dobrych praktyk, ważne jest, aby Singleton był zaimplementowany w sposób bezpieczny dla wątków, aby uniknąć problemów z wyścigami, które mogą wystąpić, gdy wiele wątków próbuje jednocześnie utworzyć instancję Singletona. Stosowanie Singletona może wprowadzać pewne ograniczenia w testowaniu jednostkowym, z uwagi na jego globalny charakter, jednak odpowiednia konstrukcja kodu, na przykład poprzez wstrzykiwanie zależności, może pomóc w zachowaniu elastyczności testowania.

Pytanie 35

Zaprezentowany fragment kodu w języku C# tworzy hasło. Wskaż zdanie PRAWDZIWE dotyczące charakterystyki tego hasła:

var random = new Random();
string pulaZnakow = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";

int dlPuli = pulaZnakow.Length - 1;
char znak;
string wynik = "";

for(int i = 0; i < 8; i++)  {
    znak = pulaZnakow[random.Next(0, dlPuli)];
    wynik += znak;
}
A. Ma co najmniej 8 znaków oraz zawiera małe i wielkie litery oraz cyfry
B. Może zawierać zarówno małe, jak i wielkie litery, cyfry oraz symbole
C. Jest maksymalnie 7-znakowe, co wynika z wartości zmiennej i
D. Może zawierać małe i wielkie litery oraz cyfry
Analizując podany fragment kodu, widać, że hasło generowane jest losowo z puli znaków, która zawiera małe i wielkie litery alfabetu łacińskiego oraz cyfry od 0 do 9. Nie znajdują się tam żadne znaki specjalne ani symbole, więc hasło nie może ich zawierać – to ważne z praktycznego punktu widzenia, bo często spotyka się wymagania dotyczące obecności symboli w bezpiecznych hasłach. Kod wykorzystuje pętlę for, która wykonuje się dokładnie 8 razy, czyli hasło ma zawsze 8 znaków – ani mniej, ani więcej. Z mojego doświadczenia wynika, że taki sposób generowania haseł jest dość powszechny w prostych aplikacjach, np. przy automatycznym tworzeniu kont użytkowników. Jednak warto pamiętać, że im bardziej zróżnicowana pula znaków, tym lepsze zabezpieczenie – tutaj ograniczamy się tylko do liter i cyfr. Z praktycznego punktu widzenia, takie losowe hasło trudno odgadnąć ręcznie, ale jest dość przewidywalne, jeśli ktoś zna algorytm i nie ma dodatkowych zabezpieczeń (np. cryptographically secure random number generator). W standardach bezpieczeństwa, np. OWASP, zaleca się uwzględnianie symboli i unikanie prostego Random do generowania haseł, bo można go przewidzieć, ale do nauki i zastosowań testowych taki kod jest całkiem w porządku. Hasło więc może zawierać małe i wielkie litery oraz cyfry – dokładnie jak głosi prawidłowa odpowiedź.

Pytanie 36

Z jakiego obiektu można skorzystać, aby stworzyć kontrolkę wskazaną strzałką na ilustracji?

Ilustracja do pytania
A. Windows - dla biblioteki WPF; JFrame - dla biblioteki Swing
B. Text - dla biblioteki WPF; JText - dla biblioteki Swing
C. Box - dla biblioteki WPF; JField - dla biblioteki Swing
D. TextBox - dla biblioteki WPF; JTextField - dla biblioteki Swing
Wybrałeś dokładnie to, co w praktyce programisty jest najważniejsze, czyli TextBox dla WPF i JTextField dla Swinga. Te dwa komponenty to absolutna podstawa, jeśli chodzi o pola do wprowadzania tekstu, zarówno w aplikacjach .NET, jak i Java. W WPF TextBox pozwala na przyjmowanie danych od użytkownika, obsługę zdarzeń, walidację, formatowanie tekstu – ogólnie wszystko, co potrzeba do pracy z tekstem w GUI. W Swingu JTextField jest odpowiednikiem, bardzo intuicyjnym i prostym w użyciu, świetnie się sprawdza przy prostych formularzach czy interfejsach użytkownika. Co ciekawe, oba te komponenty są bardzo elastyczne, można je stylizować, podłączać do systemów walidacji czy nawet rozbudowywać o własne mechanizmy autouzupełniania. Spotkałem się wielokrotnie z sytuacją, gdzie poprawne zastosowanie TextBoxa lub JTextFielda znacząco podnosiło jakość aplikacji – bo jednak wygoda użytkownika i poprawność danych są kluczowe. Takie wybory są zgodne z dokumentacją Microsoftu oraz Oracla, więc trzymasz się dobrych praktyk. Z mojej perspektywy, jeśli chcesz pisać nowoczesne, użytkowe aplikacje desktopowe, znajomość tych kontrolek to absolutny must-have.

Pytanie 37

Reguła zaangażowania i konsekwencji jako jedna z zasad wpływania na innych odnosi się

A. do doprowadzania spraw do końca
B. do odwzajemniania się osobie, która nam pomogła
C. do kierowania się zdaniem danej grupy
D. do uległości wobec autorytetów
Reguła zaangażowania i konsekwencji, o której tu mowa, faktycznie odnosi się do potrzeby doprowadzania spraw do końca. To jedna z podstawowych zasad psychologicznych wykorzystywanych w wpływaniu na decyzje i zachowania ludzi, szczególnie w sprzedaży czy negocjacjach. Kiedy już się na coś zgodzimy lub podejmiemy pierwsze, nawet drobne zobowiązanie, automatycznie pojawia się w nas silna potrzeba zachowania spójności z wcześniejszymi deklaracjami — tak po prostu działa ludzka psychika. Z mojego doświadczenia wynika, że firmy bardzo często to wykorzystują, np. prosząc klienta o drobną przysługę, podpis czy mikroakceptację, bo potem jest większa szansa, że pójdzie za ciosem i zdecyduje się na większy krok. W psychologii społecznej ten mechanizm uznaje się za bardzo skuteczny – zresztą Robert Cialdini w swoich książkach szeroko o tym pisze. Na rynku pracy też to widać, bo pracodawcy chętniej powierzają ważne zadania osobom, które mają zwyczaj kończyć to, co zaczęły. W praktyce, jeśli ktoś raz się w coś zaangażuje — nawet formalnie nie podpisując żadnej umowy — to potem z dużym prawdopodobieństwem wytrwa przy swojej decyzji. Dlatego znajomość tej zasady jest nie tylko teoretycznie ciekawa, ale daje konkretne narzędzia do skuteczniejszego działania w relacjach międzyludzkich, marketingu czy zarządzaniu projektami.

Pytanie 38

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

A. HTTP
B. SQL
C. JavaScript
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 39

Testy mające na celu identyfikację błędów w interfejsach między modułami bądź systemami nazywane są testami

A. wydajnościowymi
B. bezpieczeństwa
C. jednostkowymi
D. integracyjnymi
Testy integracyjne mają na celu wykrycie błędów w interfejsach i połączeniach między modułami lub systemami. Głównym celem tych testów jest sprawdzenie, czy różne komponenty aplikacji współpracują ze sobą zgodnie z oczekiwaniami. Testy integracyjne są przeprowadzane po testach jednostkowych, ale przed testami systemowymi. W praktyce testy te obejmują scenariusze, w których kilka modułów wymienia dane lub współdziała w ramach wspólnego procesu. Integracja jest kluczowa dla zapewnienia, że cały system działa jako spójna całość, co minimalizuje ryzyko błędów na etapie produkcji i poprawia jakość końcowego produktu. Przykładem może być test komunikacji między modułem autoryzacji użytkowników a modułem płatności w aplikacji e-commerce.

Pytanie 40

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

function foo() {
  console.log(a);
  var a = 1;
  console.log(a);
}
foo();
A. ReferenceError, 1
B. 1, 1
C. undefined, undefined
D. undefined, 1
Wynik działania podanego kodu to 'undefined, 1', co jest zgodne z zasadami hoisting w JavaScript. Kiedy funkcja 'foo' jest wywoływana, zmienna 'a' jest zadeklarowana przy użyciu 'var'. Zgodnie z zasadą hoisting, deklaracja zmiennej jest przenoszona na początek funkcji, ale przypisanie wartości następuje w miejscu, gdzie znajduje się kod. Dlatego, podczas pierwszego wywołania 'console.log(a)', 'a' nie ma jeszcze przypisanej wartości, co skutkuje wyświetleniem 'undefined'. Następnie, po przypisaniu '1' do 'a', w drugim 'console.log(a)' zmienna ta już ma wartość, więc wyświetlane jest '1'. Zrozumienie hoisting jest kluczowe dla programistów, ponieważ może wpływać na logikę działania kodu i prowadzić do błędów, jeśli nie jest odpowiednio uwzględnione. W praktyce powinno się unikać korzystania z hoisting, preferując inicjalizację zmiennych na początku funkcji, co zwiększa czytelność i utrzymanie kodu.