Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 11 lipca 2026 14:17
  • Data zakończenia: 11 lipca 2026 14:34

Egzamin niezdany

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

Wymagane minimum: 20 punktów (50%)

Nowe
Analiza przebiegu egzaminu- sprawdź jak rozwiązywałeś pytania
Udostępnij swój wynik
Szczegółowe wyniki:
Pytanie 1

Jakie jest zastosowanie iteratora w zbiorach?

A. Do zmiany rodzaju zbioru w trakcie działania aplikacji
B. Do generowania kopii zbiorów
C. Do usuwania elementów ze zbioru
D. Do iterowania po elementach zbioru
Tworzenie kopii kolekcji to operacja duplikacji danych i nie wymaga iteratorów. Usuwanie elementów z kolekcji może być realizowane przy pomocy iteratora, ale nie jest to jego główna funkcja. Zmiana typu kolekcji to operacja, która często wymaga konwersji lub transformacji, ale iterator nie służy do zmiany typów danych, a jedynie do iteracji po elementach kolekcji.

Pytanie 2

W przypadku przedstawionych kodów źródłowych, które są funkcjonalnie równoważne, wartość, która zostanie zapisana w zmiennej b po wykonaniu operacji, to

Python:C++ / C# / Java:
x = 5.96;
b = int(x);
double x = 5.96;
int b = (int)x;
A. 6
B. 5
C. 596
D. 5.96
W tym zadaniu mamy do czynienia z fajnym przykładem konwersji liczby 5.96 na liczbę całkowitą w różnych językach, takich jak Python czy C++. Kiedy robimy rzutowanie, to po prostu odcinamy część ułamkową, co daje nam 5 w zmiennej b. To jest trochę klasyczne rzutowanie albo konwersja typu, gdzie w większości języków po prostu się to robi. Ciekawostką jest, że w Pythonie działa to przez funkcję int(), która zawsze zaokrągla w dół. A w C++ czy Javie używasz po prostu (int) i efekt jest ten sam. Warto też zwrócić uwagę, że przy liczbach ujemnych rzutowanie działa inaczej, bo zawsze zmierza w stronę zera. Z doświadczenia wiem, że warto być świadomym użycia takich konwersji, bo w niektórych przypadkach, jak operacje finansowe, nawet małe różnice mogą się okazać bardzo istotne.

Pytanie 3

Zastosowanie typu DECIMAL języka SQL wymaga wcześniejszego zdefiniowania długości (liczby cyfr) przed przecinkiem oraz długości cyfr po przecinku. Jest to zapis:

A. stałoprzecinkowy
B. logicznym
C. zmiennoprzecinkowy
D. łańcuchowym
Typ DECIMAL w SQL bywa mylony z różnymi innymi kategoriami typów, głównie dlatego, że ludzie kojarzą „przecinek” z liczbami zmiennoprzecinkowymi albo traktują wszystko, co ma cyfry, jako coś podobnego do tekstu. W rzeczywistości DECIMAL jest typem stałoprzecinkowym, czyli takim, w którym precyzja i liczba miejsc po przecinku są z góry ustalone przy definicji kolumny. To jest zupełnie inne podejście niż w typach zmiennoprzecinkowych, takich jak FLOAT czy DOUBLE. Tam liczby są przechowywane w formacie binarnym zgodnym mniej więcej ze standardem IEEE 754, a przecinek „pływa”, co prowadzi do drobnych, ale istotnych błędów zaokrągleń.
Jeśli ktoś zaznacza odpowiedź zmiennoprzecinkowy, to zwykle wynika z intuicji: skoro jest przecinek, to pewnie float. To jest typowy błąd myślowy. W SQL typy zmiennoprzecinkowe są właśnie po to, by obsługiwać bardzo duże lub bardzo małe wartości kosztem dokładności, np. w obliczeniach naukowych. DECIMAL natomiast ma służyć do obliczeń finansowych i biznesowych, gdzie dokładność jest ważniejsza niż zakres. Z mojego doświadczenia to jedno z częstszych źródeł błędów w młodych projektach: użycie FLOAT do kwot pieniędzy.
Odpowiedź logicznym też bywa wybierana trochę „na czuja”, bo ktoś kojarzy, że SQL ma typy TRUE/FALSE, ale DECIMAL nie ma nic wspólnego z logiką boolowską. Typy logiczne przechowują wartości dwustanowe (czasem z NULL jako stanem trzecim), a nie liczby z miejscami po przecinku. Podobnie odpowiedź łańcuchowym wynika z przekonania, że skoro można cyfry zapisać w tekście, to wszystko jedno, czy to tekst, czy liczba. W praktyce typy łańcuchowe (CHAR, VARCHAR, TEXT) nie zapewniają poprawnej arytmetyki, sortowania numerycznego ani kontroli zakresu liczb. Trzymanie wartości liczbowych jako tekst to bardzo zła praktyka: utrudnia indeksowanie, psuje wydajność i powoduje dziwne błędy przy porównaniach (np. '100' < '20' w porządku leksykograficznym). Dobre wzorce projektowania baz danych mówią jasno: liczby trzymaj w typach liczbowych, a wartości wymagające dokładności dziesiętnej w typie stałoprzecinkowym DECIMAL/NUMERIC, z jasno określoną precyzją i skalą.

Pytanie 4

Jakie jest przeznaczenie polecenia "git merge"?

A. Do usuwania zmian w repozytorium
B. Do pobierania aktualizacji zdalnego repozytorium
C. Do łączenia zmian z różnych gałęzi
D. Do zakładania nowego repozytorium
Polecenie "git merge" służy w Git do łączenia zmian z różnych gałęzi. Kiedy pracujemy w zespole i każdy programista rozwija swój fragment kodu na osobnej gałęzi, w pewnym momencie trzeba te zmiany zebrać do kupy, żeby powstała jedna, wspólna wersja projektu. Tu właśnie pojawia się "merge" – pozwala w prosty sposób dołączyć zmiany z jednej gałęzi do drugiej, najczęściej z feature branch do develop albo main. Praktycznie rzecz biorąc, to polecenie sprawdza się zawsze wtedy, gdy chcemy zintegrować efekty pracy kilku osób lub wersje rozwojowe z główną linią kodu. Moim zdaniem, korzystanie z "git merge" to w zasadzie codzienność w projektach zespołowych, bo prawie nikt już nie pracuje tylko na jednej gałęzi. Warto też pamiętać, że merge może czasem prowadzić do konfliktów, jeśli te same fragmenty plików były zmieniane równolegle – wtedy trzeba ręcznie rozwiązać te rozbieżności. W praktyce, dobrą praktyką jest regularne mergowanie, żeby uniknąć lawiny konfliktów na koniec sprintu. Dla mnie "merge" to narzędzie absolutnie kluczowe, bez którego ciężko sobie wyobrazić sensowną pracę z Gitem. No i jeszcze – to nie to samo co "rebase", chociaż oba służą do integracji zmian, ale w różny sposób. Merge zostawia historię połączeń, co ułatwia śledzenie zmian w większych projektach.

Pytanie 5

Aby tworzyć aplikacje desktopowe w języku Java, można wybrać jedno z poniższych środowisk

A. Ms Visual Studio
B. PyCharm
C. SharpDevelop
D. NetBeans
NetBeans to środowisko IDE, które od lat jest mocno kojarzone z programowaniem w Javie, szczególnie jeśli chodzi o tworzenie aplikacji desktopowych. Moim zdaniem to jedno z wygodniejszych narzędzi dla osób, które chcą się na poważnie zabrać za GUI z użyciem Swinga, JavaFX czy nawet starszego AWT. NetBeans posiada wbudowany kreator graficznych interfejsów użytkownika – to tzw. Matisse, który naprawdę upraszcza projektowanie okienek, przycisków czy pól tekstowych. No i nie trzeba się męczyć z ręcznym ustawianiem każdego komponentu w kodzie – wystarczy przeciągnąć i upuścić. To narzędzie od zawsze stawiało na wsparcie dla Javy: podpowiadanie kodu, debugging, zarządzanie bibliotekami czy automatyczna kompilacja… wszystko tu działa od ręki. W praktyce NetBeans wykorzystywany jest zarówno przez początkujących, jak i przez doświadczonych programistów, bo ułatwia utrzymanie dużych projektów. Przykład z życia: wiele aplikacji administracyjnych, narzędziowych czy nawet systemów do zarządzania firmą powstało właśnie przy użyciu NetBeansa i JavaFX. Co ciekawe, środowisko wspiera też inne języki, ale jego rdzeń zawsze był skupiony na Javie. W branży uważa się, że korzystanie z NetBeansa to dobra praktyka, bo pozwala na szybkie prototypowanie interfejsów i jest zgodny ze standardami Java Enterprise. Jeśli chcesz budować desktopowe aplikacje w Javie – nie ma co się długo zastanawiać, NetBeans jest naprawdę solidnym wyborem.

Pytanie 6

W przedstawionych funkcjonalnie równoważnych kodach źródłowych po przeprowadzeniu operacji w zmiennej b zostanie zapisany wynik:

Python:C++/C#/Java:
x = 5.96;
b = int(x);
double x = 5.96;
int b = (int)x;
A. 5.96
B. 5
C. 596
D. 6
Odpowiedź 5 jest prawidłowa, bo w większości popularnych języków programowania, takich jak Python, C++, C#, czy Java, rzutowanie liczby zmiennoprzecinkowej (czyli typu float lub double) na typ całkowity (int) powoduje odcięcie części ułamkowej, a nie zaokrąglenie. To jest bardzo ważne, bo wiele osób intuicyjnie spodziewa się zaokrąglenia, a tu po prostu wszystko po przecinku ląduje w koszu. W przypadku podanego przykładu zmienna x ma wartość 5.96, ale po rzutowaniu na int, zarówno w Pythonie poprzez funkcję int(), jak i w pozostałych językach przez klasyczne rzutowanie (int)x, zostaje tylko 5. Dokładnie tak działa konwersja: odcina się część po przecinku niezależnie od tego, jak blisko liczba jest kolejnej całości. To niesamowicie przydatne np. podczas pracy z indeksami tablic albo gdy chcemy szybko zamienić wynik dzielenia na liczbę całkowitą. W praktyce, warto pamiętać, że takie rzutowanie nie wykonuje żadnej walidacji ani sprawdzania – jeśli liczba jest ujemna, to po prostu też odcina część ułamkową w kierunku zera, więc int(-5.96) da -5. Z mojego doświadczenia bardzo często spotyka się błąd w kodzie, kiedy ktoś oczekuje zaokrąglenia i nie otrzymuje go, bo rzutowanie zawsze odcina, nie zaokrągla. Warto znać tę różnicę przy projektowaniu algorytmów i korzystać np. z funkcji round() jeśli potrzebujemy zaokrąglenia, a nie odcinania. To takie małe niuanse, ale potem wchodzą w nawyk i bardzo ułatwiają życie podczas kodowania.

Pytanie 7

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

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

Pytanie 8

Programista aplikacji mobilnych chce przekwalifikować się na pracownika Full-Stack Developer. Wskaż kurs, który powinien wybrać, aby było to możliwe

A. Mastering Cross-platform Developping
B. Ultimate C# Serier from Beginner to Advanced
C. Complete JavaScript React, SQL, Node.js Cource
D. Raster and Vector Graphics with Adobe
Analizując pozostałe propozycje kursów, łatwo zauważyć, że żadna z nich nie daje pełnego zestawu kompetencji wymaganych od pełnoprawnego Full-Stack Developera. Kurs "Mastering Cross-platform Developing" sugeruje skupienie się na tworzeniu aplikacji działających na wielu platformach – najczęściej chodzi tu o frameworki typu React Native, Flutter czy Xamarin. Chociaż brzmi to kusząco, w rzeczywistości skupia się bardziej na rozwoju aplikacji mobilnych niż na pełnym stacku webowym. Z mojego doświadczenia, wybierając tę ścieżkę, często zostaje się ekspertem od warstwy prezentacji, a backend czy bazy danych nadal pozostają poza zasięgiem. "Ultimate C# Series from Beginner to Advanced" to typowy kurs nastawiony na jeden język, w tym przypadku C#. Owszem, C# jest bardzo mocny w środowisku .NET i często wykorzystywany do budowy backendu aplikacji webowych, ale bez znajomości JavaScriptu, frontendu (czyli np. Reacta, Vue, Angular) oraz baz danych, trudno mówić o prawdziwym full-stacku. W dodatku, firmy wymagające full-stacków z reguły wolą osoby, które potrafią łączyć technologie webowe typu JavaScript/Node.js z nowoczesnymi frontendami, bo to jest obecnie standard branżowy. Z kolei "Raster and Vector Graphics with Adobe" to kurs zupełnie z innej bajki – omówienie grafiki rastrowej i wektorowej przydaje się grafikom lub UX/UI designerom, a nie programistom pełnego stosu. To typowy błąd myślowy: wychodzić z założenia, że wystarczą umiejętności graficzne, by być full-stackiem. W praktyce, nawet najbardziej estetyczny interfejs nie znaczy nic bez solidnego backendu i umiejętności pracy z bazami danych. Na rynku pracy szuka się osób, które potrafią obsłużyć całą ścieżkę przepływu danych i logiki, a nie tylko jedną wybraną dziedzinę. Moim zdaniem, wybierając którąkolwiek z tych opcji, nie zdobędzie się pełnego, wszechstronnego portfolio, które pozwoli z powodzeniem konkurować na rynku IT jako full-stack.

Pytanie 9

Jaki protokół komunikacyjny jest używany w aplikacjach IoT (Internet of Things)?

A. HTTP
B. MQTT
C. SMTP
D. FTP
HTTP, FTP i SMTP to protokoły, które mają swoje zastosowania, jednak w kontekście IoT nie są optymalnym wyborem. HTTP (Hypertext Transfer Protocol) jest protokołem opartym na połączeniach, który jest szeroko stosowany w aplikacjach webowych do przesyłania dokumentów i zasobów. Jego charakterystyka, związana z dużym narzutem na dane i brakiem mechanizmów publikacji-subskrypcji, sprawia, że nie nadaje się do efektywnej komunikacji między dużą liczbą urządzeń IoT. FTP (File Transfer Protocol) służy głównie do przesyłania plików, co w kontekście IoT jest rzadko potrzebne, a jego złożoność oraz wymóg ciągłego połączenia czynią go nieodpowiednim do komunikacji w czasie rzeczywistym. SMTP (Simple Mail Transfer Protocol), z kolei, to protokół do wysyłania wiadomości e-mail, co również nie jest adekwatne dla urządzeń IoT, które często potrzebują szybkiej i niezawodnej wymiany danych. Typowym błędem myślowym jest założenie, że ponieważ te protokoły są powszechnie używane w innych kontekstach, mogą być równie skuteczne w IoT. W rzeczywistości, specyfika IoT wymaga odmiennych podejść, jak te, jakie oferuje MQTT, które są dostosowane do ograniczeń i wymagań tego dynamicznego środowiska.

Pytanie 10

Które z wymienionych pól klasy można zainicjalizować przed stworzeniem obiektu?

A. Publiczne pole
B. Static pole
C. Prywatne pole
D. Chronione pole
Pola prywatne i chronione są związane z konkretnymi instancjami klasy, co oznacza, że nie mogą być inicjalizowane przed utworzeniem obiektu. Inicjalizacja takich pól następuje w konstruktorze klasy lub w trakcie tworzenia instancji. Publiczne pola, choć dostępne z dowolnego miejsca w programie, także wymagają istnienia konkretnej instancji obiektu, aby mogły zostać zainicjowane i użyte. Statyczność jest kluczowym czynnikiem pozwalającym na inicjalizację pola niezależnie od istnienia obiektu.

Pytanie 11

Programista może wykorzystać framework Angular do realizacji aplikacji

A. mobilnej
B. typu back-end
C. typu front-end
D. desktopowej
Wybór odpowiedzi mobilnej nie jest trafiony. Angular sam w sobie nie jest stworzony do aplikacji mobilnych, jak chociażby React Native czy Flutter, które są do tego specjalnie zaprojektowane. Można co prawda budować mobilki z Angular w połączeniu z Ionic, ale to nie jest jego główne przeznaczenie. Jeśli chodzi o back-end, to też się nie nadaje, bo Angular to framework front-endowy, a więc nie ma tu mowy o logice serwerowej czy zarządzaniu bazami danych, co jest kluczowe w aplikacjach back-endowych. Trochę można by kombinować z aplikacjami desktopowymi, bo są rozwiązania jak Electron, ale na dobrą sprawę Angular powstał głównie do webu. Tak więc użycie Angulara w kontekście back-endu lub desktopów nie jest zgodne z jego przeznaczeniem i w związku z tym te odpowiedzi są po prostu błędne.

Pytanie 12

Jednym z rodzajów testów funkcjonalnych, które można przeprowadzić na aplikacji webowej, jest ocena

A. poprawności wyświetlanych elementów aplikacji
B. bezpieczeństwa aplikacji
C. poziomu optymalizacji kodu aplikacji
D. wydajności aplikacji
Bezpieczeństwo aplikacji to sprawa testów penetracyjnych, a nie funkcjonalnych. Wiesz, to trochę jak sprawdzenie, czy można się włamać do systemu, a nie sprawdzanie, czy przyciski działają. Co do optymalizacji kodu, to tam są testy wydajnościowe, ale nie związane bezpośrednio z tym, co testujemy w funkcjonalności. Zresztą, wydajność aplikacji to z kolei obszar testów obciążeniowych i stresowych. W skrócie, chodzi o to, jak system działa pod dużym obciążeniem, a nie jakie ma funkcje.

Pytanie 13

Co będzie wynikiem wykonania poniższego kodu w języku C#?

string text = "hello world";
var result = string.Join("", text.Split(' ').Select(s => char.ToUpper(s[0]) + s.Substring(1)));
Console.WriteLine(result);
A. helloworld
B. HELLO WORLD
C. HelloWorld
D. Hello World
Wynik działania przedstawionego kodu to 'HelloWorld'. Zrozumienie tego wyniku wymaga analizy poszczególnych elementów kodu. Na początku mamy zmienną tekstową 'text' z wartością 'hello world'. Następnie, tekst jest dzielony na fragmenty za pomocą metody 'Split', która rozdziela go na podstawie spacji. W efekcie otrzymujemy tablicę z dwoma elementami: 'hello' i 'world'. Następnie, za pomocą metody 'Select', każdy z tych fragmentów jest przetwarzany. Pierwszy znak każdego słowa jest konwertowany na wielką literę dzięki 'char.ToUpper(s[0])', a następnie łączony z resztą słowa ('s.Substring(1)'). Tak uzyskane fragmenty są łączone w jeden ciąg za pomocą 'string.Join("", ...)'. W rezultacie otrzymujemy 'HelloWorld', co jest zgodne z praktykami konwencji nazewniczych w programowaniu, gdzie często łączy się słowa w jeden ciąg, eliminując spacje. Dzięki temu wynik jest bardziej zwięzły i czytelny."

Pytanie 14

Jakie cechy posiada kod dopełniający do dwóch?

A. Umożliwia konwersję systemu binarnego na szesnastkowy
B. Reprezentuje liczbę w odwrotnej formie binarnej
C. Umożliwia reprezentację liczb ujemnych w systemie binarnym
D. Służy do przekształcania liczb binarnych na dziesiętne
Pierwsza z niepoprawnych odpowiedzi sugeruje, że kod uzupełnieniowy do dwóch przedstawia liczbę w postaci odwrotnej binarnej. Chociaż odwracanie bitów jest częścią konwersji do kodu uzupełnieniowego, to jednak nie jest to jedyny krok. Kod uzupełnieniowy do dwóch polega na odwróceniu bitów w liczbie binarnej oraz dodaniu 1, co czyni tę odpowiedź nieprecyzyjną. Druga niepoprawna odpowiedź twierdzi, że kod uzupełnieniowy służy do konwersji liczb binarnych na liczby dziesiętne. W rzeczywistości konwersja z systemu binarnego na dziesiętny polega na zsumowaniu wartości bitów pomnożonych przez odpowiednie potęgi liczby 2, a nie na zastosowaniu kodu uzupełnieniowego. Ostatnia niepoprawna odpowiedź sugeruje, że kod uzupełnieniowy umożliwia zamianę systemu binarnego na szesnastkowy. W rzeczywistości konwersja z systemu binarnego na szesnastkowy opiera się na grupowaniu bitów w zestawy po cztery, co nie ma nic wspólnego z kodem uzupełnieniowym. Kod uzupełnieniowy do dwóch jest zatem techniką reprezentacji liczb, a nie narzędziem do konwersji między różnymi systemami liczbowymi.

Pytanie 15

Zaprezentowany symbol odnosi się do

Ilustracja do pytania
A. Creative Commons
B. domeny publicznej
C. praw autorskich
D. prawa cytatu
Wiele osób zaczyna od skojarzenia tego symbolu z prawami autorskimi, Creative Commons albo prawem cytatu, jednak to prowadzi na manowce. Po pierwsze, standardowy symbol praw autorskich to samo „C” w kółku, bez przekreślenia – i on oznacza, że utwór jest objęty ochroną z mocy prawa i wszelkie wykorzystanie wymaga zgody twórcy lub spełnienia warunków ustawowych wyjątków. Natomiast tutaj mamy przekreślone „C”, co jednoznacznie sugeruje brak ochrony. Creative Commons to zupełnie inny zestaw symboli, z typowymi oznaczeniami: CC i różnymi dodatkami jak BY, SA, NC, ND, które precyzują warunki korzystania z utworu. Te licencje nadal wprowadzają ograniczenia, chociaż są dużo bardziej elastyczne niż klasyczne prawa autorskie – ale nigdy nie oznaczają całkowitego braku praw. Prawo cytatu z kolei to wyjątek w ustawie o prawie autorskim, który pozwala na ograniczone wykorzystywanie fragmentów cudzych utworów w określonych sytuacjach, ale nie oznacza, że cały utwór można wykorzystywać dowolnie i bez ograniczeń. Typowy błąd polega na utożsamianiu każdego oznaczenia związanych z literą C z szeroko rozumianą „wolnością” korzystania – a to nieprawda. Domena publiczna jest zupełnie oddzielną kategorią, gdzie utwór jest trwale wyjęty spod ochrony prawnej i można go używać naprawdę dowolnie. W praktyce, nieznajomość tych niuansów może prowadzić do błędów prawnych, np. nieświadomego naruszenia czyichś praw, albo niewłaściwego oznaczenia własnej pracy. W środowisku profesjonalnym bardzo ważne jest właśnie rozróżnianie tych pojęć i symboli – to wpływa na bezpieczeństwo prawne projektów i buduje zaufanie do twórcy.

Pytanie 16

Która metoda cyklu życia komponentu w React.js jest wywoływana tuż po zamontowaniu komponentu w DOM?

A. componentWillUnmount()
B. componentDidMount()
C. componentDidUpdate()
D. componentWillMount()
Odpowiedzi takie jak 'componentWillMount()', 'componentDidUpdate()' oraz 'componentWillUnmount()' nie są poprawne w kontekście tego pytania o cykl życia komponentu. 'componentWillMount()' jest wywoływana tuż przed montowaniem komponentu, co oznacza, że nie mamy jeszcze dostępu do DOM, przez co nie możemy wykonywać działań, które są zależne od jego obecności. W praktyce, ta metoda jest obecnie przestarzała, a jej użycie może prowadzić do nieprzewidywalnych rezultatów, szczególnie w przypadku asynchronicznego ładowania danych. Z kolei 'componentDidUpdate()' jest wywoływana po każdej aktualizacji komponentu, co oznacza, że komponent jest już zamontowany, ale nie jest to moment, w którym powinniśmy inicjować logikę, która zależy od dostępu do DOM. Ta metoda jest bardziej odpowiednia do reagowania na zmiany stanu lub propsów. 'componentWillUnmount()' jest wywoływana tuż przed odmontowaniem komponentu i służy do czyszczenia zasobów, takich jak anulowanie subskrypcji, co jest ważne dla unikania wycieków pamięci. Zrozumienie cyklu życia komponentów jest kluczowe dla efektywnego programowania w React, a wybór odpowiednich metod ma bezpośredni wpływ na wydajność aplikacji oraz jej stabilność.

Pytanie 17

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

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

Pytanie 18

Aby zdefiniować zmienną, która będzie działała jako licznik instancji danej klasy, należy wprowadzenie takiego zmiennej poprzedzić słowem kluczowym

A. virtual
B. register
C. static
D. operator
Słowo kluczowe static jest absolutnie podstawą, jeśli chodzi o definiowanie zmiennych, które mają być współdzielone przez wszystkie instancje danej klasy. Gdy w klasie utworzysz zmienną statyczną, nie jest ona powiązana z żadnym konkretnym obiektem, tylko istnieje jedna taka zmienna dla całej klasy, niezależnie od liczby utworzonych obiektów. To niesamowicie przydatne, np. właśnie przy liczeniu instancji – wystarczy inkrementować taką zmienną w konstruktorze. W C++ czy Javie jest to standardowy sposób na śledzenie, ile obiektów danego typu zostało utworzonych. Z mojej perspektywy, korzystanie ze static to nie tylko wygoda, ale też sygnał dla innych programistów, że dana wartość jest globalna w kontekście klasy, a nie obiektu. Przykład praktyczny: jeżeli masz klasę Samochód i chcesz wiedzieć, ile samochodów zostało już utworzonych, to deklarujesz static int licznik; i za każdym razem, gdy konstruktor się odpala, robisz licznik++. Takie podejście jest bardzo czytelne i od razu wiadomo, o co chodzi. Warto też pamiętać, że static może być używany nie tylko do liczenia instancji, ale też do przechowywania różnych konfiguracji czy referencji do wspólnych zasobów. Zdecydowanie jest to jedna z lepszych praktyk, szczególnie kiedy program zaczyna rosnąć i zależy nam na porządku w kodzie.

Pytanie 19

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

Jaką rolę odgrywa destruktor w definicji klasy?

A. Usuwa instancje i zwalnia pamięć
B. Realizuje testy jednostkowe klasy
C. Ustawia wartości pól klasy
D. Generuje nowe instancje klasy
Tworzenie nowych obiektów to zadanie konstruktora, a nie destruktora. Inicjalizacja pól klasy odbywa się w konstruktorze lub metodach, które są wywoływane w trakcie życia obiektu. Testy jednostkowe klasy nie są związane z destruktorem – są one częścią procesu walidacji i testowania kodu, ale nie zarządzają cyklem życia obiektu. Destruktor jest odpowiedzialny za usuwanie obiektów i zwalnianie zasobów, co odróżnia go od metod inicjalizujących lub testujących klasę.

Pytanie 21

Które z wymienionych sformułowań najlepiej definiuje oprogramowanie typu ransomware?

A. Programy zbierające prywatne dane bez zgody użytkownika
B. Oprogramowanie uniemożliwiające dostęp do danych w celu wymuszenia zapłaty
C. Złośliwe aplikacje wyświetlające reklamy
D. Oprogramowanie stosowane do realizacji ataków DDoS
Odpowiedzi wskazujące na inne formy złośliwego oprogramowania, takie jak programy zbierające dane osobowe, oprogramowanie do ataków DDoS oraz złośliwe aplikacje wyświetlające reklamy, są niepoprawne w kontekście definicji ransomware. Programy zbierające dane osobowe działają w celu gromadzenia informacji o użytkownikach, często bez ich zgody, lecz nie mają na celu blokowania dostępu do danych ani wymuszania okupu. Z kolei oprogramowanie stosowane do ataków DDoS (Distributed Denial of Service) ma za zadanie zablokować dostęp do serwisów internetowych poprzez ich przeciążenie, a nie szyfrowanie danych użytkowników. Takie ataki są skierowane na infrastruktury sieciowe lub serwery, co różni się od typowych mechanizmów ransomware, które koncentrują się na lokalnych plikach. Złośliwe aplikacje wyświetlające reklamy, znane jako adware, generują dochody poprzez wyświetlanie niechcianych reklam, co nie ma związku z wymuszaniem okupu ani szyfrowaniem danych. Te rodzaje oprogramowania mają różne cele i metody działania, ale nie są zbliżone do funkcji i skutków ataku ransomware.

Pytanie 22

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 23

Jaki model zarządzania projektami przewiduje, że wszystkie etapy są realizowane jeden po drugim, bez możliwości wrócenia do wcześniejszych faz?

A. Model kaskadowy (waterfall)
B. Metodyki zwinne (Agile)
C. Model przyrostowy
D. Model spiralny
Model kaskadowy (Waterfall) zakłada, że każda faza projektu jest realizowana sekwencyjnie, bez możliwości powrotu do wcześniejszych etapów. Każda faza musi zostać zakończona przed rozpoczęciem kolejnej, co sprawia, że model ten jest przewidywalny i dobrze nadaje się do projektów o jasno określonych wymaganiach. Dzięki temu ryzyko błędów jest minimalizowane na wczesnym etapie, co zwiększa stabilność projektu. Waterfall jest często stosowany w projektach infrastrukturalnych i rządowych, gdzie istotna jest dokładność i zgodność z pierwotnym planem.

Pytanie 24

Jakie z wymienionych narzędzi pozwala na jednoczesne korzystanie z systemów BIN, DEC i HEX?

A. GIMP
B. Przeglądarka grafów
C. Microsoft Word
D. Kalkulator systemowy
Kalkulator systemowy to narzędzie, które umożliwia użytkownikom pracę z różnymi systemami liczbowymi, takimi jak system dziesiętny (DEC), binarny (BIN) oraz szesnastkowy (HEX). Jego funkcjonalność pozwala na konwersję wartości liczbowych pomiędzy tymi systemami, co jest niezwykle przydatne w kontekście programowania, inżynierii komputerowej oraz nauk przyrodniczych. Dzięki kalkulatorowi systemowemu, użytkownicy mogą wprowadzać liczby w jednym systemie, a następnie uzyskiwać ich odpowiedniki w pozostałych systemach, co znacznie ułatwia analizę danych. Na przykład, wpisując liczbę w systemie binarnym, można natychmiast zobaczyć jej reprezentację w systemie dziesiętnym i szesnastkowym, co jest kluczowe w zadaniach związanych z konwersją kodów czy obliczeniami w architekturze komputerowej. Ponadto, kalkulatory systemowe często zawierają funkcje umożliwiające przeprowadzanie bardziej skomplikowanych operacji, takich jak dodawanie czy odejmowanie w różnych systemach liczbowych, co czyni je nieocenionym narzędziem w programowaniu i obliczeniach naukowych. Narzędzia te są zgodne z powszechnie przyjętymi standardami, takimi jak IEEE 754 dla reprezentacji liczb zmiennoprzecinkowych, co zapewnia ich wysoką dokładność i niezawodność w obliczeniach.

Pytanie 25

Jakie jest wymagane minimalne natężenie światła w biurze na stanowisku pracy?

A. 100 lx
B. 800 lx
C. 200 lx
D. 500 lx
Oświetlenie na poziomie 100 lx czy 200 lx jest na pewno za słabe do pracy biurowej. Tego typu natężenia nadają się bardziej do korytarzy czy miejsc, gdzie nie ma za dużo aktywności wzrokowej. Z kolei 800 lx to już dość dużo, ale w biurze może być zbyt mocne i prowadzić do zmęczenia oczu. Jasne, że natężenie światła zależy od tego, co się robi, ale dla zwykłych biur 500 lx to zdecydowanie najlepszy wybór, bo pasuje do przepisów i zapewnia komfort.

Pytanie 26

Który z wymienionych typów danych należy do typu logicznego?

A. float
B. int
C. char
D. bool
Typ 'char' przechowuje pojedyncze znaki i nie jest typem logicznym – jest używany do reprezentacji liter, cyfr i symboli. Typ 'float' przechowuje liczby zmiennoprzecinkowe i nie ma związku z logiką warunkową. Typ 'int' przechowuje liczby całkowite, ale nie może przechowywać wartości 'true' lub 'false' w sposób natywny, choć często można go użyć jako alternatywy (np. 1 oznacza 'true', 0 oznacza 'false').

Pytanie 27

Które słowo kluczowe w C++ służy do definiowania klasy nadrzędnej?

A. virtual
B. public
C. base
D. class
Słowo kluczowe 'class' jest podstawowym elementem języka C++ i służy do deklarowania klasy. Definiuje ono strukturę zawierającą pola (zmienne) oraz metody (funkcje członkowskie), które określają zachowanie obiektu. 'Class' pozwala na enkapsulację danych, co oznacza ukrywanie implementacji wewnętrznej i udostępnianie interfejsu publicznego. Dzięki temu klasy stanowią podstawę programowania obiektowego, umożliwiając organizację kodu w logiczne jednostki. Przykładowa deklaracja klasy w C++ wygląda następująco: 'class Samochod { public: void Jedz(); private: int predkosc; };'.

Pytanie 28

Jakie środowisko deweloperskie jest najczęściej wykorzystywane do budowy aplikacji na platformę Android?

A. Android Studio
B. PyCharm
C. Visual Studio
D. XCode
Android Studio to oficjalne środowisko programistyczne (IDE) do tworzenia aplikacji na system Android. Zostało opracowane przez Google i zapewnia pełne wsparcie dla języków takich jak Java, Kotlin oraz C++. Android Studio oferuje narzędzia do projektowania interfejsu użytkownika (UI), emulatory urządzeń, a także debugger i profiler, które pozwalają na testowanie i optymalizację aplikacji. IDE to jest zintegrowane z Android SDK, co ułatwia dostęp do API systemu Android oraz narzędzi takich jak ADB (Android Debug Bridge). Android Studio to kluczowe narzędzie dla deweloperów mobilnych, umożliwiające szybkie wdrażanie aplikacji na różne urządzenia oraz publikację w Google Play Store.

Pytanie 29

Aby wykorzystać framework Django, należy pisać w języku

A. JavaScript
B. Python
C. C#
D. Java
Czasami można się pomylić, bo widząc te wszystkie języki jak Java, C# czy JavaScript, łatwo założyć, że każdy framework webowy działa podobnie i może bazować na różnych technologiach. Jednak Django to nie jest uniwersalny framework na każdą platformę czy język. C# i Java są oczywiście bardzo popularne w środowiskach enterprise, służą do tworzenia rozbudowanych aplikacji biznesowych, ale mają swoje własne frameworki, jak ASP.NET dla C# czy Spring dla Javy. Próba wykorzystania Django z C# lub Javą to jak próba włożenia okrągłego klocka do kwadratowego otworu – po prostu nie pasuje, bo Django ma zupełnie inne API i korzysta z mechanizmów charakterystycznych dla Pythona. JavaScript natomiast, choć jest niezbędny we front-endzie i pozwala budować dynamiczne interfejsy użytkownika (szczególnie przy użyciu Reacta, Angulara czy Vue), nie jest wykorzystywany do pisania logiki serwera w Django. Owszem, istnieje Node.js, który pozwala na backend w JavaScript, ale to zupełnie inna bajka. Typowym błędem myślowym jest też zakładanie, że frameworki webowe są zamienne i można je „przełączyć” między językami – praktyka pokazuje, że każdy framework jest głęboko zintegrowany z konkretnym językiem, jego bibliotekami i narzędziami. Django powstał dla Pythona i tylko w tym języku można w pełni wykorzystać jego możliwości. Uważam, że warto zagłębić się w dokumentację i zobaczyć, jak wygląda kod przykładowych aplikacji – szybko widać, że całość bazuje na Pythonie, łącznie z konfiguracją, obsługą modeli i migracjami bazy danych. W profesjonalnych projektach przestrzega się tej zasady i nie próbuje się na siłę mieszać środowisk, tylko korzysta z narzędzi zgodnych z wybranym językiem.

Pytanie 30

Jakie środki ochrony zbiorowej najlepiej chronią kręgosłup w warunkach pracy biurowej?

A. Regulowanie poziomu oświetlenia w biurze
B. Ograniczenie hałasu w pomieszczeniu
C. Umieszczanie monitorów na wysokości oczu
D. Korzystanie z regulowanych krzeseł i biurek
Używanie regulowanych foteli i biurek to jeden z najlepszych sposobów na zapobieganie problemom z kręgosłupem w pracy biurowej. Ergonomiczne fotele pozwalają na dostosowanie wysokości siedziska, podparcia lędźwiowego oraz kąta nachylenia oparcia, co zapewnia optymalne wsparcie dla kręgosłupa i zmniejsza ryzyko bólu pleców. Regulowane biurka umożliwiają zmianę pozycji pracy – z siedzącej na stojącą – co redukuje obciążenie kręgosłupa i poprawia krążenie krwi. Ergonomia stanowiska pracy to kluczowy element profilaktyki zdrowotnej, który minimalizuje ryzyko dolegliwości związanych z długotrwałą pracą w jednej pozycji.

Pytanie 31

Jakie jest główne zadanie portali społecznościowych?

A. Zarządzanie handlem produktami i usługami
B. Analiza rezultatów działalności gospodarczej
C. Tworzenie kopii zapasowych plików
D. Udostępnianie informacji i interakcja między użytkownikami
Główna funkcja portali społecznościowych polega na umożliwieniu użytkownikom tworzenia, udostępniania oraz wymiany treści, a także komunikacji w czasie rzeczywistym. Portale takie jak Facebook, Twitter czy Instagram pozwalają na interakcję poprzez posty, komentarze, polubienia oraz wiadomości prywatne. Użytkownicy mogą dzielić się zdjęciami, filmami, artykułami lub osobistymi przemyśleniami, co sprzyja budowaniu społeczności i nawiązywaniu relacji. Funkcjonalności te są zgodne z najlepszymi praktykami UX/UI, które kładą nacisk na intuicyjność i łatwość obsługi. W kontekście SEO, portale społecznościowe są także ważne ze względu na możliwość generowania ruchu na zewnętrzne strony internetowe poprzez linki i udostępnienia. Przykładem może być wykorzystanie platformy Instagram do promocji produktów, gdzie użytkownicy mogą kliknąć w linki do sklepu. Takie działania zwiększają widoczność marki w Internecie oraz angażują odbiorców, co jest kluczowe dla efektywnej strategii marketingowej.

Pytanie 32

Które z poniższych zdań najlepiej określa funkcję zaprzyjaźnioną w ramach klasy?

A. Funkcja, która ma dostęp do prywatnych pól i metod klasy, z którą jest zaprzyjaźniona
B. Funkcja, która uruchamia się automatycznie po stworzeniu obiektu
C. Funkcja, która pozwala na dziedziczenie wielokrotne
D. Funkcja, która jest statyczna i nie ma możliwości modyfikacji pól klasy
Funkcja zaprzyjaźniona (ang. friend function) to funkcja, która ma dostęp do prywatnych i chronionych pól oraz metod klasy, mimo że nie jest jej częścią. Służy do realizacji operacji wymagających bezpośredniego dostępu do wewnętrznych elementów klasy, ale bez naruszania zasad hermetyzacji. Przykład w C++: `class Konto { private: double saldo; friend void wyswietlSaldo(Konto k); }`. Funkcja `wyswietlSaldo` może odczytać pole `saldo`, mimo że jest ono prywatne. Funkcje zaprzyjaźnione są używane, gdy konieczna jest bliska współpraca między klasami lub funkcjami, ale nie chcemy nadmiernie otwierać interfejsu klasy.

Pytanie 33

Który system operacyjny jest podstawowym środowiskiem do tworzenia aplikacji mobilnych w języku Swift?

A. iOS
B. Android
C. LG UX
D. Windows UWP
Chociaż może się wydawać, że język programowania taki jak Swift da się wykorzystać na wielu różnych platformach mobilnych, to jednak jego projektowanie i rozwój były bardzo mocno związane z ekosystemem Apple. Android, choć jest największym systemem mobilnym na świecie, korzysta z innych technologii – głównie języka Java i Kotlin. Próbując pisać aplikacje mobilne na Androida w Swifcie, natrafiamy na całą masę problemów technicznych: brak oficjalnych narzędzi, wsparcia społeczności i integracji z Android SDK. Z moich obserwacji wynika, że są jakieś eksperymentalne mosty, ale to bardziej ciekawostka niż coś, co można używać w produkcji. Z kolei LG UX nie jest nawet osobnym systemem operacyjnym, tylko nakładką na Androida wykorzystywaną przez wybrane telefony LG – tu w ogóle nie ma mowy o natywnym wykorzystaniu Swifta, zresztą praktycznie nikt go tam nie używa. Jeśli chodzi o Windows UWP – ta platforma służy budowaniu uniwersalnych aplikacji na Windowsa, ale używa się tam innych technologii, głównie C#, czasami C++, czy nawet JavaScript. Swift na tej platformie to raczej egzotyczny temat i nie ma oficjalnego wsparcia. Myślę, że sporo osób myli dostępność języka (bo Swift jest open source) z możliwościami praktycznego wdrożenia. W branży przyjęło się, że wybierając środowisko do budowy aplikacji mobilnych w Swifcie, wybieramy przede wszystkim iOS, bo tylko tam mamy pełnię wsparcia, narzędzi i zgodność z wytycznymi Apple. Warto o tym pamiętać, żeby nie tracić czasu na próby wdrażania Swifta tam, gdzie po prostu nie jest to przewidziane przez producentów platform.

Pytanie 34

Która zasada zwiększa bezpieczeństwo w sieci?

A. Zaniedbywanie aktualizacji systemu operacyjnego
B. Dzielnie się hasłami z przyjaciółmi
C. Pobieranie plików z niepewnych źródeł
D. Korzystanie z mocnych, unikalnych haseł
Używanie silnych, unikalnych haseł jest fundamentalną zasadą poprawiającą bezpieczeństwo w sieci. Silne hasło to takie, które składa się z co najmniej 12 znaków, zawiera wielkie i małe litery, cyfry oraz znaki specjalne. Takie hasła są trudne do złamania przez ataki brute force, które wykorzystują algorytmy do próbowania różnych kombinacji znaków. Przykładem silnego hasła może być 'P@ssw0rd!2023', które łączy różnorodne typy znaków. Używanie unikalnych haseł dla różnych kont jest równie ważne, ponieważ w przypadku naruszenia bezpieczeństwa jednego konta, inne pozostają zabezpieczone. Standardy takie jak NIST (National Institute of Standards and Technology) zalecają tworzenie haseł w sposób, który ogranicza ich przewidywalność. Narzędzia do zarządzania hasłami, takie jak LastPass czy 1Password, mogą pomóc w generowaniu i przechowywaniu silnych haseł, co dodatkowo redukuje ryzyko. Stosowanie tej zasady jest kluczowe w kontekście ochrony danych osobowych oraz zapobiegania kradzieży tożsamości.

Pytanie 35

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

let arr = [1, 2, 3, 4, 5];
let result = arr.filter(num => num % 2 === 0);
console.log(result);
A. [1, 2, 3, 4, 5]
B. [2, 4]
C. 2,4
D. [1, 3, 5]
Wybór odpowiedzi [1, 3, 5] lub [2, 4] oraz 2,4 odzwierciedla niezrozumienie działania metody filter w JavaScript. Odpowiedź [1] sugeruje, że program wyświetli wszystkie parzyste liczby, lecz nie uwzględnia, że filter tworzy nową tablicę tylko z liczb spełniających określony warunek, a w tym przypadku tylko liczby parzyste. Ponadto, [3] wskazuje na brak zastosowania filtru, a więc pokazuje wszystkie elementy tablicy, co również jest błędne. Z kolei odpowiedź 2,4 nie jest nawet poprawnym formatem dla JavaScript, gdzie wyniki w konsoli są prezentowane w postaci tablicy z elementami oddzielonymi przecinkami. Takie podejście, aby zapisać wynik w konsoli, a nie odwoływać się do jego struktury, może prowadzić do błędnych interpretacji. Należy pamiętać, że w JavaScript, kluczowym elementem do zrozumienia jest różnica między metodą filter a innymi metodami tablic, takimi jak map czy forEach. Metoda filter zwraca nową tablicę, podczas gdy inne mogą działać na oryginalnych danych bez ich zmiany. Dlatego ważne jest, aby nie tylko znać technikę, ale i jej zastosowanie w kontekście rozwiązania problemu, co jest niezbędne w pracy programisty.

Pytanie 36

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: utworzyć katalogi hdpi, lhpi, xhpi i dodać do nich grafiki. Android: utworzyć katalogi 32x32, 64x64, 96x96 i dodać do nich grafiki
C. iOS: dodać do nazw sufiksy #2x, #3x. Android: dodać do nazw sufiks rozdzielczości: -32x32, -64x64, -96x96
D. iOS: dodać do nazw plików sufiksy @2x, @3x. Android: umieścić grafikę w odpowiednich folderach drawable: -hdpi, -xhpi, xxhdpi
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 37

W standardzie dokumentacji testów oprogramowania IEEE 829-1998 opisany jest dokument, który zawiera dane o tym, jakie przypadki testowe były wykorzystane, przez kogo i czy zakończyły się sukcesem. Co to jest?

A. Dziennik Testów
B. Raport Podsumowujący Testy
C. Plan Testów
D. Specyfikacja Procedury Testowej
Pojęcie dokumentacji testowej według IEEE 829-1998 jest bardzo precyzyjne, ale często właśnie myli się niektóre pojęcia. Plan Testów to taki ogólny, strategiczny dokument – mówi, co, kiedy i jak będziemy testować, jakie są założenia, jakie środowisko i narzędzia, ale nie przechowuje szczegółowych informacji o tym, które przypadki były faktycznie realizowane danego dnia przez daną osobę. Trochę jak plan meczu przed rozgrywką, a nie jego protokół. Z kolei Specyfikacja Procedury Testowej to szczegółowy opis kroków, jakie należy wykonać, żeby przeprowadzić dany test – taki „przepis na testowanie”, który daje testerowi konkretną instrukcję działania. Ona nie zbiera jednak danych o tym, kto wykonał, kiedy i z jakim skutkiem – raczej mówi „jak” niż „kto/co/kiedy”. Raport Podsumowujący Testy natomiast to taki końcowy dokument na podsumowanie całego cyklu testowego – zestawia wyniki, ilość znalezionych defektów, procent pokrycia, rekomendacje dotyczące dalszych działań; nie zawiera jednak szczegółowych wpisów o przebiegu pojedynczych przypadków. Typowym nieporozumieniem jest myślenie, że to właśnie raport podsumowujący będzie zawierał „wszystko”, ale on służy bardziej do ogólnego przeglądu i prezentacji wyników, a nie do śledzenia przebiegu każdego testu z osobna. Często też błędnie utożsamia się Specyfikację Procedury z rzeczywistym wykonaniem – a przecież można mieć procedurę, której wcale nie wykonano lub wykonano ją tylko częściowo. To właśnie Dziennik Testów jest tym bieżącym zapisem z pola bitwy, gdzie widać realny przebieg procesu testowego, kto się czym zajmował, czy pojawiły się jakieś nieprzewidziane sytuacje. W praktyce brak tego dziennika często prowadzi do chaosu i problemów z rozliczalnością – a przecież to klucz do profesjonalnego testowania, zgodnie z branżowymi standardami.

Pytanie 38

Wykorzystanie typu DECIMAL w MySQL wymaga wcześniejszego określenia długości (liczby cyfr) przed oraz po przecinku. Jak należy to zapisać?

A. stałoprzecinkowy
B. logiczny
C. zmiennoprzecinkowy
D. łańcuchowy
Typ DECIMAL w języku MySQL jest używany do przechowywania liczb dziesiętnych z określoną precyzją. Przy definiowaniu tego typu danych wymagane jest określenie dwóch głównych parametrów: długości całkowitej liczby, czyli liczby cyfr przed przecinkiem, oraz długości części dziesiętnej, czyli liczby cyfr po przecinku. Taki zapis ma postać DECIMAL(M, D), gdzie M to maksymalna liczba cyfr, a D to liczba cyfr po przecinku. Przykład zastosowania to: DECIMAL(10, 2), co oznacza, że liczba może mieć maksymalnie 10 cyfr, z czego 2 cyfry będą po przecinku. Typ DECIMAL jest szczególnie przydatny w aplikacjach finansowych, gdzie precyzja obliczeń jest kluczowa, aby uniknąć błędów zaokrągleń, które mogą występować w przypadku typów zmiennoprzecinkowych. Standardy dotyczące typów danych w SQL, takie jak SQL:2008, również uznają znaczenie precyzyjnych reprezentacji liczbowych, co sprawia, że DECIMAL jest preferowany w wielu zastosowaniach. Warto dodać, że MySQL pozwala na elastyczność w definiowaniu długości, co umożliwia optymalne dostosowanie do specyficznych wymagań aplikacji.

Pytanie 39

Który z wymienionych algorytmów sortowania jest najskuteczniejszy w przypadku dużych zbiorów danych w przeważającej liczbie sytuacji?

A. Sortowanie bąbelkowe
B. Sortowanie przez zliczanie
C. Sortowanie szybkie (QuickSort)
D. Sortowanie przez wstawianie
Sortowanie bąbelkowe ma złożoność O(n²), co czyni je nieefektywnym dla dużych zbiorów danych. Algorytm ten polega na wielokrotnym porównywaniu sąsiadujących elementów i zamianie ich miejscami, co jest procesem czasochłonnym przy dużych danych. Sortowanie przez zliczanie (Counting Sort) jest wydajne, ale najlepiej sprawdza się przy zbiorach o ograniczonym zakresie wartości. Sortowanie przez wstawianie działa w czasie O(n²) i jest skuteczne jedynie dla małych zbiorów danych lub tablic wstępnie posortowanych.

Pytanie 40

Co będzie wynikiem działania poniższego kodu SQL?

SELECT COUNT(*)
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
A. Błąd składni SQL
B. Liczba pracowników z pensją powyżej średniej
C. Liczba pracowników z najwyższą pensją
D. Średnia pensja wszystkich pracowników
Inne odpowiedzi sugerują mylne interpretacje funkcji i logiki zapytania SQL. Odpowiedź wskazująca na średnią pensję wszystkich pracowników nie uwzględnia faktu, że zapytanie nie zwraca wartości średniej, lecz liczbę pracowników, którzy zarabiają powyżej tej wartości. Odpowiedź odnosząca się do liczby pracowników z najwyższą pensją również jest niepoprawna, ponieważ w zapytaniu nie ma żadnych odniesień do konkretnego wynagrodzenia, a jedynie do wartości średniej. Ponadto, stwierdzenie, że zapytanie generuje błąd składni SQL, jest błędne, ponieważ składnia jest poprawna i zgodna z standardami SQL. Kluczową kwestią jest zrozumienie, że zapytania SQL mogą wykorzystywać zagnieżdżone zapytania do dynamicznego obliczania wartości w kontekście zbioru danych. Często popełnianym błędem jest mylenie funkcji agregujących z prostymi operacjami na kolumnach. Warto więc zaznajomić się z różnymi typami zapytań oraz ich zastosowaniem w praktyce, aby zwiększyć efektywność analizy danych. Zrozumienie logiki działania zagnieżdżonych zapytań oraz funkcji agregujących jest kluczowe dla skutecznej pracy z bazami danych.