Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 26 maja 2026 22:12
  • Data zakończenia: 26 maja 2026 22:34

Egzamin zdany!

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

Wymagane minimum: 20 punktów (50%)

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

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

A. sort()
B. map()
C. splice()
D. push()
Metoda map() w JavaScript jest funkcją tablicową, która tworzy nową tablicę na podstawie wyników wywołania funkcji podanej jako argument dla każdego elementu oryginalnej tablicy. Kluczowym aspektem tej metody jest to, że nie modyfikuje oryginalnej tablicy, co czyni ją bezpiecznym narzędziem do transformacji danych. Zastosowanie map() jest szczególnie przydatne w sytuacjach, gdy chcemy przekształcić dane, ale zachować oryginał, na przykład w przypadku przetwarzania wyników z API lub operacji na danych wejściowych od użytkownika. Standardowe praktyki zalecają używanie map() w programowaniu funkcyjnym, co pozwala na bardziej deklaratywne podejście do manipulacji danymi. Przykład zastosowania: mając tablicę liczb, możemy użyć map() do stworzenia nowej tablicy, która zawiera tylko ich kwadraty: const numbers = [1, 2, 3]; const squares = numbers.map(num => num * num); W ten sposób oryginalna tablica numbers pozostaje nietknięta, co jest kluczowe w wielu aplikacjach, w których zachowanie stanu jest istotne.

Pytanie 2

Jakie jest podstawowe zadanie firewalla w systemie komputerowym?

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

Pytanie 3

W przedstawionej ramce znajduje się fragment opisu metody compile języka Java wykorzystywanej w kontekście wyrażeń regularnych. Który symbol powinien być użyty, aby znaleźć dopasowanie na końcu tekstu?

MetacharacterDescription
|Find a match for any one of the patterns separated by | as in: cat|dog|fish
.Find just one instance of any character
^Finds a match as the beginning of a string as in: ^Hello
$Finds a match at the end of the string as in: World$
\dFind a digit
\sFind a whitespace character
\bFind a match at the beginning of a word like this: \bWORD, or at the end of a word like this: WORD\b
\uxxxxFind the Unicode character specified by the hexadecimal number xxxx
Źródło https://www.w3schools.com/java/java_regex.asp dostęp 20.08.2020
A. |
B. .
C. ^
D. $
Znak dolara $ w wyrażeniach regularnych w języku Java jest używany do oznaczenia końca ciągu znaków. Jeśli chcemy sprawdzić, czy konkretny wzorzec występuje na końcu danego tekstu, używamy właśnie tego metaznaku. Przykładowo, wyrażenie regularne World$ dopasuje tekst, w którym słowo World pojawia się na samym końcu. Jest to przydatne w wielu scenariuszach, takich jak walidacja struktury tekstu czy filtrowanie logów, gdzie ważna jest pozycja występowania wzorca. Konwencja ta jest zgodna z ogólnymi standardami regex, co czyni ją intuicyjną i uniwersalną w zastosowaniu. Dolar pełni kluczową rolę w automatyzacji procesów w przetwarzaniu tekstu, umożliwiając efektywne dopasowywanie końcowych wzorców w aplikacjach Java. Użycie $ jest zgodne z dobrymi praktykami kodowania, szczególnie w kontekście walidacji danych wejściowych, gdzie określenie końca ciągu jest często wymagane. Jest to także popularne w analizie danych, gdzie dane muszą spełniać określone kryteria co do ich zakończenia, takie jak rozszerzenia plików czy określone etykiety tekstowe.

Pytanie 4

Które z poniższych narzędzi służy do analizy wydajności stron internetowych?

A. Webpack
B. Postman
C. Docker
D. Lighthouse
Postman to narzędzie, które służy przede wszystkim do testowania API. Jego główna funkcjonalność polega na umożliwieniu użytkownikom wysyłania zapytań do serwerów oraz analizy odpowiedzi, co jest niezbędne w procesie rozwijania aplikacji webowych. Jednakże, Postman nie ma za zadanie oceny wydajności stron internetowych, ponieważ koncentruje się na interakcjach z API, a nie na aspekcie wydajności samej strony. Docker jest platformą do konteneryzacji, która pozwala deweloperom na łatwe zarządzanie aplikacjami w różnych środowiskach. Chociaż Docker może mieć wpływ na wydajność aplikacji poprzez ułatwienie zarządzania zasobami, nie jest narzędziem dedykowanym do analizy wydajności stron internetowych. Webpack to narzędzie służące do bundlingu zasobów JavaScript, które skupia się na optymalizacji i kompresji plików. Jego zadaniem jest usprawnienie dostarczania skryptów do przeglądarek, jednak nie jest to narzędzie, które ocenia wydajność strony jako całości. Błędem jest zatem mylenie funkcji, jakie pełnią te narzędzia. Zamiast skupić się na testowaniu wydajności, można skupić się na testowaniu API czy optymalizacji zasobów, co nie odnosi się bezpośrednio do analizy całkowitej wydajności strony internetowej. Dlatego ważne jest zrozumienie, jakie narzędzia służą do jakich celów, aby skutecznie poprawiać jakość aplikacji internetowych.

Pytanie 5

Który z poniższych elementów UI umożliwia graficzną nawigację pomiędzy różnymi sekcjami aplikacji?

A. Rozwijana lista
B. Obszar tekstowy
C. Przycisk opcji
D. Menu
Pasek menu to kluczowy element interfejsu użytkownika, który umożliwia wizualną nawigację pomiędzy różnymi sekcjami aplikacji. Paski menu są powszechnie stosowane w aplikacjach desktopowych i mobilnych, ponieważ pozwalają na szybki dostęp do różnych funkcji oraz ustawień. Dzięki ich hierarchicznej strukturze użytkownicy mogą łatwo odnaleźć potrzebne narzędzia i opcje, co zwiększa intuicyjność i wygodę korzystania z aplikacji.

Pytanie 6

W jaki sposób można załadować tylko komponent z biblioteki React?

A. import [ Component ] from 'react'
B. import Component from 'react'
C. import { Component } from 'react'
D. import React.Component from 'react'
Użycie składni import { Component } from 'react' to zdecydowanie najczęściej spotykany i najbardziej rekomendowany sposób importowania tylko wybranego komponentu z biblioteki React. To tzw. import nazwany, czyli dokładnie wskazujesz, który kawałek kodu chcesz wyciągnąć z całego modułu. W praktyce, jest to bardzo czytelne i pozwala na jasne zarządzanie zależnościami w pliku. Moim zdaniem ma to ogromne znaczenie w większych projektach, bo łatwo potem znaleźć, które elementy są faktycznie wykorzystywane w danym pliku. Co ważne, taka technika importowania jest w pełni zgodna ze standardami ES6, właściwie każdy nowoczesny projekt front-endowy na tym bazuje. Przykład praktyczny: jeśli chcesz stworzyć klasowy komponent React, wystarczy napisać import { Component } from 'react', a potem class MyClass extends Component {...}. Jest to nieco bardziej eleganckie niż importowanie całego obiektu React (np. import React from 'react'), zwłaszcza jeśli nie potrzebujesz całej funkcjonalności. Dodatkowo, takie rozwiązanie może wpływać pozytywnie na bundlowanie kodu, bo nie ściągasz do projektu niepotrzebnych fragmentów biblioteki. Swoją drogą, coraz częściej widać, że programiści skupiają się na minimalizowaniu importów i czytelności kodu – właśnie przez wybór takich rozwiązań.

Pytanie 7

Przedstawione w filmie działania wykorzystują narzędzie

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

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

W aplikacji mobilnej, aby określić warianty grafiki w zależności od wielkości ekranu, należy (uwaga: odpowiedzi wariantowe dla dwóch systemów - sugerować się systemem omawianym na zajęciach)

A. iOS: dodać do nazw sufiksy oznaczające rozdzielczość, np. 32ppi. Android: umieścić grafikę w odpowiednich katalogach: 32ppi, 64ppi, 96ppi
B. iOS: dodać do nazw plików sufiksy @2x, @3x. Android: umieścić grafikę w odpowiednich folderach drawable: -hdpi, -xhpi, xxhdpi
C. iOS: dodać do nazw sufiksy #2x, #3x. Android: dodać do nazw sufiks rozdzielczości: -32x32, -64x64, -96x96
D. iOS: utworzyć katalogi hdpi, lhpi, xhpi i dodać do nich grafiki. Android: utworzyć katalogi 32x32, 64x64, 96x96 i dodać do nich grafiki
Lepiej nie używać oznaczeń w stylu 32ppi czy 64ppi, bo to nie pasuje do żadnej z tych platform. To bardziej pasuje do druku, a nie aplikacji mobilnych. Foldery 32x32 czy 64x64 też nie mają sensu w kontekście Androida czy iOS. Jak stworzysz foldery o nazwach lhpi czy 32x32 to może być problem z wyświetlaniem grafiki na różnych urządzeniach. Z mojego doświadczenia, lepiej trzymać się ustalonych standardów, żeby uniknąć błędów.

Pytanie 10

Która z poniższych technik NIE jest związana z optymalizacją wydajności strony internetowej?

A. Minifikacja kodu
B. Deep linking
C. Użycie CDN
D. Lazy loading
Deep linking to technika, która polega na linkowaniu bezpośrednio do określonego miejsca w treści danej strony internetowej, omijając jej stronę główną czy inne interfejsy nawigacyjne. Nie wpływa jednak na optymalizację wydajności strony, ponieważ koncentruje się na poprawie nawigacji i doświadczenia użytkownika, a nie na szybkości ładowania strony czy efektywnym zarządzaniu zasobami. Przykładem zastosowania deep linking może być sytuacja, w której użytkownik klika w link do konkretnego produktu w sklepie internetowym, co pozwala mu od razu zobaczyć interesującą go ofertę bez zbędnych kroków dodatkowych. W praktyce, techniki optymalizacji wydajności, takie jak minifikacja kodu, lazy loading i użycie CDN, koncentrują się na zmniejszeniu rozmiaru plików, opóźnianiu ładowania nieistotnych zasobów oraz dystrybucji treści z najbliższych lokalizacji serwerów, co przyczynia się do szybszego dostarczania zawartości do użytkownika. Dlatego właśnie deep linking jest odpowiedzią, która nie jest związana z wydajnością strony.

Pytanie 11

Co oznacza akronim IDE w kontekście programowania?

A. Zintegrowane Środowisko Debugowania
B. Integrated Development Environment
C. Interaktywny Edytor Debugowania
D. Interaktywny Silnik Programistyczny
Rozszyfrowanie IDE jako Integrated Debugging Environment to duży błąd. To środowisko daje nam o wiele więcej niż tylko debuggowanie. Interactive Development Engine to też nietrafione określenie. Tak naprawdę IDE to bardziej rozbudowane narzędzie, niż tylko silnik do programowania. A sugerowanie, że IDE ogranicza się do edytora debugowania, jest całkowicie nieprawdziwe, bo to środowisko oferuje naprawdę szeroki wachlarz funkcji, które są potrzebne na każdym etapie życia aplikacji.

Pytanie 12

Która z poniższych technologii nie jest używana do tworzenia aplikacji mobilnych?

A. Kotlin
B. Flutter
C. COBOL
D. React Native
Zarówno Kotlin, React Native, jak i Flutter są nowoczesnymi technologiami używanymi do tworzenia aplikacji mobilnych, co może prowadzić do mylnych wniosków o ich przydatności w tym kontekście. Kotlin to statycznie typowany język programowania zaprojektowany jako nowoczesna alternatywa dla Javy w ekosystemie Androida. Jest w pełni kompatybilny z Javą i oferuje szereg udogodnień, które przyspieszają proces tworzenia aplikacji. React Native to framework stworzony przez Facebooka, który pozwala na budowanie aplikacji mobilnych przy użyciu JavaScriptu i Reacta. Umożliwia on programistom pisanie jednego kodu, który działa zarówno na iOS, jak i na Androida, co znacząco obniża czas i koszty prac rozwojowych. Z kolei Flutter, stworzony przez Google, to framework do budowy interfejsów użytkownika, który wykorzystuje język Dart i pozwala na tworzenie atrakcyjnych aplikacji mobilnych z jednego kodu źródłowego dla obu platform. Typowe błędy myślowe, które mogą prowadzić do pomylenia tych technologii z COBOL-em, polegają na niewłaściwym zrozumieniu ich przeznaczenia oraz kontekstu użycia. COBOL jest językiem, który nie jest dostosowany do wymagań współczesnego rozwoju aplikacji mobilnych, które wymagają elastyczności, szybkości oraz interaktywności, co jest możliwe jedynie dzięki nowoczesnym technologiom. W związku z tym, podczas nauki programowania aplikacji mobilnych, warto skupić się na nowoczesnych narzędziach i językach, które są szeroko stosowane w branży.

Pytanie 13

Co to jest local storage w kontekście aplikacji webowych?

A. System plików tymczasowych używany przez przeglądarkę
B. Mechanizm pozwalający na przechowywanie danych w przeglądarce użytkownika bez określonego czasu wygaśnięcia
C. Technologia przechowywania danych w pamięci RAM aplikacji
D. Baza danych NoSQL działająca na serwerze aplikacji
Local storage to mechanizm dostępny w przeglądarkach internetowych, który pozwala na przechowywanie danych w formacie klucz-wartość. W przeciwieństwie do cookies, które mają czas wygaśnięcia, dane w local storage są przechowywane bezterminowo, co oznacza, że pozostają dostępne nawet po zamknięciu przeglądarki. Dzięki temu deweloperzy mogą tworzyć aplikacje webowe, które pamiętają preferencje użytkowników, stany formularzy czy inne istotne informacje. Typowym zastosowaniem local storage może być zapisywanie ustawień użytkownika w grach przeglądarkowych lub aplikacjach do zarządzania zadaniami. Warto również wspomnieć, że local storage ma limit pojemności wynoszący zazwyczaj około 5 MB na domenę, co czyni go odpowiednim dla przechowywania małych ilości danych. Ponadto, korzystając z local storage, deweloperzy powinni pamiętać o kwestiach bezpieczeństwa, takich jak unikanie przechowywania wrażliwych danych, a także o stosowaniu technik takich jak serializacja danych w formacie JSON, co ułatwia ich późniejsze wykorzystanie.

Pytanie 14

Co to jest dokumentacja instruktażowa programu?

A. Dokumentem przedstawiającym plany rozwoju oprogramowania
B. Instrukcją opisującą, jak używać funkcji programu
C. Kolekcją testów jednostkowych oraz ich wyników
D. Zbiorem szczegółów technicznych dotyczących kodu źródłowego
Dokument zawierający szczegóły techniczne kodu źródłowego to część dokumentacji dla programistów, a nie instrukcja pomocy skierowana do użytkownika końcowego. Zbiór testów jednostkowych i wyników to część procesu testowania aplikacji, mająca na celu weryfikację poprawności działania kodu, ale nie wyjaśnia użytkownikom końcowym, jak korzystać z programu. Dokumenty związane z planami rozwoju aplikacji są istotne z punktu widzenia zarządzania projektem, ale nie zawierają instrukcji dotyczących bieżącej obsługi i użytkowania oprogramowania.

Pytanie 15

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

A. C#
B. Java
C. Python
D. C++
Środowiska IDE, takie jak IntelliJ IDEA, Eclipse oraz NetBeans, zostały zaprojektowane z myślą o programowaniu w języku Java, który jest jednym z najpopularniejszych języków programowania na świecie. Te zintegrowane środowiska deweloperskie oferują szereg narzędzi i funkcji, które znacznie ułatwiają proces tworzenia aplikacji w Java. Przykładowo, IntelliJ IDEA, stworzony przez firmę JetBrains, dostarcza wsparcie dla automatycznego uzupełniania kodu, refaktoryzacji oraz analizy statycznej, co przyspiesza cykl rozwoju oprogramowania. Eclipse, będący otwartym oprogramowaniem, umożliwia rozszerzanie swoich funkcji poprzez wtyczki, co czyni go elastycznym narzędziem dla programistów. NetBeans, z kolei, zapewnia łatwe w użyciu interfejsy oraz wsparcie dla wielu technologii związanych z Java, takich jak JavaFX czy Java EE, co czyni go idealnym wyborem dla rozwoju aplikacji webowych i desktopowych. Zgodnie z przyjętymi standardami w branży, Java jest językiem obiektowym, który charakteryzuje się wysoką przenośnością oraz bezpieczeństwem, co czyni go atrakcyjnym wyborem dla wielu projektów komercyjnych oraz edukacyjnych.

Pytanie 16

Jaką wartość zwróci funkcja napisana w języku C++, jeżeli jej argumentem wejściowym jest tablica stworzona w następujący sposób:

int tablica[6] = {3,4,2,4,10,0};

int fun1(int tab[]) {
    int wynik = 0;

    for(int i = 0; i < 6; i++)
        wynik += tab[i];
    return wynik;
}
A. 23
B. 20
C. 0
D. 10
Rozwiązując takie zadania, warto nauczyć się dokładnie patrzeć na strukturę kodu. Funkcja fun1 przyjmuje tablicę intów i sumuje jej elementy. Tu pętla for przechodzi po wszystkich sześciu indeksach – od 0 do 5. Gdy podmienisz na liczby z zadania: 3, 4, 2, 4, 10 oraz 0 – po prostu dodajesz te wartości do siebie. Suma wychodzi 23. Czyli wynik funkcji to właśnie 23. To taki bardzo typowy przykład sumowania elementów tablicy – nie tylko na lekcjach, ale praktycznie wszędzie, np. jak liczysz sumę zamówień w sklepie internetowym albo punkty gracza w grze. Jeśli chodzi o dobre praktyki w C++, to warto wiedzieć, że lepiej przekazywać tablicę z dodatkowym parametrem długości, żeby nie robić magicznych liczb jak to '6' w pętli – można się wtedy łatwo pomylić przy zmianie rozmiaru. Moim zdaniem dobrze jest od razu przyswoić sobie nawyk wykorzystywania std::vector zamiast „gołych” tablic, bo są bezpieczniejsze i elastyczniejsze. To już taki krok w stronę kodu produkcyjnego. Ale podsumowując – jeśli widzisz tak napisany kod, to zawsze patrz, ile razy pętla się wykona i jakie są wartości w tablicy. Tylko tyle i aż tyle. W praktyce ta umiejętność przekłada się na szybkie debugowanie i pisanie niezawodnych programów.

Pytanie 17

Jakie są typowe frameworki/biblioteki używane w aplikacjach webowych?

A. Visual Studio, Eclipse, angular, React.js, Node.js
B. ASP.NET Core, jQuery, Joomla!, Wordpress, Angular
C. jquery, Joomla!, Wordpress, android Studio, Xamarin
D. ASP.NET Core, Django, Angular, React.js, Node.js
Wybrana grupa frameworków i bibliotek — ASP.NET Core, Django, Angular, React.js, Node.js — to w praktyce jedne z najbardziej rozpoznawalnych i szeroko wykorzystywanych rozwiązań w branży tworzenia aplikacji webowych. Każdy z nich pełni trochę inną rolę, co powoduje, że są stosowane na różnych warstwach aplikacji. Na przykład ASP.NET Core oraz Django to frameworki po stronie serwera, obsługujące backend, logikę biznesową i komunikację z bazą danych. Są bardzo popularne zwłaszcza tam, gdzie liczy się szybkość wdrożenia i bezpieczeństwo. Node.js również zalicza się do backendowych technologii, z tym że pozwala pisać po stronie serwera w JavaScript, co bywa ogromnym plusem, gdy zespół jest mocno frontendowy. Angular i React.js to natomiast narzędzia, które pomagają budować rozbudowane, interaktywne interfejsy użytkownika po stronie klienta. Takie podejście, gdzie backend i frontend są rozdzielone, to obecnie standard — tzw. architektura SPA (Single Page Application) albo nawet JAMstack. Warto pamiętać, że dobrym zwyczajem jest korzystać właśnie z takich nowoczesnych frameworków, bo zapewniają solidne wsparcie społeczności, regularne aktualizacje i kompatybilność z nowymi standardami webowymi. Moim zdaniem, jeżeli myśli się poważnie o pracy jako developer webowy, to znajomość przynajmniej dwóch z wymienionych narzędzi to absolutny must-have. Przy okazji — wiele firm prowadzi projekty wieloplatformowe, więc umiejętność korzystania z tych frameworków można łatwo przenieść również do świata mobilnego czy nawet IoT.

Pytanie 18

Wskaż rodzaj testów, które przeprowadza się podczas fazy tworzenia kodu źródłowego

A. testy jednostkowe
B. testy wydajnościowe
C. testy kompatybilności
D. testy wdrożeniowe
Wiele osób zaczyna od myślenia, że testy wydajnościowe lub kompatybilnościowe to coś, co można robić już w trakcie pisania kodu, ale jednak tak nie jest. Testy wydajnościowe polegają na sprawdzaniu, jak szybko działa cały system albo jego większa część pod różnym obciążeniem – robi się to raczej po zintegrowaniu większych fragmentów aplikacji, nie w momencie pisania pojedynczych funkcji czy klas. Podobnie jest z testami kompatybilności – one sprawdzają, czy program działa poprawnie na różnych systemach operacyjnych, przeglądarkach albo w połączeniu z innymi aplikacjami. Tego typu testy są ważne, ale zwykle nie mają sensu, dopóki nie masz gotowej lub prawie gotowej aplikacji. Testy wdrożeniowe z kolei pojawiają się na samym końcu procesu – dotyczą sprawdzania, czy oprogramowanie zostało prawidłowo zainstalowane i czy działa w środowisku produkcyjnym. To już jest zupełnie inny etap, kiedy kod jest gotowy, przetestowany na innych poziomach i deweloperzy mają nadzieję, że wszystko pójdzie gładko. Często spotykam się z podejściem, że testowanie można zostawić na później, a to jest, szczerze mówiąc, bardzo ryzykowne. Największym błędem jest niedocenianie testów jednostkowych i mylenie ich z większymi testami integracyjnymi, wydajnościowymi czy wdrożeniowymi. To właśnie testy jednostkowe są najbliżej kodu źródłowego i to ich się używa podczas jego pisania – pozwalają szybko wychwycić błędy, zanim rozrosną się w poważniejsze problemy. Branża już dawno pogodziła się z tym, że testy jednostkowe to nie jest żadna fanaberia, tylko podstawowe narzędzie każdego programisty dbającego o jakość. Bez nich ryzykujesz, że małe błędy prześlizgną się do dalszych etapów i później naprawa jest dużo trudniejsza oraz bardziej kosztowna.

Pytanie 19

Jakie jest główne zadanie kontrolera w architekturze MVC (Model-View-Controller)?

A. Obsługa logiki biznesowej i przetwarzanie danych wejściowych od użytkownika
B. Przechowywanie danych aplikacji
C. Prezentowanie danych użytkownikowi
D. Zarządzanie sesją użytkownika
W architekturze MVC kontroler pełni kluczową rolę w procesie przetwarzania danych aplikacji. Jego głównym zadaniem jest obsługa logiki biznesowej oraz przetwarzanie danych, które pochodzą od użytkownika. Kontroler działa jako pośrednik pomiędzy modelem a widokiem, odbierając żądania użytkownika, przetwarzając je (często z wykorzystaniem logiki biznesowej) i decydując, które dane modelu powinny być przekazane do widoku. W praktyce oznacza to, że kontroler interpretuje dane wejściowe, modyfikuje stan modelu na ich podstawie, a następnie wybiera odpowiedni widok do wyświetlenia wyników użytkownikowi. Takie podejście pozwala na lepszą organizację kodu i oddzielenie logiki aplikacji od interfejsu użytkownika, co jest zgodne z dobrymi praktykami projektowania oprogramowania. Dzięki temu aplikacje są bardziej skalowalne i łatwiejsze w utrzymaniu.

Pytanie 20

Jakie znaczenie ma termin "hierarchia dziedziczenia" w kontekście programowania obiektowego?

A. Zespół metod i pól posiadających ten sam modyfikator dostępu
B. Układ klas, który ogranicza występowanie dziedziczenia wielokrotnego
C. Układ klas w strukturę, w której klasy pochodne dziedziczą cechy od klas bazowych
D. Zbiór klas, które nie mają wspólnych powiązań
Hierarchia dziedziczenia to fundamentalna koncepcja programowania obiektowego, polegająca na organizacji klas w strukturę, w której klasy pochodne dziedziczą właściwości (pola i metody) od klas bazowych. Pozwala to na wielokrotne wykorzystanie kodu, co zwiększa jego modularność i zmniejsza redundancję. Klasa bazowa dostarcza ogólne cechy i metody, podczas gdy klasy pochodne rozszerzają lub modyfikują tę funkcjonalność, dostosowując ją do bardziej specyficznych wymagań. Przykładem jest klasa 'Pojazd', po której mogą dziedziczyć klasy 'Samochód' i 'Motocykl', zachowując wspólne atrybuty, takie jak 'maksymalna prędkość' czy 'masa'.

Pytanie 21

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

A. int
B. float
C. decimal
D. double
Typ danych 'int' (integer) to przykład typu stałoprzecinkowego, który przechowuje liczby całkowite. Stałoprzecinkowe typy danych są podstawą w programowaniu, ponieważ pozwalają na efektywne przechowywanie wartości bez części ułamkowej, co przyspiesza obliczenia i redukuje zużycie pamięci. Typ 'int' jest szeroko stosowany w językach takich jak C, C++, Java i Python, a jego główną zaletą jest szybkość operacji arytmetycznych oraz przewidywalność wyników. Stałoprzecinkowe typy danych znajdują zastosowanie w algorytmach, systemach sterowania i aplikacjach embedded, gdzie precyzja obliczeń jest kluczowa.

Pytanie 22

Jaką wartość będzie miała zmienna result po wykonaniu poniższego kodu PHP?

$array = [5, 1, 8, 3, 7];
$result = 0;
foreach ($array as $value) {
  if ($value > $result) {
    $result = $value;
  }
}
A. 24
B. 8
C. 7
D. 5
Wartości 24, 5 oraz 7 nie są poprawne w kontekście działania podanego kodu PHP. Gdy spojrzymy na odpowiedź 24, zauważymy, że nie ma takiej wartości w tablicy $array, która wynosi 5, 1, 8, 3 ani 7. Zatem, próbując uzyskać taką wartość z operacji na tych liczbach, prowadzi do złych wniosków. Możliwe, że błąd wynikał z niewłaściwego zrozumienia, czym jest proces iteracji w tablicy oraz jak działa przypisanie wartości. W przypadku wartości 5, można pomyśleć, że jest to największa liczba w tablicy, ponieważ jest to pierwsza liczba, która jest porównywana z wartością początkową zmiennej $result. Jednak nie uwzględnia ona kolejnych iteracji, które dostarczają większe wartości. Wartość 7, chociaż jest większa od 5, również nie jest największa, ponieważ istnieje jeszcze większa liczba - 8. W przypadku programowania, kluczowe jest zrozumienie, że pętla foreach nie tylko przegląda elementy, ale także pozwala na dynamiczne aktualizowanie zmiennej w zależności od warunku. Niezrozumienie tego aspektu może prowadzić do błędnych odpowiedzi, jak w tym przypadku, gdzie nie tylko nie dostrzegamy maksymalnej wartości, ale także nie rozumiemy poprawnych operacji na zmiennych. W programowaniu ważne jest, aby nie tylko znać składnię, ale także rozumieć logikę stojącą za danym algorytmem.

Pytanie 23

Co to jest Cypress?

A. Framework do testowania end-to-end aplikacji webowych
B. System zarządzania bazami danych dla aplikacji mobilnych
C. Biblioteka komponentów UI dla React
D. Narzędzie do kompilacji kodu TypeScript
Cypress to popularny framework do testowania aplikacji webowych, skoncentrowany na testach end-to-end, co oznacza, że pozwala na symulowanie rzeczywistego użytkownika w interakcji z aplikacją. Jego architektura oparta na JavaScript i łatwość integracji z innymi narzędziami sprawiają, że jest chętnie wybierany przez zespoły developerskie. Cypress umożliwia szybkie pisanie testów, które mogą być uruchamiane bezpośrednio w przeglądarce, co ułatwia debugowanie. Przykładem zastosowania może być testowanie formularzy na stronie internetowej, gdzie można sprawdzić, czy wszystkie pola działają poprawnie, czy błędne dane są odpowiednio walidowane oraz czy interfejs użytkownika reaguje jak oczekiwano. Dobrą praktyką jest pisanie testów w sposób, który odzwierciedla rzeczywiste scenariusze użytkowników, co zwiększa jakość i niezawodność aplikacji. Cypress zyskał uznanie w branży dzięki swojej wydajności i możliwościom wizualizacji testów, co czyni go jednym z wiodących narzędzi w obszarze automatyzacji testów.

Pytanie 24

Jaką funkcję spełniają atrybuty klasy w programowaniu obiektowym?

A. Określają globalne stałe programu
B. Zawierają informacje opisujące stan obiektu
C. Zapisują wartości lokalne w funkcjach
D. Umożliwiają przeprowadzanie operacji na obiektach
Zmienne lokalne w metodach przechowują wartości tymczasowe i są usuwane po zakończeniu wykonywania metody, co odróżnia je od pól klasy, które istnieją tak długo, jak istnieje obiekt. Stałe globalne programu są dostępne z każdego miejsca w kodzie, ale nie są związane z konkretną instancją obiektu – ich wartość nie zmienia się dla różnych obiektów. Operacje wykonywane na obiektach są definiowane przez metody klasy, a nie przez pola – pola jedynie przechowują dane, natomiast metody określają zachowanie obiektów i umożliwiają interakcję z nimi.

Pytanie 25

Oznaczenie ochrony przeciwpożarowej przedstawione na symbolu wskazuje na

Ilustracja do pytania
A. przełącznik zasilania
B. rozdzielnię elektryczną
C. system alarmowy przeciwpożarowy
D. punkt remote release
Ten symbol jednoznacznie wskazuje na ręczny ostrzegacz pożarowy, będący kluczowym elementem systemu alarmowego przeciwpożarowego. W praktyce taki przycisk znajdziesz w korytarzach szkół, biur czy dużych hal, zwykle przy wyjściach ewakuacyjnych. Po naciśnięciu wywołuje on alarm w całym obiekcie, pozwalając na szybką reakcję służb oraz ewakuację osób znajdujących się w strefie zagrożenia. Moim zdaniem zrozumienie działania i lokalizacji ręcznych ostrzegaczy jest absolutnie fundamentalne dla bezpieczeństwa pożarowego każdego budynku. Zgodnie z normą PN-EN 54-11 oraz wytycznymi Państwowej Straży Pożarnej, oznaczenie to musi być dobrze widoczne, z wyraźną, czerwoną barwą tła i prostym, czytelnym symbolem. Praktyka pokazuje, że w sytuacjach krytycznych ludzie dużo szybciej reagują na jednoznaczne oznaczenia graficzne niż na same napisy. Właśnie dlatego tak bardzo przykłada się wagę do poprawnej widoczności i rozmieszczenia tych znaków. Sam system alarmowy przeciwpożarowy, którego częścią są takie przyciski, jest podstawą nie tylko ochrony ludzi, ale też minimalizowania strat materialnych, bo pozwala na natychmiastowe powiadomienie odpowiednich służb. Warto zapamiętać, że ręczne ostrzegacze są regularnie testowane podczas przeglądów PPOŻ i ich prawidłowe oznakowanie to wymóg prawny oraz element dobrej praktyki branżowej.

Pytanie 26

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

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

Pytanie 27

Która z dokumentacji funkcji odpowiada przedstawionemu kodowi źródłowemu?

static int Abs(int liczba)
{
    if (liczba < 0)
        liczba *= -1;
    return liczba;
}
Dokumentacja 1:
/*******************
* nazwa: Abs
* opis: liczy wartość bezwzględną
* zwracana: brak
* argumenty: liczba całkowita
*******************/
Dokumentacja 2:
/*******************
* nazwa: Abs
* opis: liczy wartość bezwzględną
* zwracana: wartość bezwzględna z liczby całkowitej
* argumenty: liczba całkowita
*******************/
Dokumentacja 3:
/*******************
* nazwa: Abs
* opis: liczy potęgę liczby
* zwracana: potęga z liczby całkowitej
* argumenty: dwie liczby całkowite
*******************/
Dokumentacja 4:
/*******************
* nazwa: Abs
* opis: liczy potęgę liczby
* zwracana: potęga z liczby całkowitej
* argumenty: liczba całkowita
*******************/
A. Dokumentacja 4
B. Dokumentacja 2
C. Dokumentacja 3
D. Dokumentacja 1
Dokumentacja 2 zdecydowanie najlepiej pasuje do przedstawionej funkcji. Zwróć uwagę, że sama definicja funkcji „Abs” w kodzie przyjmuje jeden argument typu całkowitego (int) i zwraca także liczbę całkowitą. Jej zadaniem jest zwrócenie wartości bezwzględnej tej liczby, co dokładnie opisuje fragment: „zwracana: wartość bezwzględna z liczby całkowitej”. To bardzo ważne, bo w programowaniu – a szczególnie w językach takich jak C# czy C++ – jasna i kompletna dokumentacja pozwala potem innym korzystać z funkcji bez konieczności zaglądania do jej wnętrza. W praktyce, takie szczegółowe opisywanie co zwraca dana funkcja i jakie przyjmuje argumenty, znacznie przyspiesza pracę w większych zespołach. Standardem branżowym jest właśnie precyzyjne określanie typu zwracanego i opisu działania, a nie tylko suchy komentarz typu „zwraca: brak” (co byłoby niezgodne z kodem!). Co ciekawe, w wielu firmach stosuje się rozbudowane systemy dokumentacji (np. Doxygen czy XML doc w .NET), które niejako wymuszają takie dokładne opisy. Osobiście uważam, że przyzwyczajenie się do dobrych praktyk dokumentowania funkcji już na etapie nauki procentuje w przyszłości – mniej pytań w zespole, mniej nieporozumień. Ta konkretna dokumentacja spełnia wszystkie kluczowe kryteria: podaje nazwę, precyzyjny opis, prawidłowy typ zwracanej wartości oraz właściwy typ i opis argumentu. Idealnie odzwierciedla, co robi ten fragment kodu, a to podstawa w pisaniu czytelnych i bezpiecznych aplikacji.

Pytanie 28

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

A. Wywołanie destruktora klasy bez jej usuwania
B. Tworzenie prywatnych kopii pól dla każdej instancji
C. Umożliwienie dzielenia pól klasy pomiędzy zaprzyjaźnione klasy
D. Zachowanie wartości wspólnych dla wszystkich instancji klasy
Tworzenie prywatnych kopii pól dla każdego obiektu to cecha pól niestatycznych – każda instancja klasy ma swoją własną kopię takich pól. Dzielenie pól klasy pomiędzy zaprzyjaźnione klasy nie odnosi się do mechanizmu statycznego – przyjaźń między klasami pozwala na dostęp do prywatnych składowych, ale nie oznacza współdzielenia pól między instancjami. Destruktory nie mogą być wywoływane w sposób statyczny – są one automatycznie uruchamiane w momencie usunięcia obiektu, a nie przez klasę jako całość.

Pytanie 29

Który z algorytmów ma złożoność O(n²)?

A. Dijkstra
B. Binary Search
C. Bubble Sort
D. Merge Sort
Bubble Sort to algorytm o złożoności O(n²), co oznacza, że jego czas wykonania rośnie kwadratowo wraz ze wzrostem liczby elementów wejściowych. Algorytm porównuje sąsiadujące elementy i zamienia je miejscami, jeśli są w złej kolejności. Proces ten powtarza się wielokrotnie, aż do uzyskania pełnego posortowania tablicy. Ze względu na swoją prostotę, Bubble Sort jest często wykorzystywany do nauki podstaw algorytmiki, ale w praktyce rzadko stosuje się go do sortowania dużych zbiorów danych, ponieważ jest nieefektywny w porównaniu do bardziej zaawansowanych algorytmów, takich jak QuickSort czy Merge Sort.

Pytanie 30

Który z wymienionych mechanizmów umożliwia ograniczenie dostępu do wybranych sekcji aplikacji webowej?

A. Pliki CSS statyczne
B. System logowania i kontroli dostępu
C. Formularze dynamiczne
D. Mechanizm renderowania treści
System logowania i kontroli dostępu to kluczowy mechanizm, który pozwala na ograniczenie dostępu do niektórych części aplikacji webowej. Logowanie umożliwia uwierzytelnienie użytkowników i przypisanie im odpowiednich ról, co definiuje poziom dostępu do zasobów. Dzięki mechanizmom autoryzacji możliwe jest kontrolowanie, które funkcje lub sekcje aplikacji są dostępne dla poszczególnych użytkowników. Kontrola dostępu może być realizowana za pomocą tokenów JWT (JSON Web Token), sesji lub kluczy API, co zapewnia dodatkowe warstwy zabezpieczeń. Wdrożenie takich systemów jest nieodzowne w aplikacjach webowych oferujących różne poziomy funkcjonalności, takich jak panele administracyjne, portale użytkowników czy aplikacje bankowe. Odpowiednie zarządzanie uprawnieniami jest fundamentem bezpieczeństwa aplikacji.

Pytanie 31

Który z wymienionych typów kolekcji pozwala na dostęp do ostatnio dodanego elementu w pierwszej kolejności?

A. Lista
B. Tablica dwuwymiarowa
C. Stos
D. Kolejka
Stos to struktura danych działająca na zasadzie LIFO (Last In First Out), co oznacza, że ostatnio dodany element jest usuwany jako pierwszy. Stos znajduje zastosowanie w implementacji mechanizmu wywołań rekurencyjnych, zarządzaniu pamięcią oraz w operacjach związanych z cofaniem i przywracaniem stanu (np. cofanie operacji w edytorach tekstów). Dzięki swojej prostocie stosy są fundamentalnym elementem w programowaniu, szczególnie w językach niskopoziomowych.

Pytanie 32

Co to jest API w kontekście programowania?

A. Narzędzie do testowania interfejsu użytkownika aplikacji
B. System zarządzania relacyjnymi bazami danych
C. Interfejs programistyczny aplikacji, który definiuje sposób komunikacji między różnymi komponentami oprogramowania
D. Metoda kompresji danych w aplikacjach webowych
API, czyli Interfejs Programistyczny Aplikacji, to zestaw reguł i protokołów, które umożliwiają różnym komponentom oprogramowania komunikację ze sobą. W praktyce API działa jako most między różnymi systemami, pozwalając na wymianę danych oraz funkcji. Na przykład, API może być wykorzystywane do integracji z zewnętrznymi serwisami, takimi jak systemy płatności, co pozwala na łatwe wdrożenie funkcji zakupów online w aplikacji. Stosowanie API zgodnie z zasadami RESTful czy GraphQL jest powszechną praktyką, ponieważ ułatwia rozwój i utrzymanie aplikacji, umożliwiając tworzenie skalowalnych rozwiązań. Co więcej, dobrze zdefiniowane API zwiększa bezpieczeństwo aplikacji, ograniczając bezpośredni dostęp do wewnętrznych mechanizmów oraz danych. Firmy często tworzą dokumentację API, aby programiści mogli szybko zrozumieć, jak z niego korzystać, co jest zgodne z zasadami dobrych praktyk w branży programistycznej.

Pytanie 33

Jak w CSS definiuje się element, który ma reagować na najechanie kursorem?

A. :mouse
B. :hover
C. :click
D. :over
Odpowiedź :hover jest poprawna, ponieważ w CSS pseudo-klasa :hover jest używana do definiowania stylów elementu, gdy kursor myszy znajduje się nad tym elementem. Jest to niezwykle przydatne w tworzeniu interaktywnych stron internetowych, ponieważ umożliwia twórcom zwiększenie responsywności elementów, takich jak przyciski, linki czy obrazy. Przykładowo, można zastosować :hover do zmiany koloru tła przycisku, co wskazuje użytkownikom, że dany element jest aktywny i gotowy do interakcji. Zastosowanie tej pseudo-klasy nie tylko poprawia estetykę strony, ale również zwiększa jej użyteczność oraz dostępność, co jest zgodne z dobrymi praktykami w projektowaniu UI/UX. Należy pamiętać, że :hover działa tylko w przeglądarkach obsługujących CSS, a efekty związane z tą pseudo-klasą są natychmiastowe, co sprawia, że są one bardzo efektywne w zastosowaniu. Warto również zaznaczyć, że w przypadku urządzeń dotykowych, takich jak smartfony, reakcja na najechanie może być symulowana poprzez dotknięcie ekranu, co sprawia, że ta technika jest uniwersalna.

Pytanie 34

Jaki modyfikator umożliwia dostęp do elementu klasy z każdego miejsca w kodzie?

A. Static
B. Private
C. Protected
D. Public
Modyfikator 'Public' umożliwia dostęp do składowych klasy z dowolnego miejsca w programie, zarówno w ramach tej samej klasy, jak i poza nią. To najbardziej otwarty modyfikator dostępu, który pozwala na tworzenie interfejsów API, umożliwiających korzystanie z publicznych metod i właściwości przez inne klasy oraz moduły. W praktyce oznacza to, że publiczne metody są widoczne globalnie, co pozwala na ich wywoływanie bez ograniczeń. Jest to przydatne w przypadkach, gdy dana funkcjonalność musi być dostępna w różnych częściach programu lub aplikacji.

Pytanie 35

Która z poniższych nie jest prawidłową metodą zarządzania stanem w React?

A. useState hook
B. Redux
C. React.stateManager
D. Context API
Odpowiedzi, które wskazałeś, takie jak Redux, Context API oraz useState hook, są w rzeczywistości powszechnie uznawanymi metodami zarządzania stanem w React. Redux, jako zewnętrzna biblioteka, usprawnia zarządzanie stanem poprzez wprowadzenie centralnego store'a, który przechowuje wszystkie dane w aplikacji. Dzięki temu, każdy komponent może subskrybować zmiany w stanie, co pozwala na prostą synchronizację danych oraz ich śledzenie. Context API jest wbudowane w React i pozwala na udostępnianie danych między komponentami bez potrzeby przekazywania propsów, co znacząco upraszcza hierarchię komponentów i poprawia ich czytelność. Hook useState natomiast, jest prostym i intuicyjnym rozwiązaniem do zarządzania lokalnym stanem w komponentach funkcyjnych, co jest szczególnie przydatne w mniejszych projektach. Zrozumienie, dlaczego te metody są uznawane za poprawne, jest kluczowe, ponieważ pozwala na efektywne zarządzanie stanem w aplikacjach React. Często błędne wnioski wynikają z nieznajomości narzędzi dostępnych w ekosystemie React lub z mylnego przekonania, że dany sposób zarządzania stanem musi być uniwersalny. W rzeczywistości, najlepsze podejście zależy od skali oraz specyfiki projektu.

Pytanie 36

Który z wymienionych przykładów przedstawia typ rekordowy?

A. struct w języku C++
B. float w języku C
C. int w języku Python
D. bool w języku Java
Typ 'int' w Pythonie przechowuje liczby całkowite i nie pozwala na grupowanie wielu wartości pod jedną zmienną. 'Bool' w Javie to typ logiczny przechowujący wartości 'true' i 'false' – nie umożliwia przechowywania wielu pól. 'Float' w C to typ zmiennoprzecinkowy używany do przechowywania liczb rzeczywistych i nie jest typem rekordowym. Tylko 'struct' umożliwia tworzenie niestandardowych typów danych składających się z różnych pól, co czyni go kluczowym narzędziem w modelowaniu bardziej złożonych obiektów.

Pytanie 37

Który z poniższych elementów HTML5 służy do rysowania grafiki?

A. &lt;canvas&gt;
B. &lt;draw&gt;
C. &lt;svg&gt;
D. &lt;graphic&gt;
Elementy &lt;draw&gt; oraz &lt;graphic&gt; nie istnieją w standardzie HTML5, co sprawia, że nie mogą być używane do rysowania grafiki w dokumentach HTML. Takie nieporozumienia często wynikają z mylnego przekonania, że każda funkcjonalność dostępna w innych technologiach webowych ma swoje odpowiedniki w HTML. Niezrozumienie architektury HTML5 oraz jego standardów prowadzi do wyboru niewłaściwych narzędzi do zadań graficznych. Zamiast korzystać z nieistniejących elementów, programiści powinni zapoznać się z możliwościami, jakie oferuje &lt;canvas&gt;, czy też SVG (Scalable Vector Graphics), które również mogą być używane do tworzenia grafiki, jednak w inny sposób. SVG jest formatem wektorowym, który jest bardziej odpowiedni do statycznych grafik i interfejsów, podczas gdy &lt;canvas&gt; lepiej sprawdza się w przypadku dynamicznych, szczegółowych grafik i animacji. Wybór niewłaściwego elementu może prowadzić do trudności w implementacji oraz w utrzymaniu projektu, dlatego ważne jest, aby dokładnie rozumieć różnice między tymi technologiami i ich zastosowaniami w praktyce. Właściwe podejście do wykorzystania technologii webowych, zgodne z dobrą praktyką, wymaga świadomości dostępnych narzędzi i ich specyfiki.

Pytanie 38

Kiedy w programie występuje problem z działaniem, a programista musi zweryfikować wartości znajdujące się w zmiennych w momencie działania aplikacji, to w tym celu należy zastosować

A. wirtualną maszynę
B. interpreter
C. debugger
D. analizator składni
Debugger to jedno z podstawowych narzędzi, bez którego praktycznie żaden programista nie wyobraża sobie efektywnej pracy przy diagnozowaniu usterek w kodzie. Pozwala on na zatrzymanie wykonania programu w wybranym miejscu (tzw. breakpoint), podgląd wartości zmiennych, śledzenie stosu wywołań i krokowe przechodzenie przez kod. Praca z debuggerem znacznie skraca czas poszukiwania przyczyn błędów, pozwalając od razu zobaczyć, co dokładnie dzieje się „pod maską” aplikacji w konkretnym momencie jej działania. W mojej opinii – i myślę, że większość osób z branży się tu zgodzi – opanowanie obsługi debuggera to absolutna podstawa, jeśli ktoś myśli poważnie o programowaniu. Narzędzia te są dostępne w praktycznie każdym środowisku IDE, zarówno do języków kompilowanych jak i interpretowanych. Można dzięki nim sprawdzać nawet bardzo złożone przypadki, które trudno byłoby wychwycić samym czytaniem kodu albo przez dodawanie tymczasowych printów. Debugger umożliwia też dynamiczne modyfikowanie wartości w trakcie działania programu, co czasem bardzo się przydaje przy testowaniu różnych scenariuszy. Branżowe dobre praktyki wręcz zalecają regularne wykorzystywanie debuggera podczas pracy z większymi projektami, bo to po prostu ogromna oszczędność czasu i nerwów.

Pytanie 39

Dokumentacja, która została przedstawiona, dotyczy algorytmu sortowania

To prosta metoda sortowania opierająca się na cyklicznym porównywaniu par sąsiadujących ze sobą elementów i zamianie ich miejscami w przypadku, kiedy kryterium porządkowe zbioru nie zostanie spełnione. Operacje te wykonywane są dopóki występują zmiany, czyli tak długo, aż cały zbiór zostanie posortowany.
A. przez wstawianie
B. bąbelkowe
C. przez wybór
D. szybkie (Quicksort)
Opisany w pytaniu algorytm to właśnie sortowanie bąbelkowe (ang. bubble sort). Polega ono na wielokrotnym przechodzeniu przez zbiór danych i zamienianiu miejscami sąsiadujących elementów, jeśli są w złej kolejności. Czynność ta powtarzana jest do momentu, gdy cały zbiór zostanie uporządkowany i żadne zamiany nie będą już potrzebne. Moim zdaniem, to chyba jeden z najbardziej intuicyjnych algorytmów sortowania, jakie się poznaje na początku nauki programowania – łatwo go zaimplementować, bo wymaga właściwie tylko dwóch pętli i porównania sąsiednich elementów. W praktyce bubble sort raczej rzadko używa się w profesjonalnych projektach, bo jego złożoność czasowa to O(n^2), co przy dużych zbiorach jest nieefektywne. Jednak czasami, na bardzo małych listach albo gdy szybko trzeba zrobić prosty prototyp, to można sięgnąć po „bąbelki”. Z mojego doświadczenia wynika też, że sortowanie bąbelkowe dobrze obrazuje podstawowe zasady algorytmiki, na przykład jak działa iteracja czy wymiana miejscami zmiennych – to przydatne w nauce. W wielu językach programowania, nawet tych nowoczesnych, można spotkać przykłady z bubble sort jako ilustrację podstaw. To taki klasyk – mało kto używa go zawodowo, ale każdy programista powinien wiedzieć, jak działa. Warto też pamiętać, że istnieją optymalizacje bubble sortu, np. wcześniejsze zakończenie, gdy w danej iteracji nie wystąpiła żadna zamiana. No i taka ciekawostka: choć algorytm nie jest specjalnie szybki, to bardzo łatwo go zaimplementować nawet w językach niskopoziomowych, bo nie wymaga dodatkowej pamięci.

Pytanie 40

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:8000 (React) lub localhost:49887 (Angular)
D. localhost:5001 (React) lub localhost:8080 (Angular)
React domyślnie startuje na porcie 3000, a Angular na 4200 – to są takie standardy, które praktycznie wszyscy w branży znają i stosują. Kiedy zaczynasz nowy projekt w React, korzystając na przykład z create-react-app, serwer deweloperski po prostu nasłuchuje na http://localhost:3000. Analogicznie, jak generujesz projekt w Angular CLI i odpalasz ng serve, wtedy aplikacja wystartuje na http://localhost:4200. To są domyślne porty – nie musisz nic specjalnie ustawiać, wystarczy wpisać te adresy w przeglądarce. Z mojego doświadczenia, dobrze jest zapamiętać te ustawienia, bo praktycznie na każdym warsztacie czy bootcampie te adresy padają od ręki. Jeśli chodzi o praktykę, czasami port jest już zajęty i wtedy narzędzie zaproponuje inny, ale te wartości startowe to taka baza. Warto pamiętać, że zmiana portu wynika zazwyczaj z konfliktu, a nie z jakiejś specjalnej potrzeby. Dodatkowo, rozpoznanie tych portów pozwala szybciej debugować problemy z uruchomieniem aplikacji – jak coś nie wstaje na tych adresach, to od razu wiadomo, gdzie szukać. Ogólnie rzecz biorąc, korzystanie z tych domyślnych portów przyspiesza współpracę w zespole, bo każdy wie, gdzie szukać aplikacji, więc nie trzeba się rozpisywać w README, na jakim porcie coś działa. Moim zdaniem, to jeden z tych drobnych szczegółów, które składają się na dobre nawyki programistyczne.