DATA
CZAS
IMIENINY
FAZA KSIĘŻYCA
STAFLOTA ⊕ SEKTOR ALFA · BITEDU STATION
📦 Pakiet startowy · INF.03 → INF.04

10 rzeczy które musisz umieć zanim zaczniesz

INF.04 zakłada, że masz już za sobą INF.03. Poniższe tematy to fundament – jeśli któregoś nie czujesz, odśwież go zanim wejdziesz głębiej w OOP i aplikacje. Egzamin pisemny INF.04 pyta z tego regularnie.

Rozwiń temat → przejrzyj kluczowe punkty → jeśli wszystko znasz, idź dalej.

S·01 🔢 Systemy liczbowe i operacje bitowe
Przeliczanie między systemami
  • Binarny → dziesiętny: każda pozycja to potęga 2 od prawej (1, 2, 4, 8, 16, 32, 64, 128). Przykład: 1010₂ = 8+0+2+0 = 10. Dziesiętny → binarny: dziel przez 2 i czytaj reszty od dołu.
  • Szesnastkowy (HEX): cyfry 0–9 i A–F (A=10 … F=15). Jeden bajt = dwie cyfry HEX. 255₁₀ = FF₁₆, 16₁₀ = 10₁₆. Używany w kolorach CSS, adresach MAC, debuggerze.
  • Ósemkowy: cyfry 0–7. 17₈ = 1×8+7 = 15₁₀. W praktyce spotkasz go przy uprawnieniach Linuksa (chmod 755).
  • Binarny ↔ HEX na skróty: każde 4 bity = jedna cyfra HEX. 1010 1111₂ → AF₁₆. To najszybszy sposób na przeliczenie.
Kod uzupełnieniowy U2 (liczby ujemne)
  • Komputery przechowują liczby ujemne w kodzie U2. Zakres na 8 bitach: -128 do 127.
  • Jak zapisać -5 na 8 bitach: (1) zapisz 5: 00000101, (2) zaneguj bity: 11111010, (3) dodaj 1: 11111011. To jest -5 w U2.
  • Liczba ujemna w U2 ma zawsze 1 na najstarszej pozycji (bit znaku).
Operacje bitowe
  • AND (&) – oba bity muszą być 1: 1&1=1, 1&0=0, 0&0=0. Użycie: maskowanie bitów.
  • OR (|) – chociaż jeden bit = 1: 1|0=1, 0|0=0. Użycie: ustawianie flag.
  • XOR (^) – dokładnie jeden bit = 1: 1^1=0, 1^0=1. Użycie: proste szyfrowanie, sprawdzanie parzystości.
  • NOT (~) – negacja wszystkich bitów: ~00001111 = 11110000.
  • Przesunięcia: x << 1 = mnożenie przez 2, x >> 1 = dzielenie przez 2 (całkowite).
Liczby na egzaminie: 255₁₀ = FF₁₆ = 11111111₂. 128₁₀ = 80₁₆. Jeden bajt = 8 bitów. 1 KiB = 1024 bajty = 2¹⁰.
S·02 📐 Typy danych w C# i kiedy który wybrać
Typy liczbowe
TypRozmiarZakres / opisKiedy używać
int4 B–2 147 483 648 do 2 147 483 647Domyślny wybór dla liczb całkowitych
long8 Bok. ±9,2 × 10¹⁸Gdy int za mały (duże ID, czas Unix)
double8 Bok. 15–17 cyfr znaczącychObliczenia naukowe, fizyka, geometria
float4 Bok. 6–9 cyfr znaczącychGrafika 3D, gdy liczy się pamięć
decimal16 B28–29 cyfr znaczących; ogranicza typowe błędy reprezentacji dziesiętnej, ale nadal ma skończoną precyzjęPieniądze, finanse, podatki
byte1 B0–255Bajty, kolory RGB, dane binarne
Typy tekstowe i logiczne
  • string – ciąg znaków Unicode, typ referencyjny. Niezmienialny (immutable) – każda operacja zwraca nowy obiekt. Literał: "tekst". Interpolacja: $"Wynik: {x}".
  • char – jedna 16-bitowa jednostka kodowa UTF-16. Wiele popularnych znaków mieści się w jednym char, ale część znaków Unicode, np. niektóre emoji, wymaga pary znaków. Literał zapisujesz w apostrofach.
  • bool – true lub false. Jedyne dwie wartości. Nie ma „1 = true” jak w C – musisz pisać jawnie.
Typ wartościowy vs referencyjny
  • Wartościowe (int, double, bool, char, struct, enum) – zmienna przechowuje wartość bezpośrednio, a przypisanie domyślnie kopiuje wartość. int a = 5; int b = a; b = 10; → a nadal = 5.
  • Referencyjne (string, class, array, object) – zmienna przechowuje referencję do obiektu, a przypisanie kopiuje referencję. Dwie zmienne mogą wskazywać ten sam obiekt. Miejsce przechowywania zależy od kontekstu i nie jest definicją rodzaju typu.
Klasyczna pułapka: 0.1 + 0.2 != 0.3 przy double (błąd reprezentacji binarnej). Do typowych obliczeń finansowych wybieraj decimal i jawnie ustalaj zasady zaokrąglania.
S·03 🔄 Konwersje typów i parsowanie danych
Tekst → liczba
  • int.Parse("42") – konwertuje string na int. Rzuca FormatException gdy string nie jest liczbą. Używaj gdy jesteś pewny danych.
  • int.TryParse("42", out int wynik) – bezpieczna wersja. Zwraca true/false, nie rzuca wyjątku. Używaj przy danych od użytkownika – zawsze.
  • double.Parse("3,14") – uwaga na separatory! W Polsce „,”, w internecie „.”. Użyj CultureInfo.InvariantCulture dla kropki.
  • Convert.ToInt32() – toleruje null (zwraca 0), obsługuje bool i inne typy. Wolniejszy od Parse.
Liczba → tekst i rzutowanie
  • liczba.ToString() – każdy typ ma tę metodę. Formaty: .ToString("F2") (2 miejsca po przecinku), .ToString("C") (waluta), .ToString("X") (HEX).
  • Rzutowanie jawne: (int)3.7 → 3 (obcięcie, nie zaokrąglenie). (double)5 → 5.0.
  • Rzutowanie niejawne: double x = 5; działa automatycznie (int → double jest bezpieczne). Odwrotnie nie – musisz rzutować jawnie.
  • Math.Round(3.5) → 4. Math.Floor(3.9) → 3. Math.Ceiling(3.1) → 4.
Schemat egzaminacyjny: użytkownik wpisuje tekst do TextBox → int.TryParse(textBox.Text, out int wartosc) → sprawdź czy true → użyj wartości. To jest wzorzec który pojawi się w każdej aplikacji okienkowej.
S·04 🔁 Pętle, warunki i sterowanie przepływem
Pętle
  • for – gdy wiesz ile razy: for (int i = 0; i < 10; i++). Indeks od 0, warunek: i < n (nie i <= n-1). Najczęstsza pętla w algorytmach.
  • foreach – gdy iterujesz po kolekcji: foreach (var elem in lista). Czytelniejsza niż for, ale nie daje dostępu do indeksu i nie możesz modyfikować kolekcji podczas iteracji.
  • while – gdy warunek sprawdzasz przed: while (warunek) { }. Może nie wykonać się ani razu.
  • do-while – gdy chcesz wykonać przynajmniej raz: do { } while (warunek);. Rzadki, ale przydatny przy walidacji w pętli.
  • break – wychodzi z pętli natychmiast. continue – pomija resztę bieżącej iteracji i idzie do następnej.
Warunki i switch
  • if / else if / else – standard. Warunki z operatorami: && (i), || (lub), ! (nie). Priorytet: ! przed && przed ||.
  • Operator trójargumentowy: string wynik = x > 0 ? "dodatnia" : "ujemna";. Zwięzłe zastąpienie prostego if-else.
  • switch – porównanie jednej zmiennej z wieloma przypadkami. Każdy case potrzebuje break (lub return). default = else.
  • switch expression (C# 8+): string opis = dzien switch { 1 => "Pon", 2 => "Wt", _ => "Inny" };. Zwięźlejsze, bez break.
Klasyczny błąd: for (int i = 0; i <= tab.Length; i++)IndexOutOfRangeException! Warunek to i < tab.Length (mniejszy, nie mniejszy-lub-równy).
S·05 ⚙️ Metody, parametry i organizacja kodu
Budowa metody
  • Deklaracja metody: modyfikator typ_zwracany NazwaMetody(typ param1, typ param2). Przykład: private double ObliczSrednia(int[] oceny). Sygnatura metody służąca do rozróżniania przeciążeń obejmuje przede wszystkim nazwę oraz liczbę, typy i kolejność parametrów, a nie typ zwracany.
  • void – metoda nic nie zwraca. return – zwraca wartość i kończy metodę. W void możesz użyć return; bez wartości żeby wyjść wcześniej.
  • Zasada: jedna metoda = jedno zadanie. Nazwa metody to czasownik: ObliczSume(), PobierzDane(), ZapiszDoPliku().
  • Parametry domyślne: void Pozdrow(string imie = "Gość") – można wywołać bez argumentu.
Przekazywanie parametrów
  • Przez wartość (domyślnie): metoda dostaje kopię wartości zmiennej. Dla typu referencyjnego kopiowana jest referencja, dlatego metoda może zmienić stan wskazywanego obiektu, ale nie może podmienić zmiennej wywołującego bez ref.
  • ref – przekazujesz referencję do zmiennej. Metoda może zmienić oryginał. Zmienna musi być wcześniej zainicjalizowana.
  • out – jak ref, ale zmienna nie musi być wcześniej zainicjalizowana. Metoda musi przypisać wartość przed wyjściem. Używane właśnie w TryParse.
  • params – dowolna liczba argumentów: void Dodaj(params int[] liczby). Wywołanie: Dodaj(1, 2, 3, 4).
Przeciążanie (overloading)
  • Ta sama nazwa metody, różne parametry. Powitaj(string imie) i Powitaj(string imie, int wiek) – obie mogą istnieć obok siebie.
  • Kompilator wybiera wersję na podstawie typów i liczby argumentów przy wywołaniu.
Dla egzaminu: przenieś logikę obliczeń do osobnej metody (lub klasy). Code-behind formy/okna ma tylko pobierać dane z kontrolek, wywołać metodę i pokazać wynik. To jest właśnie „oddzielenie logiki od UI”.
S·06 📦 Tablice i kolekcje (List, Dictionary)
Tablice
  • Deklaracja i inicjalizacja: int[] oceny = new int[5]; lub int[] oceny = {5, 4, 3, 4, 5};.
  • Indeksowanie od 0. Ostatni element: tab[tab.Length - 1].
  • Array.Sort(tab) – sortuje w miejscu rosnąco. Array.Reverse(tab) – odwraca. Array.IndexOf(tab, wartosc) – szuka elementu.
  • Tablica ma stały rozmiar po utworzeniu. Nie możesz dodać nowego elementu – do tego służy List.
List<T>
  • Tworzenie: List<string> imiona = new List<string>();
  • lista.Add("Anna") – dodaj na końcu. lista.Insert(0, "Jan") – wstaw na pozycji.
  • lista.Remove("Anna") – usuń pierwsze wystąpienie. lista.RemoveAt(2) – usuń po indeksie.
  • lista.Count – liczba elementów (nie Length!). lista.Contains("Anna") – czy istnieje.
  • lista.Sort() – sortuje. lista.Clear() – czyści całą listę.
Dictionary<TKey, TValue>
  • Tworzenie: Dictionary<string, int> wyniki = new();
  • wyniki["Jan"] = 95; – dodaj lub zaktualizuj. wyniki.ContainsKey("Jan") – sprawdź czy klucz istnieje zanim odczytasz.
  • Iteracja: foreach (var para in wyniki) { para.Key; para.Value; }
  • Klucze muszą być unikalne. Metoda Add() rzuca wyjątek przy duplikacie, natomiast zapis slownik[klucz] = wartosc dodaje nowy wpis albo aktualizuje istniejący.
Pamiętaj: tablice mają .Length, listy mają .Count. Mały szczegół który potrafi pogrążyć w stresie egzaminacyjnym.
S·07 💾 Obsługa plików tekstowych i JSON
Pliki tekstowe – szybkie metody
  • Odczyt całego pliku jako string: string tekst = File.ReadAllText("plik.txt");
  • Odczyt jako tablica wierszy: string[] wiersze = File.ReadAllLines("plik.txt"); – każdy wiersz = jeden element tablicy. Najczęstszy wzorzec w zadaniach.
  • Zapis (nadpisanie): File.WriteAllText("plik.txt", tekst); lub File.WriteAllLines("plik.txt", tablicaWierszy);
  • Dopisywanie: File.AppendAllText("plik.txt", nowyTekst); – nie kasuje starej zawartości.
  • Sprawdzenie czy istnieje: if (File.Exists("plik.txt")) może poprawić komunikat dla użytkownika, ale plik może zniknąć chwilę później. Operację odczytu nadal obejmij właściwą obsługą wyjątków.
StreamReader / StreamWriter – gdy plik jest duży
  • using (StreamReader sr = new StreamReader("plik.txt")) { string wiersz = sr.ReadLine(); } – czyta linia po linii, nie ładuje całości do pamięci.
  • using (StreamWriter sw = new StreamWriter("plik.txt", append: true)) { sw.WriteLine("nowy wpis"); }
  • Blok using automatycznie zwalnia zasób po wyjściu z bloku, także przy obsługiwanym wyjątku. Stosuj go dla obiektów implementujących IDisposable.
JSON podstawy
  • Serializacja (obiekt → JSON string): string json = JsonSerializer.Serialize(obiekt);
  • Deserializacja (JSON string → obiekt): Produkt p = JsonSerializer.Deserialize<Produkt>(json);
  • Zapis do pliku: File.WriteAllText("dane.json", json);. Odczyt: string json = File.ReadAllText("dane.json");
  • Namespace: using System.Text.Json; (wbudowany od .NET Core 3). Alternatywnie Newtonsoft.Json (NuGet).
Wzorzec egzaminacyjny: załaduj dane z pliku przy starcie → edytuj w liście w pamięci → zapisz z powrotem do pliku przy zamknięciu lub po kliknięciu Zapisz. Plik = proste bazodanowe zastąpienie gdy nie ma SQLite.
S·08 ⚠️ Obsługa wyjątków (try-catch-finally)
Struktura try-catch
  • try – kod który może rzucić wyjątek. catch – obsługujesz wyjątek. finally – wykonuje się przy normalnym wyjściu oraz podczas propagacji obsługiwanego wyjątku; służy do sprzątania zasobów. W nowym kodzie często zastępuje go using.
  • Możesz mieć wiele bloków catch dla różnych typów wyjątków. Kompilator sprawdza je od góry – bardziej szczegółowe klasy wyżej, Exception (najogólniejszy) na końcu.
  • catch (Exception ex) { Console.WriteLine(ex.Message); } – właściwość Message zawiera opis błędu po ludzku.
Typowe wyjątki na egzaminie
WyjątekKiedy powstajeJak zapobiec
NullReferenceExceptionWywołanie metody na nullSprawdź if (obj != null) lub użyj ?.
FormatExceptionint.Parse(„abc”)Użyj TryParse zamiast Parse
IndexOutOfRangeExceptiontab[tab.Length]Warunek i < tab.Length, nie <=
DivideByZeroExceptionx / 0 (dla int)Sprawdź mianownik przed dzieleniem
FileNotFoundExceptionFile.ReadAllText(„brak.txt”)File.Exists() przed odczytem
StackOverflowExceptionRekurencja bez warunku stopuZawsze definiuj base case
Rzucanie własnych wyjątków
  • throw new ArgumentException("Wartość musi być dodatnia"); – rzucasz wyjątek gdy dane wejściowe są nieprawidłowe.
  • throw; (bez argumentu w bloku catch) – ponownie rzuca ten sam wyjątek bez straty stosu wywołań.
Zasada: łap wyjątek tylko tam gdzie możesz coś sensownego z nim zrobić (np. pokazać komunikat użytkownikowi lub zapisać log). Puste bloki catch ukrywają błędy i utrudniają debugowanie.
S·09 🗄️ Podstawy SQL – niezbędne do baz w aplikacjach

SQL piszesz w INF.03, ale w INF.04 będziesz go wywoływał z C# (przez ADO.NET lub Entity Framework). Musisz rozumieć zapytania żeby wiedzieć co Twój kod robi z bazą.

Podstawowe komendy
  • SELECT kolumna1, kolumna2 FROM tabela WHERE warunek ORDER BY kolumna ASC; – odczyt danych. SELECT * = wszystkie kolumny (unikaj w produkcji).
  • INSERT INTO tabela (kol1, kol2) VALUES ('wartość1', 42); – dodanie rekordu.
  • UPDATE tabela SET kol1 = 'nowa' WHERE id = 5; – bez WHERE aktualizujesz WSZYSTKIE rekordy!
  • DELETE FROM tabela WHERE id = 5; – bez WHERE kasujesz WSZYSTKIE rekordy! Zawsze sprawdzaj WHERE.
JOIN i relacje
  • INNER JOIN – zwraca tylko wiersze które mają dopasowanie w obu tabelach. Najczęściej używany.
  • LEFT JOIN – zwraca wszystkie wiersze z lewej tabeli, z prawej tylko dopasowane (reszta = NULL).
  • Przykład: SELECT z.imie, p.tytul FROM zamowienia z INNER JOIN produkty p ON z.produkt_id = p.id;
  • Klucz główny (PRIMARY KEY) – unikalny identyfikator rekordu. Klucz obcy (FOREIGN KEY) – referencja do PK innej tabeli.
SQL w C# – wzorzec ADO.NET
  • Zawsze używaj parametryzowanych zapytań: command.Parameters.AddWithValue("@imie", imie); – nigdy nie sklejaj SQL ze stringiem (SQL Injection!).
  • Kolejność: otwórz połączenie → wykonaj zapytanie → odczytaj wynik → zamknij połączenie (blok using zamknie automatycznie).
  • Alternatywa: Entity Framework Core – zamiast SQL piszesz LINQ w C#, ORM generuje SQL za Ciebie.
Pamiętaj: UPDATE i DELETE bez WHERE to jedna z najczęstszych przyczyn utraty danych. Zawsze myśl dwa razy zanim wykonasz takie zapytanie – szczególnie na bazie produkcyjnej.
S·10 🌐 HTML i CSS – brama do aplikacji webowych

Bez solidnych podstaw HTML/CSS nie zrozumiesz jak działa Angular, React ani Bootstrap. To też fundament egzaminu pisemnego w zakresie aplikacji webowych.

Kluczowe znaczniki HTML
  • Semantyczne: <header>, <nav>, <main>, <section>, <article>, <footer> – opisują znaczenie treści, nie tylko wygląd. Ważne dla SEO i dostępności.
  • Formularze: <form action="/wyslij" method="POST">. W środku: <input type="text" name="imie">, <select>, <textarea>, <button type="submit">. Atrybut name to klucz który trafia do serwera.
  • GET vs POST: GET służy semantycznie do pobierania zasobu i powinien być bezpieczny, czyli nie powodować zamierzonej zmiany stanu. POST przesyła dane do przetworzenia i często powoduje zmianę stanu. Dane w body nie są tajne ani zaszyfrowane; poufność transmisji zapewnia HTTPS. Formularz logowania wysyłaj metodą POST przez HTTPS.
CSS – selektory i box model
  • Selektory: p (element), .klasa (klasa), #identyfikator (id), div > p (bezpośredni potomek), a:hover (pseudo-klasa).
  • Specyficzność: id > klasa/pseudoklasa > element. O wyniku decydują także pochodzenie stylu, warstwy kaskady, kolejność oraz znacznik !important. Unikaj nadużywania !important.
  • Box model: każdy element to pudełko: content + padding (wewnętrz) + border (ramka) + margin (zewnętrz). box-sizing: border-box sprawia że padding i border są wliczone w zadeklarowaną szerokość – używaj zawsze.
  • Flexbox: display: flex na rodzicu. justify-content wyrównuje wzdłuż osi głównej, a align-items wzdłuż osi poprzecznej. Kierunek osi głównej zmienia flex-direction.
  • Jednostki: px (piksele CSS), % (wartość zależna od właściwości i elementu odniesienia), rem (względem rozmiaru czcionki elementu głównego), vw/vh (procent wymiaru viewportu).
Responsywność (RWD)
  • @media (max-width: 768px) { nav { display: none; } } – inne style dla małych ekranów.
  • Mobile first: styluj najpierw dla telefonu, potem nadpisuj dla większych ekranów (min-width). To lepsza praktyka niż desktop-first.
  • <meta name="viewport" content="width=device-width, initial-scale=1"> – ustawia prawidłową szerokość viewportu na urządzeniach mobilnych; bez niego responsywny układ może być wyświetlany w nieodpowiedniej skali.
Połączenie z Angularem/Reactem: w komponentach piszesz HTML (lub JSX) i CSS tak samo jak tutaj. Frameworki dodają dynamikę (dane, pętle, zdarzenia), ale fundament to nadal HTML+CSS. Jeśli tu masz luki – wróć do bitedu.pl/wapps zanim zaczniesz Angular.
INF.04 · Projektowanie, programowanie i testowanie aplikacji

Projektowanie, programowanie i testowanie aplikacji

Najważniejsze zagadnienia do egzaminu INF.04

Uporządkowane bloki powtórkowe oparte na wymaganiach kwalifikacji INF.04. Rozwiń dział, przeczytaj teorię, przejdź do praktyki, a potem sprawdź się w teście.

280 pytań testowych teoria + praktyka egzamin INF.04
Jak korzystać ze strony: działy porządkują materiał do powtórki, ale nie zastępują aktualnego informatora ani konkretnego arkusza egzaminacyjnego. W sekcjach „Przejdź do praktyki” znajdziesz powiązane ćwiczenia i projekty.
00 🧭 Podstawy informatyki, sieci, dostępność i normy
Sprzęt i architektura komputera
ElementRola i ważne parametry
CPUWykonuje instrukcje programu. Ważne są m.in. architektura, liczba rdzeni i wątków, taktowanie, pamięć cache oraz pobór energii.
RAMSzybka pamięć robocza używana przez działające programy. Po wyłączeniu zasilania jej zawartość znika.
SSD / HDDPamięć trwała. SSD ma znacznie krótszy czas dostępu; znaczenie mają pojemność, interfejs i szybkość odczytu/zapisu.
GPUWykonuje obliczenia równoległe związane z grafiką, multimediami oraz częścią obliczeń naukowych i AI.
System operacyjnyZarządza procesami, pamięcią, plikami, urządzeniami i uprawnieniami oraz udostępnia aplikacjom usługi systemowe.
Architektura klient–serwer: klient wysyła żądanie, serwer je przetwarza i zwraca odpowiedź. W systemie wielowarstwowym osobno występują zwykle interfejs, logika biznesowa i warstwa danych.
Sieci i protokoły
PojęcieZnaczenie
Adres IPIdentyfikuje interfejs urządzenia w sieci IP. IPv4 ma 32 bity, IPv6 ma 128 bitów.
Maska / prefiksOkreśla część sieciową adresu, np. 192.168.1.0/24.
DNSTłumaczy nazwy domenowe na adresy IP.
TCPZapewnia połączeniowy, uporządkowany i niezawodny strumień danych.
UDPPrzesyła datagramy bez gwarancji dostarczenia; ma mały narzut i sprawdza się m.in. w transmisji czasu rzeczywistego.
HTTP / HTTPSProtokoły komunikacji aplikacji webowych; HTTPS chroni transmisję za pomocą TLS.
Przepustowość i opóźnieniePrzepustowość określa ilość danych na jednostkę czasu, a opóźnienie czas potrzebny na przesłanie informacji.
System informacyjny i bezpieczeństwo informacji
  • System informacyjny – ludzie, procedury, dane i narzędzia służące gromadzeniu, przetwarzaniu i udostępnianiu informacji.
  • Poufność, integralność, dostępność – podstawowe cele ochrony informacji: dostęp dla uprawnionych, brak nieautoryzowanych zmian oraz dostępność wtedy, gdy jest potrzebna.
  • Kopia zapasowa – oddzielna kopia danych umożliwiająca odtworzenie po awarii; strategia 3-2-1 oznacza 3 kopie, 2 różne nośniki i 1 kopię poza główną lokalizacją.
  • Prywatność i dane osobowe – przetwarzaj tylko dane potrzebne do celu, ograniczaj dostęp i zabezpieczaj okres przechowywania.
Dostępność WCAG
ZasadaPrzykład realizacji
PostrzegalnośćAlternatywny tekst obrazów, napisy do materiałów, odpowiedni kontrast i czytelna struktura nagłówków.
FunkcjonalnośćPełna obsługa klawiaturą, widoczny fokus, brak pułapek klawiaturowych i wystarczający czas na działanie.
ZrozumiałośćJasne etykiety formularzy, przewidywalna nawigacja i komunikaty błędów wskazujące sposób poprawy.
SolidnośćPoprawny semantyczny HTML i zgodność z technologiami asystującymi.
Normy, licencje i legalność oprogramowania
  • Norma – uzgodniony dokument opisujący zasady, wymagania lub dobre praktyki. Norma nie zawsze jest obowiązkowym przepisem prawa, ale może zostać wskazana w umowie lub regulacji.
  • Licencja – określa zasady korzystania, modyfikowania i rozpowszechniania programu. Przykłady: licencje własnościowe, MIT, Apache-2.0, GPL.
  • Prawo autorskie – kod, grafiki, teksty i inne utwory są chronione. Korzystaj z materiałów zgodnie z licencją i podawaj wymagane informacje o autorze.
  • Ocena zgodności – sprawdzenie, czy produkt, proces lub usługa spełnia określone wymagania, normy albo specyfikację.
01 🛡️ BHP i ergonomia stanowiska komputerowego
Ergonomia stanowiska – konkretne liczby

Ergonomia to nauka o dostosowaniu warunków pracy do człowieka, żeby nie niszczyć zdrowia. Wyobraź sobie, że siedzisz 8 godzin dziennie – jeśli coś jest ustawione źle, po kilku latach masz problem z kręgosłupem, nadgarstkami albo wzrokiem. Te liczby są na egzaminie, naucz się ich na pamięć.

  • Monitor – odległość dobierasz do wielkości ekranu, czytelności i wzroku użytkownika; w materiałach szkolnych często przyjmuje się około 40–75 cm. Górna krawędź ekranu powinna znajdować się na poziomie oczu lub nieco poniżej. Monitor najlepiej ustawić bokiem do okna, aby ograniczyć olśnienie i odbicia.
  • Oświetlenie – dla typowej pracy biurowej często przyjmuje się 500 luksów jako wartość normową. Wymagane natężenie zależy jednak od rodzaju zadania i stanowiska. Źródło światła powinno ograniczać olśnienie i odbicia na ekranie.
  • Krzesło – regulujesz je tak, żeby stopy leżały płasko na podłodze, uda były równoległe do ziemi, a kąt w kolanach wynosił ok. 90°. Krzesło musi mieć podparcie lędźwiowe (dla dolnej części pleców) i podłokietniki. Jeśli stopy nie sięgają podłogi – używasz podnóżka.
  • Nadgarstki – przy pisaniu na klawiaturze nadgarstki powinny być w linii prostej z przedramieniem, nie zgięte w górę ani w dół. Dlatego używa się podkładek pod nadgarstki i regulowanych biurek.
  • Przerwy – co godzinę pracy przy monitorze masz prawo do co najmniej 5-minutowej przerwy (Rozporządzenie MPiPS w sprawie bezpieczeństwa i higieny pracy na stanowiskach wyposażonych w monitory ekranowe). Stosuj zasadę 20-20-20: co 20 minut, przez 20 sekund, patrz na obiekt odległy o 20 stóp (ok. 6 m). To rozluźnia mięśnie oka.
  • Hałas – przy pracy wymagającej koncentracji należy ograniczać hałas. Wartość około 55 dB bywa stosowana jako punkt odniesienia dla części pomieszczeń biurowych, ale dopuszczalny poziom zależy od charakteru pracy i właściwych norm.
  • Temperatura – minimum 18°C w pomieszczeniu przy lekkich pracach biurowych. Optymalna dla pracy umysłowej: 20–22°C.
Kategorie zagrożeń na stanowisku pracy

Na egzaminie bardzo często pojawia się pytanie o to, do jakiej kategorii należy dane zagrożenie. Zapamiętaj cztery kategorie:

KategoriaPrzykłady
FizyczneHałas, drgania (wibracje), temperatura (za wysoka lub za niska), promieniowanie (podczerwone, UV, elektromagnetyczne), oświetlenie
ChemiczneSubstancje toksyczne, żrące, drażniące (np. tusze drukarek, środki czyszczące)
BiologiczneBakterie, wirusy, grzyby (np. pleśń w klimatyzacji)
PsychofizyczneStres, monotonia pracy, praca w wymuszonych pozycjach ciała, praca nierytmiczna, presja czasu, wypalenie zawodowe
Pułapka egzaminacyjna: „Wymuszona pozycja ciała” to zagrożenie psychofizyczne, nie fizyczne! Praca przy klawiaturze przez 8 godzin w jednej pozycji to właśnie ta kategoria. Podobnie monotonia pracy i stres – psychofizyczne, nie fizyczne.
Dolegliwości i zagrożenia zdrowotne
  • Zespół cieśni kanału nadgarstka (angielska nazwa: Carpal Tunnel Syndrome) – najczęstsze schorzenie programistów. Objawia się bólem, drętwieniem i zaburzeniami czucia w 1., 2. i 3. palcu ręki (kciuk, wskazujący, środkowy). Pojawia się przez długotrwałe, powtarzalne ruchy przy klawiaturze i myszy. Profilaktyka: przerwy, ćwiczenia nadgarstków, ergonomiczna klawiatura, mysz pionowa.
  • Asthenopia (zmęczenie wzroku) – ból oczu, łzawienie, pieczenie, bóle głowy, niewyraźne widzenie. Efekt długiego wpatrywania się w ekran. Leczenie: przerwy, reguła 20-20-20, ustawienie monitora (kontrast, jasność, odległość).
  • Bóle kręgosłupa – efekt wymuszonej pozycji ciała. Szczególnie odcinek szyjny (od monitora na złej wysokości) i lędźwiowy (brak podparcia krzesła). Profilaktyka: regulowane krzesło, aktywne przerwy.
  • RSI (Repetitive Strain Injury) – ogólna nazwa urazów z przeciążenia wynikających z monotonicznych, powtarzalnych ruchów. Zespół cieśni to jeden z rodzajów RSI.
  • Wypalenie zawodowe i stres – zaliczane do zagrożeń psychofizycznych. Nie jest to hałas ani promieniowanie – to osobna kategoria.
Obowiązki pracodawcy i pracownika
  • Pracodawca musi: przeprowadzić szkolenie BHP przed dopuszczeniem do pracy, zapewnić badania lekarskie (i zapłacić za nie – koszty ponosi pracodawca!), utrzymać właściwą temperaturę, zapewnić środki ochrony osobistej, informować o zagrożeniach.
  • Pracownik musi: przestrzegać przepisów BHP, używać przydzielonych środków ochrony, powiadamiać o zagrożeniach, uczestniczyć w szkoleniach BHP.
  • PIP (Państwowa Inspekcja Pracy) – organ kontrolny, który nadzoruje przestrzeganie prawa pracy i BHP. Może przeprowadzać kontrole bez zapowiedzi.
Szkolenia i badania lekarskie
  • Szkolenie wstępne BHP – obowiązkowe przed dopuszczeniem do pracy. Składa się z dwóch części: instruktaż ogólny (przeprowadza dział BHP lub pracodawca) i instruktaż stanowiskowy (przeprowadza bezpośredni przełożony, dotyczy konkretnego stanowiska).
  • Szkolenia okresowe – ich częstotliwość zależy od rodzaju stanowiska i obowiązujących przepisów. Dla pracowników administracyjno-biurowych szkolenie okresowe przeprowadza się nie rzadziej niż raz na 6 lat, przy czym w określonych prawem przypadkach mogą być z niego zwolnieni. Stanowiska szczególnie niebezpieczne wymagają szkoleń częściej.
  • Badania lekarskie wstępne – przed zatrudnieniem lub przejściem na nowe stanowisko. Pracownik płaci? NIE – koszty zawsze ponosi pracodawca.
  • Badania okresowe – wykonywane regularnie w trakcie trwania stosunku pracy. Częstotliwość zależy od stanowiska i oceny ryzyka.
  • Badania kontrolne – po chorobie trwającej powyżej 30 dni. Zanim wrócisz do pracy, musisz się zbadać.
  • Badania wykonuje lekarz medycyny pracy (nie lekarz rodzinny ani jakikolwiek inny specjalista – to ważne na egzaminie).
Wypadek przy pracy – definicja i procedura
  • Definicja wypadku przy pracy: nagłe zdarzenie, wywołane przyczyną zewnętrzną, pozostające w związku z pracą oraz powodujące uraz lub śmierć pracownika. Wszystkie cztery cechy muszą wystąpić razem.
  • Wypadek w drodze do lub z pracy – też jest prawnie chroniony, ale to osobna kategoria (nie „przy pracy”).
  • Co robić po wypadku: zabezpiecz miejsce wypadku (nikt nie powinien ruszać niczego), wezwij pomoc medyczną (112), powiadom bezpośredniego przełożonego.
  • Zespół powypadkowy – bada okoliczności i przyczyny wypadku. Składa się z co najmniej 2 osób: pracownika służby BHP + zakładowego społecznego inspektora pracy (lub innego pracownika zaznajomionego z przepisami BHP).
  • Koszty badania wypadku ponosi pracodawca (nie ZUS, nie PIP, nie pracownik – pracodawca!).
Elektryczność – ochrona przed porażeniem
  • Ochrona podstawowa (przed dotykiem bezpośrednim) – zabezpieczasz się przed dotknięciem przewodów pod napięciem. Sposoby: izolacja części czynnych (okrywasz przewód izolacją), osłony i obudowy, bariery ochronne.
  • Ochrona dodatkowa (przed dotykiem pośrednim) – chroni gdy izolacja jest uszkodzona. Sposoby: samoczynne wyłączenie zasilania (bezpieczniki, wyłączniki różnicowoprądowe RCD), uziemienie ochronne.
  • Wyłącznik różnicowoprądowy (RCD) – wykrywa upływ prądu i natychmiast wyłącza zasilanie. To jest ochrona dodatkowa.
  • Co robić gdy sprzęt się zapalił: zaalarmuj otoczenie, wezwij pomoc i, jeżeli jest to bezpieczne, odłącz zasilanie. Do elektroniki preferowana jest gaśnica CO₂. Zawsze sprawdź oznaczenia gaśnicy i dopuszczalne napięcie; nie kieruj wody na urządzenie pozostające pod napięciem.
Gaśnice – który typ do czego
Typ gaśnicyDo czego służyElektryka?
CO₂ (śniegowa)Urządzenia elektryczne, serwery, sprzęt komputerowy✅ TAK – podstawowy wybór w serwerowni
Proszkowa (ABC)Materiały stałe, ciecze, gazy, urządzenia elektryczne✅ TAK – uniwersalna
PianowaMateriały stałe, ciecze palneTylko jeśli oznaczenie producenta dopuszcza gaszenie urządzeń pod określonym napięciem i z wymaganej odległości
WodnaMateriały stałe (drewno, papier, tkaniny)Nie stosuj na urządzenie pozostające pod napięciem, chyba że konkretna gaśnica ma wyraźne dopuszczenie producenta
Pierwsza pomoc przy porażeniu prądem

To jest bardzo popularne zagadnienie na egzaminie. Pamiętaj o kolejności działań – najczęstszy błąd to dotknięcie poszkodowanego zanim odłączysz go od prądu.

  • Krok 1 – Zadbaj o własne bezpieczeństwo. Nie dotykaj poszkodowanego gołymi rękami jeśli wciąż jest pod napięciem – sam dostaniesz porażenie!
  • Krok 2 – Odłącz zasilanie lub odsuń poszkodowanego od źródła prądu za pomocą bezpiecznego, suchego przedmiotu izolacyjnego. Możesz wyciągnąć wtyczkę z gniazdka lub wyłączyć zabezpieczenie w rozdzielnicy. Nie podejmuj działania, jeśli naraża Cię ono na porażenie.
  • Krok 3 – Oceń stan poszkodowanego. Sprawdź przytomność: potrząśnij za ramię, głośno zawołaj „Czy mnie słyszysz?”.
  • Krok 4 – Zadzwoń pod 112 (lub każ to zrobić komuś innemu, żebyś mógł pomagać poszkodowanemu).
  • Krok 5 – Sprawdź oddech (max 10 sekund): patrz czy klatka piersiowa się unosi, słuchaj i czuj powietrze przy ustach.
  • Jeśli poszkodowany oddycha ale jest nieprzytomny – ułóż go w pozycji bocznej ustalonej (na boku, tak żeby nie zakrztusił się wymiocinami).
  • Jeśli poszkodowany nie oddycha – natychmiast rozpocznij RKO (resuscytację krążeniowo-oddechową).
RKO – resuscytacja krok po kroku
  • Schemat: 30 uciśnięć : 2 oddechy – to jest proporcja, którą musisz znać na pamięć.
  • Uciśnięcia klatki piersiowej: dłonie splatasz na środku klatki piersiowej, ramiona wyprostowane, uciskasz na głębokość 5–6 cm, z częstotliwością 100–120 uciśnięć na minutę (to jest bardzo szybkie – mniej więcej w rytmie piosenki „Stayin’ Alive”).
  • Oddechy ratownicze: 2 oddechy po 30 uciśnięciach. Odchylasz głowę poszkodowanego do tyłu, unosisz brodę, obejmujesz jego usta swoimi ustami i wdmuchwujesz powietrze przez ok. 1 sekundę. Obserwujesz czy klatka piersiowa się unosi.
  • Kontynuujesz 30:2 aż do przejęcia działań przez służby, powrotu prawidłowego oddechu, wyczerpania sił lub pojawienia się zagrożenia. Jeżeli nie umiesz albo nie możesz wykonywać oddechów ratowniczych, prowadź ciągłe uciśnięcia i stosuj się do instrukcji dyspozytora 112.
  • AED (defibrylator) – jeśli jest dostępny, użyj go natychmiast. Urządzenie samo mówi co robić. Nie bój się go – prąd oddaje tylko jeśli wykryje wskazania.
Pierwsza pomoc przy oparzeniach elektrycznych
  • Chłodzenie: po odłączeniu źródła prądu chłodź oparzone miejsce chłodną, bieżącą wodą przez około 20 minut. Nie używaj lodu ani lodowatej wody.
  • NIE przekłuwaj pęcherzy – pęcherz stanowi naturalną ochronę uszkodzonej skóry. Przekłucie zwiększa ryzyko zakażenia.
  • NIE smaruj maścią, kremem ani tłuszczem – to popularny błąd. Takie substancje utrudniają ocenę i leczenie oparzenia.
  • Przykryj jałowym opatrunkiem lub czystą folią spożywczą (nie bandażem, który przylega do rany).
  • Zadzwoń 112 – oparzenia elektryczne są zawsze poważne, nawet jeśli wyglądają na małe, bo prąd może uszkodzić narządy wewnętrzne.
Liczby warte zapamiętania: 500 lux (oświetlenie stanowiska biurowego), 5 min/godzinę (przerwa od pracy przy monitorze), 40–75 cm (odległość od monitora), 18°C (minimalna temperatura przy lekkiej pracy fizycznej i pracy biurowej), 30:2 (RKO), 5–6 cm (głębokość uciśnięć), 100–120/min (rytm uciśnięć), ok. 20 min (chłodzenie oparzenia).
02 🗂️ Typy aplikacji, etapy powstawania i cykl życia
Podział aplikacji – rodzaje

Zanim napiszesz pierwszą linię kodu, musisz wiedzieć jakiego rodzaju aplikację tworzysz – bo każdy typ ma inne zasady gry: inne narzędzia, inne ograniczenia i inne oczekiwania użytkownika.

TypGdzie działaPrzykłady technologiiPrzykłady
KonsolowaTerminal / wiersz poleceńC#, Python, Javagit, npm, skrypty automatyzacji
DesktopowaLokalnie na komputerzeWinForms, WPF, .NET MAUI, JavaFXVS Code, Notepad++, VLC
WebowaPrzeglądarka / serwerHTML/CSS/JS, Angular, React, ASP.NETGmail, Allegro, systemy szkolne
MobilnaSmartfon / tabletAndroid (Kotlin), iOS (Swift), Flutter, .NET MAUIWhatsApp, Instagram, Uber
Wbudowana (embedded)Mikrokontroler / urządzenieC, C++, Assemblyoprogramowanie drukarki, sterownik PLC
Usługi / APISerwer (bez UI)ASP.NET Core, Node.js, Springbackend dla aplikacji mobilnych, mikroserwisy
Etapy powstawania aplikacji (SDLC)

SDLC (Software Development Life Cycle) to cykl życia oprogramowania od pomysłu do wycofania. Niezależnie od metodyki (waterfall, agile, scrum) każdy projekt przechodzi przez te etapy – różni się kolejność i sposób iteracji.

  • 1. Analiza wymagań – zbierasz czego klient potrzebuje. Efekt: dokumentacja wymagań funkcjonalnych (co system ma robić) i niefunkcjonalnych (jak szybko, jak bezpiecznie). Bez tego etapu budujesz nie to co trzeba.
  • 2. Projektowanie – planujesz architekturę: jakie klasy, jakie bazy danych, jak wygląda UI. Efekty: diagramy UML, makiety interfejsu (mockupy/wireframe), schemat bazy danych (ERD).
  • 3. Implementacja (kodowanie) – piszesz kod. Programiści pracują według specyfikacji z fazy projektowania. Używasz systemu kontroli wersji (Git).
  • 4. Testowanie – sprawdzasz czy aplikacja działa zgodnie z wymaganiami. Unit testy, integracyjne, UAT (klient sprawdza). Błędy wracają do implementacji.
  • 5. Wdrożenie (deployment) – aplikacja trafia do użytkowników: na serwer produkcyjny, do sklepów (Play Store, App Store), na stanowiska robocze. Konfiguracja środowiska produkcyjnego.
  • 6. Utrzymanie i rozwój – poprawki błędów (bugfix), aktualizacje bezpieczeństwa, nowe funkcje. Najdłuższa faza – system może być utrzymywany latami.
  • 7. Wycofanie – aplikacja jest zastępowana nową wersją lub innym systemem. Migracja danych, informowanie użytkowników.
Uwaga: w modelu kaskadowym (waterfall) te etapy są sekwencyjne. W Scrumie/Agile każdy sprint przechodzi przez skrócone wersje etapów 1–5 iteracyjnie. W modelu spiralnym każde okrążenie zawiera analizę ryzyka.
Cykl życia aplikacji desktopowej (WinForms / WPF)

Aplikacja desktopowa to osobny proces w systemie operacyjnym. Ma jasno zdefiniowany start, działanie i koniec. W C# (WinForms) wygląda to tak:

  • Uruchomienie: system operacyjny uruchamia plik .exe → .NET ładuje środowisko uruchomieniowe → wywołana zostaje metoda static void Main().
  • Inicjalizacja: Application.Run(new MainForm()) tworzy główne okno → wywołany jest konstruktor formularza (InitializeComponent) → odpala się zdarzenie Form.Load – tu ładujesz dane, inicjalizujesz listy, ustawiasz domyślne wartości.
  • Pętla komunikatów (message loop): aplikacja czeka na zdarzenia od użytkownika (kliknięcia, naciśnięcia klawiszy, timery). Każde zdarzenie trafia do kolejki i jest obsługiwane po kolei. Aplikacja jest „żywa” dopóki ta pętla działa.
  • Zamykanie: użytkownik klika X lub wywołujesz Application.Exit() → odpala się FormClosing (możesz anulować zamknięcie lub zapisać dane) → FormClosed → pętla komunikatów kończy działanie → proces się kończy.
Praktyka: zdarzenie Load to miejsce na ładowanie danych z bazy. FormClosing to miejsce na pytanie „Czy zapisać zmiany?”. Nigdy nie rób ciężkich operacji w konstruktorze – możesz blokować UI zanim okno się pokaże.
Cykl życia aplikacji webowej

Aplikacja webowa działa inaczej niż desktopowa – serwer nie „pamięta” użytkownika między żądaniami. HTTP jest bezstanowy.

  • Uruchomienie serwera: serwer (np. IIS, Kestrel w ASP.NET Core) startuje, ładuje konfigurację i zaczyna nasłuchiwać na porcie (np. 443 dla HTTPS). Inicjalizuje dependency injection, połączenia z bazą, middleware.
  • Obsługa żądania (request–response cycle): przeglądarka wysyła żądanie HTTP → serwer przetwarza je przez pipeline middleware (logowanie, uwierzytelnianie, routing) → kontroler lub endpoint buduje odpowiedź → serwer odsyła response. Żądanie jest zakończone, ale połączenie sieciowe może pozostać otwarte i obsłużyć kolejne żądania.
  • Bezstanowość: serwer nie pamięta poprzednich żądań. Stan symulowany jest przez: cookies (po stronie klienta), sesje (ID w cookie, dane na serwerze), JWT (token w nagłówku), localStorage (po stronie przeglądarki).
  • Zatrzymanie serwera: graceful shutdown – serwer kończy obsługę bieżących żądań, a dopiero potem się wyłącza.
  • Frontend SPA (np. Angular/React): aplikacja ładuje się raz do przeglądarki → JavaScript zarządza widokami lokalnie → do serwera wysyła tylko żądania API (JSON), nie przeładowuje strony.
Cykl życia aplikacji mobilnej (Android)

Android zarządza zasobami agresywnie – system operacyjny może zabić Twoją aplikację w tle, gdy brakuje pamięci. Dlatego musisz rozumieć cykl życia i zapisywać stan we właściwych momentach.

  • onCreate() – Activity tworzona (lub tworzona ponownie po rotacji). Tworzysz UI, inicjalizujesz ViewModel, odczytujesz savedInstanceState.
  • onStart()onResume() – aplikacja staje się widoczna i aktywna. Tu wznawiasz animacje i kamery.
  • onPause() – Activity traci fokus, ale może być nadal częściowo widoczna. Wstrzymaj krótkie operacje zależne od pierwszego planu, np. podgląd kamery. Nie wykonuj tutaj ciężkiego zapisu, operacji sieciowych ani transakcji bazodanowych.
  • onStop() – aplikacja niewidoczna. Zwalniasz ciężkie zasoby.
  • onDestroy() – Activity niszczona. Przy rotacji ekranu Android wywołuje onDestroy() i tworzy Activity od nowa – dlatego ViewModel przeżywa rotację, a zwykłe pole klasy nie!
  • Wznowienie po zabiciu przez system: gdy pamięć jest potrzebna, Android może zabić aplikację w tle. Przy powrocie tworzy Activity od nowa – dlatego stan UI zapisujesz w onSaveInstanceState() (Bundle).
Kluczowa różnica: desktop = jeden długo żyjący proces, użytkownik go zamyka. Web = bezstanowe żądania, serwer działa niezależnie. Mobile = system może zabić aplikację w tle bez zgody użytkownika – musisz być na to przygotowany.
03 🔢 Algorytmy i struktury danych
Złożoność obliczeniowa (Big-O)

Big-O mówi jak szybko rośnie czas wykonania algorytmu w zależności od rozmiaru danych (n). Im wolniej rośnie, tym lepiej.

NotacjaNazwaPrzykład
O(1)StałaDostęp do tablicy po indeksie (tab[5])
O(log n)LogarytmicznaBinary search (wyszukiwanie binarne)
O(n)LiniowaPrzejście przez całą listę raz
O(n log n)Liniowo-logarytmicznaMerge sort, Quick sort (średnio)
O(n²)KwadratowaBubble sort, dwie zagnieżdżone pętle po n elementów
O(2ⁿ)WykładniczaBrute-force wszystkich podzbiorów – katastrofalnie wolne
Struktury danych
  • Stos (Stack, LIFO) – Last In First Out. Ostatnio włożony = pierwszy wyjmowany. Wyobraź sobie stos talerzy – kładziesz na górę, bierzesz z góry. Zastosowanie: cofnij (Ctrl+Z), rekurencja (stos wywołań), sprawdzanie nawiasów.
  • Kolejka (Queue, FIFO) – First In First Out. Jak kolejka w sklepie: pierwszy wchodzi, pierwszy wychodzi. Zastosowanie: obsługa żądań, wydruki w kolejce, bufory.
  • Kolejka priorytetowa – element o najwyższym priorytecie wychodzi pierwszy, niezależnie od kolejności dodania. Zastosowanie: harmonogramowanie zadań, algorytm Dijkstry.
  • Lista jednokierunkowa – każdy element wskazuje na następny. Wstawianie na początku O(1), ale dotarcie do k-tego elementu to O(n), bo musisz przejść od początku.
  • Drzewo BST (Binary Search Tree) – lewy potomek jest mniejszy od rodzica, prawy większy. Wyszukiwanie O(log n) dla zbalansowanego drzewa, O(n) dla zwyrodniałego (jak lista).
  • Tablica haszowana (Hash Map / Dictionary) – pary klucz–wartość. Dostęp po kluczu O(1) (średnio). To właśnie Dictionary<K,V> w C#.
  • Graf – węzły (wierzchołki) połączone krawędziami. Może być skierowany (z kierunkiem) lub nieskierowany. Reprezentacja: macierz sąsiedztwa lub lista sąsiedztwa.
Algorytmy sortowania i wyszukiwania
  • Bubble sort (sortowanie bąbelkowe) – O(n²), najprostszy do zrozumienia. Porównuje sąsiednie elementy i zamienia miejscami. Pętla po pętli, największe „bąbelkuje” na koniec.
  • Insertion sort (sortowanie przez wstawianie) – O(n²) najgorzej, O(n) gdy dane prawie posortowane. Bierzesz kolejny element i wstawiasz go na właściwe miejsce w już posortowanej części.
  • Selection sort – O(n²). Szukasz najmniejszego elementu w nieposortowanej części i zamieniasz z pierwszym nieposortowanym.
  • Merge sort – O(n log n) zawsze, stabilny. Strategia „dziel i zwyciężaj”: dzielisz tablicę na połowy rekurencyjnie, potem scalasz posortowane połówki.
  • Quick sort – O(n log n) średnio, O(n²) najgorzej (gdy pivot źle wybrany). Szybki w praktyce, niestabilny. Wybiera pivot, dzieli tablicę na mniejsze i większe od pivota, rekurencja.
  • Binary search (wyszukiwanie binarne) – wymaga posortowanych danych! Sprawdza środkowy element, jeśli szukany jest mniejszy – szuka w lewej połowie, jeśli większy – w prawej. O(log n).
  • Algorytm Dijkstry – wyszukuje najkrótszą ścieżkę w grafie z wagami (nieujemnymi). Stosowany w nawigacji GPS, routingu sieciowym.
Rekurencja i schematy blokowe
  • Rekurencja – funkcja wywołuje samą siebie. MUSI mieć warunek stopu (base case), inaczej nieskończona pętla i przepełnienie stosu (StackOverflowException). Przykład: silnia → 0! = 1 (base case), n! = n × (n-1)! (rekurencja). Każde wywołanie rekurencyjne „czeka” na stos do momentu powrotu – to zużywa pamięć.
  • Schemat blokowy – kształty: elipsa/owal = start/stop, prostokąt = operacja/instrukcja, romb = decyzja (if / warunek pętli), równoległobok = wejście/wyjście (I/O). To jest kluczowe – romb to decyzja!
  • Pseudokod – zapis logiki algorytmu niezależny od języka programowania. Czytelny dla człowieka, nie można go uruchomić na komputerze. Używasz go na etapie projektowania.
Pozostałe grupy algorytmów z podstawy INF.04
GrupaPrzykład i zastosowanie
TekstoweWyszukiwanie wzorca, zliczanie znaków, sprawdzanie palindromu i przetwarzanie napisów.
TablicoweMinimum, maksimum, suma, sortowanie, wyszukiwanie i filtrowanie elementów.
KryptograficzneSzyfr Cezara, XOR jako ćwiczenie oraz funkcje skrótu i szyfrowanie stosowane w rzeczywistych systemach.
HeurystyczneSzukają dobrego rozwiązania szybciej, ale nie zawsze gwarantują rozwiązanie optymalne.
Problem komiwojażeraWyznaczenie najkrótszej trasy odwiedzającej wszystkie punkty; przykład problemu trudnego obliczeniowo.
Najczęstszy błąd: dwie zagnieżdżone pętle po n elementów to O(n²), nie O(2n). Trzy zagnieżdżone pętle to O(n³). Złożoność obliczeniową sortowania bąbelkowego na egzaminie CKE pyta się bardzo często!
04 🧩 Programowanie obiektowe (OOP)
Cztery filary OOP

OOP to sposób myślenia o programowaniu. Zamiast jednej długiej listy instrukcji, grupujesz dane i funkcje w obiekty, które ze sobą współpracują.

  • Hermetyzacja (enkapsulacja) – ukrywasz dane wewnątrz klasy (pola private) i udostępniasz je przez publiczne metody lub właściwości. Dzięki temu nikt z zewnątrz nie może przypadkowo zniszczyć stanu obiektu. Wyobraź sobie pilot do TV: widzisz przyciski, nie widzisz elektroniki w środku.
  • Dziedziczenie – klasa pochodna „dziedziczy” wszystkie pola i metody klasy bazowej i może je rozszerzać. W C#: class Pies : Zwierze. Słowo kluczowe base odwołuje się do klasy bazowej. W C# dziedziczysz tylko po jednej klasie (nie ma wielodziedziczenia klas).
  • Polimorfizm – ten sam kontrakt może mieć różne implementacje zależnie od faktycznego typu obiektu. Przy nadpisywaniu metod klas używasz virtual i override; polimorfizm może też wynikać z implementowania interfejsów.
  • Abstrakcja – ukrywasz szczegóły implementacji, eksponujesz tylko to co niezbędne dla użytkownika klasy. Realizowana przez klasy abstrakcyjne i interfejsy.
Klasy, interfejsy, struktury
  • Klasa abstrakcyjna – nie możesz jej zinstancjonować. Może mieć metody z implementacją i metody abstract. Pierwsza konkretna klasa pochodna musi zapewnić implementację odziedziczonych metod abstrakcyjnych.
  • Interfejs – definiuje kontrakt funkcjonalności. Klasa może implementować wiele interfejsów. Od C# 8 interfejs może także zawierać domyślne implementacje wybranych elementów, ale nie przechowuje stanu instancji w polach.
  • Klasa vs struct: klasa jest typem referencyjnym, a struct typem wartościowym. Wybór zależy od semantyki danych, kosztu kopiowania, mutowalności i sposobu użycia, a nie od prostej zasady „struct zawsze szybszy”.
  • Enum – skończony zbiór nazwanych stałych całkowitych. Zamiast pisać if (status == 1) piszesz if (status == Status.Aktywny) – eliminuje „magiczne liczby”, kod jest czytelniejszy.
  • Sealed class – nie można po niej dziedziczyć. Używasz gdy chcesz zabezpieczyć klasę przed rozszerzaniem.
  • Konstruktor – specjalna metoda wywoływana przy tworzeniu obiektu (new). Ma taką samą nazwę jak klasa, nie ma zwracanego typu.
Kompilacja, uruchamianie i elementy zależne od języka
PojęciePoprawne rozumienie
KompilatorTłumaczy kod źródłowy do innej postaci przed uruchomieniem, np. C# do kodu pośredniego IL.
Interpreter / środowisko wykonawczeWykonuje kod lub jego postać pośrednią podczas działania programu. .NET korzysta m.in. z CLR i kompilacji JIT.
DebuggerPozwala zatrzymywać program, wykonywać go krokowo oraz obserwować zmienne, stos wywołań i wyjątki.
Konstruktor kopiującyW C++ ma szczególne znaczenie językowe. W C# można samodzielnie utworzyć konstruktor przyjmujący obiekt tego samego typu albo użyć innych sposobów kopiowania.
Destruktor / finalizerW C# finalizer jest uruchamiany niedeterministycznie przez mechanizm odśmiecania. Zasoby zwalniaj zwykle przez IDisposable i using.
friend i szablonyfriend oraz templates są pojęciami C++. Najbliższym odpowiednikiem szablonów w C# są typy generyczne.
Kluczowe słowa C#
SłowoZnaczenie
staticNależy do klasy, nie do instancji. Można wywołać bez tworzenia obiektu. Współdzielone przez wszystkie obiekty klasy.
readonlyPole przypisywane tylko w deklaracji lub konstruktorze. Nie można zmienić potem.
virtual / overridevirtual w bazowej = metoda może być nadpisana. override w pochodnej = nadpisuję tę metodę.
sealedKlasa nie może być dziedziczona. Lub: metoda override nie może być nadpisana dalej.
baseOdwołanie do klasy bazowej (np. base.MetodaBazowa() lub base(param) w konstruktorze).
protectedDostęp w obrębie klasy i klas pochodnych. Niedostępny z zewnątrz.
thisOdwołanie do bieżącej instancji obiektu.
abstractMetoda bez implementacji – wymaga nadpisania w klasie pochodnej.
Narzędzia C# – delegaty, lambdy, LINQ
  • Delegat – typ przechowujący referencję do metody (lub metod). Podstawa mechanizmu zdarzeń. Możesz przypisać metodę do delegata i potem ją wywołać.
  • Lambda(x) => x * 2. Anonimowa funkcja przekazywana jako delegat lub argument. Zamiast definiować osobną metodę, piszesz ją w miejscu użycia.
  • Func i Action: Func<int, int> – delegat z wynikiem (ostatni param = typ zwracany). Action<int> – delegat bez wyniku (void).
  • GenerykiList<T>, Dictionary<K,V>. Piszesz kod raz, działa bezpiecznie dla każdego typu. T to placeholder na typ.
  • LINQlista.Where(x => x > 5).OrderBy(x => x).ToList(). Zapytania na kolekcjach, czytelne i bezpieczne typowo. Działa na tablicach, listach, wynikach z bazy (EF Core).
  • async/await – asynchroniczne wykonanie bez blokowania wątku UI. Używasz do operacji I/O (baza danych, sieć, plik). Metoda async zwraca Task lub Task<T>.
  • try/catch/finally – obsługa wyjątków. NullReferenceException = wywołanie metody na obiekcie null. finally wykonuje się zawsze, nawet po wyjątku.
Diagramy UML klas – symbole
  • + = public, - = private, # = protected, ~ = package
  • Pusty trójkąt (strzałka pusta) → dziedziczenie (wskazuje klasę bazową)
  • Przerywana linia + strzałka → implementacja interfejsu
  • Wypełniony romb → kompozycja (część nie istnieje bez całości, np. silnik–samochód)
  • Pusty romb → agregacja (część może istnieć samodzielnie, np. student–uczelnia)
  • Prosta linia → asocjacja (ogólny związek między klasami)
05 🏗️ SOLID, wzorce projektowe i clean code
Zasady SOLID

SOLID to 5 zasad dobrego projektowania klas i systemów. Zasady zostały opisane przez różnych autorów, Robert C. Martin je zebrał i spopularyzował, a akronim SOLID przypisuje się Michaelowi Feathersowi. Pomagają tworzyć kod łatwiejszy do zmiany i testowania.

LiteraZasadaCo oznacza w praktyce
SSingle ResponsibilityJedna klasa = jeden powód do zmiany. Klasa obsługująca zamówienia NIE powinna jednocześnie obsługiwać e-maili i logów.
OOpen/ClosedOtwarta na rozszerzenie, zamknięta na modyfikację. Dodajesz nowe funkcje przez nowe klasy, nie modyfikując istniejących.
LLiskov SubstitutionObiekt klasy pochodnej możesz podstawić wszędzie tam, gdzie oczekiwany jest obiekt klasy bazowej – i program nadal działa poprawnie.
IInterface SegregationLepiej wiele małych interfejsów niż jeden ogromny. Klasa nie powinna być zmuszana do implementowania metod, których nie używa.
DDependency InversionZależysz od abstrakcji (interfejsów), nie od konkretnych implementacji. Zamiast tworzyć obiekt wewnątrz klasy, wstrzykujesz go przez konstruktor (Dependency Injection).
Najważniejsze wzorce projektowe
  • Singleton – zapewnia, że istnieje tylko jedna instancja klasy w całym programie. Przykład użycia: logger, pula połączeń z bazą danych, konfiguracja aplikacji.
  • Factory Method – tworzysz obiekty bez wskazywania ich konkretnej klasy. Podklasy decydują co tworzyć. Przydatne gdy logika tworzenia jest skomplikowana.
  • Observer – jeden obiekt (subject) zmienia stan, wszyscy obserwatorzy są automatycznie powiadamiani. W C# to mechanizm event. Przykład: kliknięcie przycisku → wiele reakcji.
  • Decorator – dynamicznie dodajesz nowe funkcje do obiektu, owijając go innym obiektem, bez zmiany oryginalnej klasy.
  • Strategy – rodzina algorytmów w osobnych klasach, wymiennych w czasie działania. Przykład: różne algorytmy sortowania jako wymienne strategie.
  • Facade – uproszczony, przyjazny interfejs do złożonego podsystemu. Ukrywa skomplikowanie od użytkownika.
  • Template Method – klasa bazowa definiuje szkielet algorytmu, a klasy pochodne nadpisują wybrane kroki bez zmiany całej kolejności działań.
  • Composite – pozwala traktować pojedyncze obiekty i ich złożenia w jednolity sposób, np. plik oraz folder zawierający pliki.
  • Repository – oddziela logikę dostępu do danych od logiki biznesowej. Klasy biznesowe nie wiedzą czy dane są w bazie SQL, w pliku czy w API.
Zasady czystego kodu (Clean Code)
  • DRY (Don’t Repeat Yourself) – każda część logiki istnieje w jednym miejscu w kodzie. Kopiowanie kodu = gwarancja błędów gdy coś trzeba zmienić.
  • KISS (Keep It Simple, Stupid) – najprostsze rozwiązanie jest często najlepsze. Nie komplikuj bez powodu.
  • YAGNI (You Ain’t Gonna Need It) – nie implementuj funkcji dopóki jej nie potrzebujesz. Programiści często dodają „na wszelki wypadek” i marnują czas.
  • Clean Code (Robert C. Martin) – sensowne nazwy zmiennych i metod, krótkie metody z jedną odpowiedzialnością, komentarze gdy wyjaśniają dlaczego, nie co.
LINQ – najważniejsze metody
  • Where(x => warunek) – filtruje, zostawia tylko elementy spełniające warunek
  • Select(x => przekształcenie) – przekształca każdy element (jak map w funkcyjnym)
  • OrderBy(x => klucz) / OrderByDescending() – sortuje
  • FirstOrDefault(x => warunek) – pierwszy pasujący element lub wartość domyślna typu, np. null dla klasy albo 0 dla int
  • Any(x => warunek) – czy istnieje jakikolwiek pasujący element (bool)
  • Count(x => warunek) – ile elementów spełnia warunek
  • GroupBy(x => klucz) – grupuje elementy
  • ToList() / ToArray() – materializuje wynik zapytania
Egzamin pyta S i O najczęściej. SOLID to zasady projektowania klas/systemów. DRY, KISS, YAGNI to zasady pisania kodu. To różne poziomy abstrakcji.
06 🖥️ Aplikacje desktopowe (WinForms i WPF)
Windows Forms (WinForms)
TechnologiaInterfejsNajważniejszy model pracyGłówne zastosowanie
WinFormsProjektant formularzy i kontrolkiZdarzenia oraz code-behindKlasyczne aplikacje Windows
WPFXAML, style i bindingCode-behind lub MVVMRozbudowane aplikacje Windows
.NET MAUIXAML i kontrolki wieloplatformoweCode-behind lub MVVMAplikacje mobilne i wieloplatformowe

WinForms to dojrzała technologia do budowania aplikacji okienkowych Windows. Warto ją znać, ponieważ dobrze pokazuje pracę z kontrolkami, właściwościami i zdarzeniami.

  • Właściwość Text – tekst wyświetlany w kontrolce (etykieta na przycisku, tytuł okna). (Name) to nazwa obiektu w kodzie C# – nie mylić z Text!
  • Podłączanie zdarzeń: button1.Click += ObsługaKliknięcia; lub dwukliknięcie na kontrolce w designerze. Możesz podłączyć wiele metod do jednego zdarzenia.
  • ShowDialog() – otwiera dialog modalny (blokuje okno nadrzędne, musisz zamknąć dialog żeby wrócić). Show() – niemodalny (możesz pracować w oknie nadrzędnym).
  • Enabled = false – wygasza kontrolkę (widoczna ale nie reaguje). Visible = false – ukrywa kontrolkę (jakby jej nie było).
  • Aktualizacja UI z innego wątku – w WinForms możesz użyć m.in. Invoke() lub BeginInvoke(). W nowym kodzie często wygodniej użyć async/await i wracać do kontekstu wątku UI.
  • DataGridView – tabela do wyświetlania i edycji danych. Podłączasz ją z listą obiektów lub DataTable przez DataSource.
  • Zdarzenie Load – uruchamia się przy inicjalizacji formularza, przed wyświetleniem. Tu umieszczasz kod ładujący dane (np. z bazy).
  • Zdarzenie Click vs MouseClick: Click reaguje też na Enter/Space, MouseClick tylko na mysz.
  • ContextMenuStrip – menu kontekstowe (prawa myszka). Przypisujesz do kontrolki przez właściwość ContextMenuStrip.
  • Dialog modalny vs niemodalny: modalny = wymaga zamknięcia żeby wrócić do głównego okna (np. MessageBox). Niemodalny = można jednocześnie korzystać z okna głównego.
WPF i wzorzec MVVM
  • XAML – Extensible Application Markup Language. Deklaratywny XML-owy opis interfejsu. Logika w plikach .cs (code-behind), ale w MVVM staramy się trzymać logikę w ViewModelu.
  • MVVM (Model–View–ViewModel):
    • Model – klasy danych (np. Klient, Zamówienie), logika biznesowa
    • View – XAML, czysto wizualny, bez logiki aplikacji
    • ViewModel – logika interfejsu, komendy i właściwości udostępniane przez binding. Nie zna widoku bezpośrednio.
  • Data Binding – powiązanie danych między źródłem a kontrolką UI. Kierunek synchronizacji zależy od trybu bindingu, np. OneWay albo TwoWay.
  • INotifyPropertyChanged – interfejs implementowany zwykle przez ViewModel. Zdarzenie PropertyChanged informuje UI, że właściwość się zmieniła.
  • ObservableCollection<T> – kolekcja, która informuje UI gdy dodasz lub usuniesz element. Zwykła List<T> tego nie robi.
  • ICommand (RelayCommand) – enkapsuluje akcję przycisku jako obiekt. W XAML: Button Command="{Binding ZapiszCommand}" zamiast event handlera w code-behind.
  • IValueConverter – przekształca dane w bindingu. Np. bool → Visibility (gdy Active=true, pokaż element), enum → kolor.
Technologie powiązane: .NET MAUI i Entity Framework Core
  • .NET MAUI – Multi-platform App UI. Jeden projekt C# + XAML działa na Windows, macOS, Android i iOS. Następca Xamarin.Forms.
  • Entity Framework Core (EF Core) – ORM (Object-Relational Mapper). Zamiast pisać SQL ręcznie, operujesz na danych przez klasy C# (context.Klienci.Where(...).ToList()).
  • Wzorzec Repository – warstwa abstrakcji nad dostępem do danych. Logika biznesowa nie wie czy dane są w SQL Server, SQLite czy w API.
Przygotowanie praktyczne: ćwicz technologię i środowisko wskazane przez nauczyciela oraz arkusze właściwe dla Twojej sesji. Niezależnie od technologii umiej: obsłużyć zdarzenia, oddzielić logikę od UI, zwalidować dane, pracować z kolekcją i przetestować działanie programu.
07 🌐 Ekosystem webowy: JS, TypeScript, Node.js, Angular, React, Bootstrap
JavaScript – podstawy języka

JavaScript (JS) to dynamicznie typowany język, który działa w przeglądarce, a dzięki środowiskom takim jak Node.js także po stronie serwera i w narzędziach. Ten sam język może więc obsługiwać interfejs oraz backend aplikacji.

  • Typowanie dynamiczne – typ zmiennej jest określany w czasie wykonania, nie kompilacji. let x = 5 → x jest liczbą. x = "hello" → x jest teraz stringiem. To wygodne, ale łatwo o błędy.
  • var / let / const: var – stara składnia, zasięg funkcji, unikaj. let – zmienna blokowa, można zmieniać wartość. const – stała blokowa, nie można przypisać nowej wartości (ale obiekt w środku można mutować).
  • Funkcje strzałkowe (arrow functions): const dodaj = (a, b) => a + b. Krótsza składnia, nie ma własnego this – ważne przy callbackach.
  • async / await: const dane = await fetch(url). Asynchroniczne operacje (żądania HTTP, odczyt pliku) bez blokowania wątku. Metoda musi być oznaczona async.
  • Promise: obiekt reprezentujący wynik asynchronicznej operacji, który nastąpi w przyszłości. then() / catch() lub await.
  • DOM (Document Object Model): JavaScript może modyfikować strukturę strony HTML. document.getElementById('id'), element.innerHTML, element.classList.add('klasa').
  • Zdarzenia: element.addEventListener('click', funkcja). Reagowanie na akcje użytkownika.
  • fetch() / AJAX: pobieranie danych z serwera bez przeładowania strony. const res = await fetch('/api/dane'); const json = await res.json();
CSS – podstawy potrzebne w projektach
  • Selektory: div (element), .klasa (klasa), #id (identyfikator), div > p (bezpośredni potomek), div p (każdy potomek). Specyficzność: ID > klasa > element.
  • Box model: każdy element to prostokąt: content + padding (wewnętrzny margines) + border (ramka) + margin (zewnętrzny margines).
  • Flexbox: display: flex na rodzicu. Dzieci układają się w linii lub kolumnie. justify-content = wyrównanie wzdłuż osi głównej, align-items = wzdłuż osi poprzecznej.
  • CSS Grid: display: grid; grid-template-columns: repeat(3, 1fr). Dwuwymiarowy układ. Flexbox = 1D (wiersz lub kolumna), Grid = 2D (wiersze i kolumny jednocześnie).
  • Media queries (RWD): @media (max-width: 768px) { ... } – inne style dla różnych szerokości ekranu. Podstawa Responsive Web Design.
  • Zmienne CSS: --kolor-glowny: #5b7cf8; w :root, potem color: var(--kolor-glowny). Łatwa zmiana motywu w całym projekcie.
TypeScript – JavaScript ze statycznym typowaniem
  • TypeScript (TS) – nadzbiór JavaScript stworzony przez Microsoft. Dodaje statyczne typowanie do JS. Piszesz w TS → kompilator (tsc) tłumaczy na czysty JS, który rozumie przeglądarka i Node.js.
  • Typy: let wiek: number = 25, let imie: string, let aktywny: boolean, let lista: string[], let para: [string, number] (tuple).
  • Interfejsy: interface Uzytkownik { id: number; imie: string; }. Definiujesz kształt obiektu. Kompilator pilnuje żebyś używał właściwych pól.
  • Opcjonalne pola: adres?: string – pole może być undefined. Bez ? pole jest wymagane.
  • Typy union: let status: 'aktywny' | 'nieaktywny' | 'zawieszony' – zmienna może być jedną z kilku wartości.
  • Generyki: function pierwszyElement<T>(lista: T[]): T – ta sama funkcja działa bezpiecznie dla tablic dowolnego typu.
  • Dlaczego TS zamiast JS: błędy wykrywane w edytorze (nie w runtime), lepszy IntelliSense, łatwiejszy refactoring dużych projektów. Angular wymaga TypeScript. React działa z obydwoma.
Node.js i npm – środowisko i pakiety
  • Node.js – środowisko uruchomieniowe JavaScript poza przeglądarką. Bazuje na silniku V8 (Chrome). Pozwala pisać serwery, narzędzia CLI, skrypty w JS/TS.
  • npm (Node Package Manager) – menadżer pakietów JS. Instalujesz gotowe biblioteki i frameworki jednym poleceniem.
  • package.json – serce projektu Node. Zawiera: nazwę projektu, wersję, skrypty (npm start, npm run build), listę zależności (dependencies) i dev-zależności (devDependencies).
  • node_modules/ – folder ze wszystkimi zainstalowanymi pakietami. NIE wrzucasz go do Git! Jest w .gitignore. Współpracownik odtwarza go przez npm install.

# Instalacja zależności z package.json (po sklonowaniu projektu)
npm install
 
# Instalacja konkretnego pakietu i zapis do package.json
npm install axios
npm install --save-dev typescript     # tylko do dev (nie na produkcję)
 
# Uruchomienie skryptu zdefiniowanego w package.json
npm start
npm run build
npm run test
 
# Globalna instalacja narzędzia CLI (np. Angular CLI)
npm install -g @angular/cli
Angular – framework Google
  • Angular – komponentowy framework do budowy aplikacji webowych i SPA, oparty na TypeScript. Ma wbudowany DI, router, formularze i klienta HTTP oraz narzuca spójną strukturę projektu.
  • Komponent – podstawowy budulec Angular. Składa się z: klasy TS (@Component), szablonu HTML i opcjonalnego pliku CSS. Każda strona/widget to osobny komponent.
  • Angular CLI (ng) – narzędzie do tworzenia i budowania projektów Angular.

# Tworzenie nowego projektu Angular
ng new nazwa-projektu
 
# Uruchomienie deweloperskiego serwera (http://localhost:4200)
ng serve
ng serve --open          # od razu otwiera przeglądarkę
 
# Generowanie komponentu, serwisu, modułu
ng generate component moj-komponent
ng generate service moj-serwis
ng g c produkty          # skrócona składnia
 
# Budowanie produkcyjne (minifikacja, optymalizacja)
ng build --configuration production
  • Dyrektywy w szablonie: *ngFor="let p of produkty" – pętla po liście, *ngIf="isLoading" – warunkowe wyświetlanie, [(ngModel)]="pole" – two-way binding (zmiana w polu = zmiana w zmiennej i odwrotnie).
  • Serwis (Service) – klasa z logiką biznesową lub wywołaniami HTTP. Wstrzykiwana do komponentów przez DI. Zasada: komponent zarządza widokiem, serwis zarządza danymi.
  • RoutingRouterModule. Definiujesz ścieżki URL → komponenty. <router-outlet> w szablonie = miejsce gdzie Angular wyświetla aktualny komponent.
  • HttpClient – moduł do żądań HTTP. this.http.get<Produkt[]>('/api/produkty') zwraca Observable.
  • Observable / RxJS – strumień danych, możesz subskrybować i reagować na każdą emitowaną wartość. Angular używa go wszędzie (HTTP, Router, formularze).
Wersje Angulara: w starszych materiałach spotkasz moduły, *ngIf i *ngFor. W nowszych projektach często używa się komponentów standalone oraz składni @if i @for. Rozpoznawaj oba podejścia i sprawdzaj wersję projektu.
React – biblioteka Meta
  • React – biblioteka (nie framework!) do budowy interfejsów użytkownika. Nie narzuca struktury całego projektu – ty decydujesz o routerze, zarządzaniu stanem, żądaniach HTTP. Popularny i szeroko stosowany.
  • JSX – rozszerzenie składni JS, które pozwala zapisywać strukturę interfejsu podobną do HTML w kodzie JavaScript. Narzędzie budujące tłumaczy JSX na kod wykonywalny przez przeglądarkę; współczesny transform nie musi bezpośrednio używać React.createElement().
  • Komponent funkcyjny – prosta funkcja JS/TS zwracająca JSX. To standardowy sposób pisania komponentów od React 16.8.
  • useState – hook do zarządzania lokalnym stanem komponentu. const [licznik, setLicznik] = useState(0). Wywołanie setLicznik(1) re-renderuje komponent.
  • useEffect – hook do efektów ubocznych (wywołania API, subskrypcje, timery). useEffect(() => { fetchDane(); }, []) – pusty array = wykonaj raz po pierwszym renderze.
  • Props – parametry komponentu przekazywane z rodzica do dziecka. Jednokierunkowy przepływ danych (z góry w dół). <Przycisk tekst="Zapisz" onClick={handleSave} />

# Tworzenie projektu React (Vite – szybszy od Create React App)
npm create vite@latest nazwa-projektu -- --template react-ts
 
# Instalacja zależności i uruchomienie
cd nazwa-projektu
npm install
npm run dev              # serwer dev na http://localhost:5173
 
# Budowanie produkcyjne
npm run build            # wynik w folderze dist/
Bootstrap – gotowy system CSS
  • Bootstrap – najpopularniejszy framework CSS. Daje gotowe komponenty (przyciski, karty, navbar, modal, formularze) i responsywny system siatki. Używasz klas CSS zamiast pisać style od zera.
  • System siatki (Grid) – 12 kolumn. Wiersz: <div class="row">, kolumna: <div class="col-md-6"> (6 z 12 kolumn na ekranie md i większym = 50% szerokości). Breakpointy: sm (≥576px), md (≥768px), lg (≥992px), xl (≥1200px).
  • Klasy użytkowe (utility classes): mt-3 (margin-top), p-2 (padding), d-flex (display:flex), text-center, fw-bold, text-primary. Szybkie stylowanie bez pisania CSS.
  • Komponenty Bootstrap: btn btn-primary (przycisk), card (karta), navbar (pasek nawigacji), modal (dialog), alert alert-danger (komunikat).
  • Instalacja przez npm: npm install bootstrap, potem import w głównym pliku: import 'bootstrap/dist/css/bootstrap.min.css'.
  • Bootstrap Icons – darmowy zestaw ikon: npm install bootstrap-icons, użycie: <i class="bi bi-trash"></i>.
Angular vs React – porównanie
AngularReact
TypPełny frameworkBiblioteka UI
JęzykTypeScript (obowiązkowy)JS lub TS (opcjonalnie)
TwórcaGoogleMeta (Facebook)
Składnia szablonówHTML + dyrektywy AngularJSX (JS + HTML)
Zarządzanie stanemWbudowane serwisy + RxJSuseState, useReducer + Redux/Zustand
RoutingWbudowany RouterModulezewnętrzny React Router
CLIAngular CLI (ng)Vite, Create React App
Krzywa uczeniaStroma (dużo konceptów)Łagodniejsza (zaczynasz od hooks)
Praktyczna różnica: Angular = „wszystko w jednym pudełku”, dobry dla dużych, korporacyjnych projektów. React = elastyczniejszy, sam dobierasz biblioteki. Obydwa mogą służyć do budowy SPA, które podmieniają treść bez pełnego przeładowania strony.
Backend, sesje i aplikacja bazodanowa
ElementCo trzeba umieć w INF.04
BackendTworzyć endpointy w wybranym frameworku, np. ASP.NET Core, Node.js albo Django, przyjmować dane, walidować je i zwracać odpowiedzi.
REST APIProjektować zasoby i używać metod HTTP, kodów odpowiedzi oraz JSON do komunikacji front-endu z serwerem.
Baza danychWykonywać operacje CRUD, łączyć rekordy relacjami i bezpiecznie przekazywać parametry zapytań.
Sesja i cookiesRozumieć, że cookie jest przechowywane po stronie klienta, a sesja zwykle przechowuje dane po stronie serwera pod identyfikatorem przesyłanym w cookie.
Logowanie i dostępRozróżniać uwierzytelnianie od autoryzacji, chronić trasy i funkcje oraz nie przechowywać haseł jako tekst jawny.
Projekt domenowyUmieć stworzyć funkcje typowe dla sklepu, rezerwacji, serwisu ogłoszeniowego lub społecznościowego.
08 📱 Aplikacje mobilne (cross-platform i web mobile)
Rodzaje aplikacji mobilnych
TypJęzyk/TechnologiaCechy
Natywna iOSSwift (lub Objective-C)Najlepsza wydajność, pełny dostęp do API Apple, tylko dla iOS
Natywna AndroidKotlin lub JavaNajlepsza wydajność, pełny dostęp do API Google, tylko dla Android
Cross-platformFlutter (Dart), .NET MAUI (C#), React Native (JS)Jedna baza kodu, kilka platform, kompromis między wydajnością a wygodą
HybrydowaIonic, Cordova (HTML w WebView)Webowa aplikacja opakowana w kontener natywny. Łatwa do pisania, najgorsza wydajność.
PWA (Progressive Web App)HTML/CSS/JS + Service WorkerDziała w przeglądarce, może działać offline (Service Worker cachuje zasoby), instalowalna bez sklepu.
Flutter i Dart
  • Flutter – framework Google (open source). Rysuje własne widżety na płótnie (Canvas), nie używa natywnych komponentów OS. Efekt: identyczny wygląd na wszystkich platformach. Android + iOS + Web + Desktop + Embedded z jednej bazy kodu.
  • Dart – język programowania rozwijany przez Google, najczęściej kojarzony z Flutterem, ale możliwy do użycia także w aplikacjach serwerowych, webowych i narzędziach CLI. Jest statycznie typowany i może być kompilowany do kodu natywnego lub JavaScript.
React Native i dystrybucja
  • React Native – framework Meta (Facebook). JavaScript/TypeScript, ale renderuje natywne komponenty UI (nie HTML/WebView jak hybrydy). Most między JS a natywnymi API.
  • Google Play – format AAB (Android App Bundle) – Google Play wymaga AAB dla nowych aplikacji publikowanych w sklepie. Na podstawie pakietu generuje zoptymalizowane APK dla konkretnych urządzeń. APK nadal służy m.in. do instalacji i testów poza Google Play.
  • App Store (iOS) – zarządzasz przez App Store Connect. Testy beta przez TestFlight. Każda aplikacja musi przejść review Apple – trwa od kilku godzin do kilku dni.
Funkcje aplikacji mobilnej wymagane w praktyce
ObszarPrzykładowe wykonanie
Dane i ustawieniaPliki, JSON, Preferences/SecureStorage oraz lokalna baza SQLite.
Nawigacja i formularzeWiele ekranów, listy, dialogi, walidacja danych i pasek narzędzi.
InternetPobieranie i wysyłanie danych przez HTTP/REST, obsługa błędów i braku połączenia.
Funkcje urządzeniaLokalizacja, powiadomienia, multimedia, zegar, kalendarz i uprawnienia użytkownika.
Dostosowanie platformoweUwzględnianie różnic Android/iOS/Windows, rozmiaru ekranu i zachowania kontrolek.
PublikacjaKonfiguracja identyfikatora, wersji, ikon, podpisu oraz przygotowanie pakietu publikacyjnego.
Najczęstszy błąd: Swift to iOS/macOS. Kotlin to Android. Dart to Flutter (cross-platform). Java to też Android (starsza technologia). Nie mieszaj tych par!
09 🤖 Android – cykl życia, komponenty, Jetpack
Cykl życia Activity
MetodaStan ekranuTypowe zadanie
onCreate()TworzonyBudowa UI i inicjalizacja danych
onStart() / onResume()Widoczny i aktywnyWznowienie interakcji, animacji i zasobów
onPause() / onStop()Traci aktywność lub znikaZapis stanu i zwolnienie zasobów
onDestroy()NiszczonyKońcowe sprzątanie zasobów

Activity jest głównym komponentem interfejsu Androida i zwykle udostępnia okno aplikacji. Może reprezentować ekran, ale współczesna aplikacja może również mieć jedną Activity i wiele ekranów zbudowanych za pomocą fragmentów lub Jetpack Compose.

  • onCreate() – wywoływany przy tworzeniu każdej nowej instancji Activity, także po jej odtworzeniu. Tu ustawiasz interfejs, inicjalizujesz widoki i odczytujesz zapisany stan.
  • onStart() – Activity staje się widoczna dla użytkownika.
  • onResume() – Activity na pierwszym planie, użytkownik może interagować. Tu wznawiasz animacje, odtwarzanie mediów.
  • onPause() – Activity traci fokus. Wstrzymujesz krótkie operacje, które nie powinny trwać bez aktywnego fokusu. Metoda jest krótka; nie zapisuj w niej dużych danych ani nie wykonuj operacji sieciowych.
  • onStop() – Activity jest całkowicie niewidoczna. Zwalniasz ciężkie zasoby.
  • onDestroy() – Activity jest niszczona (użytkownik zamknął lub rotacja ekranu). Rotacja = Android niszczy i na nowo tworzy Activity!
Komponenty Androida
  • Activity – komponent udostępniający okno i punkt wejścia do interakcji użytkownika. Aplikacja może mieć wiele Activity albo jedną Activity obsługującą wiele ekranów.
  • Fragment – modułowy komponent UI osadzany w Activity. Ma własny cykl życia. Używasz gdy chcesz tego samego UI na telefonie i tablecie.
  • Intent – komunikat/żądanie między komponentami. Explicit intent: bezpośrednio wskazujesz klasę docelową (new Intent(this, DetailActivity.class)). Implicit intent: opisujesz co chcesz zrobić, Android wybiera aplikację (ACTION_VIEW dla linku = otwiera przeglądarkę).
  • Service – komponent bez własnego UI do pracy, która ma trwać niezależnie od ekranu. Foreground service pokazuje trwałe powiadomienie i ma wyższy priorytet, ale system nadal może zakończyć jego proces w krytycznej sytuacji.
  • BroadcastReceiver – reaguje na systemowe zdarzenia rozgłoszeniowe (np. BOOT_COMPLETED = urządzenie się uruchomiło, CONNECTIVITY_CHANGE = zmiana sieci).
  • AndroidManifest.xml – deklaruje wszystkie komponenty aplikacji, wymagane uprawnienia i minimalną wersję Androida (minSdkVersion).
Android Jetpack
  • ViewModel – przechowuje dane UI i przeżywa rotację ekranu (gdy Activity jest niszczona). Komunikuje się przez LiveData lub StateFlow.
  • LiveData – obserwowalny kontener danych uwzględniający cykl życia. UI aktualizuje się automatycznie, ale tylko gdy Activity/Fragment jest aktywny (zapobiega crashom na zabitym widoku).
  • Room – ORM nad SQLite. Składa się z: Entity (klasa = tabela), DAO (interfejs z metodami dostępu), Database (klasa zarządzająca). Kompilator sprawdza SQL w czasie kompilacji.
  • RecyclerView – efektywna lista z recyclingiem widoków (nie tworzy N widoków dla N elementów, tylko tyle ile widać + kilka). Wymaga ViewHolder i Adapter.
  • WorkManager – zalecany do odraczalnych, gwarantowanych zadań w tle, które mogą zostać wykonane później także po restarcie urządzenia. Nie zastępuje AlarmManagera, gdy zadanie musi uruchomić się o dokładnej godzinie.
  • Jetpack Compose – nowoczesne, deklaratywne UI w Kotlinie. Funkcje oznaczone @Composable opisują jak wygląda UI, a nie jak je zbudować krok po kroku.
Przechowywanie danych
  • SharedPreferences – proste pary klucz–wartość w pliku XML. Idealne na ustawienia: motyw, język, ostatni użytkownik. Nie używaj do wrażliwych danych.
  • SQLite / Room – pełnoprawna lokalna baza relacyjna na urządzeniu. Dla danych strukturalnych, większej ilości danych.
  • Pliki aplikacji – pliki wewnętrzne są prywatne dla aplikacji i kasowane przy odinstalowaniu. Dostęp do katalogu aplikacji w pamięci zewnętrznej od Androida 4.4 nie wymaga uprawnień do pamięci; dostęp do innych plików zależy od wersji Androida i zasad scoped storage.
  • Wzorzec offline-first – dane lokalne w Room, synchronizacja z API gdy jest sieć. Aplikacja działa nawet bez internetu.
Uprawnienia niebezpieczne (ACCESS_FINE_LOCATION, CAMERA, READ_CONTACTS, RECORD_AUDIO itp.) muszą być zadeklarowane w AndroidManifest.xml ORAZ poproszone w runtime (od Android 6.0 Marshmallow). Sam wpis w manifeście nie wystarczy!
10 🧪 Testowanie oprogramowania
Piramida testów – od najszybszych do najwolniejszych
RodzajZakresSzybkośćIle zwykle
JednostkowePojedyncza metoda lub klasaBardzo szybkieNajwięcej
IntegracyjneWspółpraca modułówŚrednieMniej
E2ECały scenariusz użytkownikaNajwolniejszeNajmniej

Piramida testów to model mówiący jak dużo testów każdego rodzaju powinieneś mieć. Na dole jest ich dużo (testy jednostkowe), na górze mało (testy E2E). Im wyżej, tym wolniejsze, droższe w utrzymaniu i trudniejsze w diagnostyce.

  • Unit testy (jednostkowe) – testujesz jedną metodę lub klasę w izolacji od reszty systemu. Używasz zaślepek (mock, stub) zamiast prawdziwych zależności (baza, API). Szybkie (milisekundy), dużo ich powinno być.
  • Testy integracyjne – testujesz współdziałanie kilku modułów razem (np. warstwa biznesowa + baza danych). Wolniejsze, wykrywają błędy na styku komponentów, które testy jednostkowe pomijają.
  • Testy E2E (end-to-end) – symulują prawdziwego użytkownika klikającego w aplikację (Selenium, Cypress, Playwright). Najwolniejsze, testują cały system od UI do bazy. Kosztowne w utrzymaniu.
  • Testy regresji – po każdej zmianie kodu uruchamiasz wszystkie testy żeby sprawdzić, że nic starego się nie zepsuło.
  • Testy akceptacyjne (UAT) – klient lub użytkownik końcowy weryfikuje czy system spełnia wymagania biznesowe. To oni decydują czy funkcja jest gotowa.
  • Smoke test – szybki test podstawowych funkcji po deploymencie. „Czy aplikacja w ogóle się uruchamia i logowanie działa?”
  • Testy wydajnościowe: load testing (normalne obciążenie), stress testing (ponad limity), endurance testing (długo przy stałym obciążeniu).
  • A/B testing – dwie wersje funkcji dla różnych grup użytkowników. Decyzja co wdrożyć – na podstawie danych, nie intuicji.
Techniki projektowania testów
  • Black-box – testujesz wejście → oczekiwane wyjście. Nie znasz implementacji. Skupiasz się na wymaganiach, nie na kodzie.
  • White-box (glass-box) – testujesz znając implementację. Sprawdzasz czy każda gałąź kodu jest przetestowana (code coverage).
  • Partycjonowanie równoważności – dzielisz dane wejściowe na klasy, w których program zachowuje się tak samo (np. poprawne wiek: 0–120, za małe: poniżej 0, za duże: powyżej 120). Testujesz jeden reprezentant z każdej klasy.
  • Analiza wartości brzegowych – testujesz tuż pod, dokładnie na i tuż nad granicą zakresu. Dla zakresu 1–100: testujesz 0, 1, 2, 99, 100, 101. Tu najczęściej są off-by-one błędy.
  • TDD (Test-Driven Development) – Red → Green → Refactor. Najpierw piszesz test (który nie przechodzi, bo kodu nie ma – czerwony), potem piszesz minimalny kod żeby test przeszedł (zielony), potem refaktorujesz kod zachowując zielone testy.
  • BDD (Behavior-Driven Development) – testy opisane językiem naturalnym (Given-When-Then). Narzędzia: Cucumber, SpecFlow.
Narzędzia i dokumentacja testów
  • NUnit / xUnit / MSTest – frameworki testów jednostkowych dla .NET/C#. Atrybuty: [Test], [Fact], [TestMethod]. AAA: Arrange (przygotuj), Act (działaj), Assert (sprawdź).
  • Mock – obiekt symulujący zależność, kontrolujesz jego zachowanie. Stub – zwraca ustalone wartości. Fake – uproszczona implementacja (np. InMemoryDatabase). Spy – prawdziwy obiekt + śledzenie wywołań.
  • Code coverage – procent kodu wykonanego przez testy. Narzędzia: Coverlet (.NET), JaCoCo (Java). 100% coverage ≠ brak błędów!
  • Debugger – breakpointy (F9), step into (F11, wchodzisz do metody), step over (F10, wykonujesz i idziesz dalej), step out (Shift+F11, wychodzisz z metody), watch (obserwujesz wartości zmiennych).
  • Bug report – musi zawierać: kroki reprodukcji, wynik oczekiwany, wynik rzeczywisty, środowisko (OS, wersja, browser), screenshoty/video.
  • Linter – narzędzie do statycznej analizy kodu (ESLint dla JS, StyleCop dla C#). Wykrywa potencjalne błędy i wymusza styl bez uruchamiania kodu.
Pełny proces testowania i dokumentowania
EtapRezultat
PlanowanieZakres, środowisko, rodzaje testów, odpowiedzialności i kryteria zakończenia.
ProjektowanieScenariusze i przypadki testowe obejmujące dane poprawne, błędne oraz wartości brzegowe.
WykonanieWyniki rzeczywiste, status pass/fail, dowody wykonania oraz raporty błędów.
Testy niefunkcjonalneWydajność, obciążenie, bezpieczeństwo, kompatybilność, użyteczność i dostępność interfejsu.
AutomatyzacjaPowtarzalne testy jednostkowe, integracyjne lub UI uruchamiane lokalnie albo w CI.
DokumentacjaKomentarze kodu, dokumentacja techniczna, instrukcja użytkownika, instrukcja wdrożenia i historia zmian.
Ważne rozróżnienie: dokumentacja techniczna = dla programistów (architektura, API, schematy bazy, konfiguracja). Instrukcja użytkownika = dla końcowych użytkowników (screeny, kroki obsługi funkcji). To są dwa różne dokumenty dla dwóch różnych grup odbiorców!
11 📐 UML, dokumentacja projektowa i modele SDLC
Diagramy UML – które musisz znać
DiagramDo czego służy
KlasStatyczna struktura systemu: klasy, atrybuty, metody, relacje między nimi. + = public, – = private, # = protected.
Przypadków użyciaKto (aktorzy) korzysta z jakich funkcji systemu. «include» = obowiązkowe włączenie (zawsze wykonywane). «extend» = opcjonalne rozszerzenie (w pewnych warunkach).
SekwencjiKomunikaty między obiektami w określonej kolejności czasowej. „Kto do kogo wysyła wiadomość i kiedy?”
AktywnościPrzepływ czynności i decyzji. Rozbudowany schemat blokowy. Używasz do modelowania procesów biznesowych lub algorytmów.
StanówStany obiektu i przejścia między nimi. Np. zamówienie: Nowe → Zatwierdzone → Wysłane → Dostarczone → Anulowane.
WdrożeniaJak komponenty systemu rozmieszczone są na serwerach, urządzeniach, kontenerach.
ERD (Entity-Relationship Diagram)Struktura bazy danych: encje (tabele), atrybuty, relacje, klucze. Technicznie to nie UML, ale często pytany przy projektowaniu baz.
Modele cyklu życia projektu (SDLC)

SDLC (Software Development Life Cycle) to sposób organizacji pracy nad projektem informatycznym. Na egzaminie pojawia się pytanie: „W którym modelu SDLC występuje etap analizy ryzyka?” – odpowiedź: spiralnym.

  • Model kaskadowy (Waterfall) – klasyczny, sekwencyjny. Fazy: Analiza → Projektowanie → Implementacja → Testowanie → Wdrożenie → Utrzymanie. Każda faza kończy się przed rozpoczęciem następnej. Zalety: przewidywalny, dobra dokumentacja. Wady: bardzo trudno cofnąć się do poprzedniej fazy. Sprawdza się gdy wymagania są stabilne i z góry znane.
  • Model spiralny (Spiral) – każde „okrążenie” spirali to pełny cykl: planowanie, analiza ryzyka, tworzenie prototypu, ocena przez klienta. Dla każdego okrążenia wraca do analizy ryzyka. Dobry dla dużych, ryzykownych projektów. Zapamiętaj: analiza ryzyka = model spiralny.
  • Model z prototypem – buduje szybki prototyp, pokazuje klientowi, zbiera feedback, poprawia, znowu pokazuje. Dobry gdy klient nie wie dokładnie czego chce.
  • Model iteracyjny (przyrostowy) – buduje system w kolejnych iteracjach, każda dodaje nowe funkcje. Klient dostaje działający produkt szybko, choć niepełny.
  • Agile / Scrum – rodzina metodyk zwinnych. Krótkie sprinty (1–4 tygodnie), ciągłe dostarczanie wartości, adaptacja do zmian. Manifesto Agile: ludzie i interakcje > procesy i narzędzia; działające oprogramowanie > obszerna dokumentacja; współpraca z klientem > negocjowanie umów; reagowanie na zmiany > realizacja planu.
  • RAD (Rapid Application Development) – szybkie tworzenie aplikacji dzięki narzędziom wizualnym, komponentom wielokrotnego użytku i minimalnej dokumentacji. Skupia się na szybkim prototypowaniu i iteracjach z klientem.
Wymagania systemowe
  • Wymagania funkcjonalne – co system ma robić. „Użytkownik może dodać produkt do koszyka.” „System wysyła e-mail po rejestracji.”
  • Wymagania niefunkcjonalne – jak dobrze ma działać. Wydajność: „System obsługuje 200 równoczesnych użytkowników.” Bezpieczeństwo, dostępność (uptime 99,9%), skalowalność, utrzymywalność.
Dokumentacja techniczna
  • README.md – opis projektu, jak zainstalować, jak uruchomić, przykłady użycia. Pierwsza rzecz jaką widzi ktoś odwiedzający repozytorium.
  • CHANGELOG.md – historia zmian z podziałem na wersje. Konwencja Keep a Changelog i Semantic Versioning (MAJOR.MINOR.PATCH).
  • XML Doc (C#) – komentarze /// <summary> generują IntelliSense i dokumentację API automatycznie.
  • Swagger/OpenAPI – automatyczna, interaktywna dokumentacja REST API. Programiści mogą testować endpointy bezpośrednio z przeglądarki.
  • Plan testów – zakres testowania, metody, środowisko, role, harmonogram, kryteria zakończenia (co znaczy „gotowe”).
  • Przypadek testowy – ID, warunki wstępne, dane wejściowe, kroki, wynik oczekiwany, wynik rzeczywisty, status (pass/fail).
Kardynalność w UML: 1 = dokładnie jeden, 0..1 = zero lub jeden (opcjonalny), 1..* = jeden lub więcej, 0..* (lub *) = zero lub więcej. Przykład: Klient 1 → 0..* Zamówienia (jeden klient może mieć wiele lub żadnych zamówień).
12 🤝 Praca zespołowa, komunikacja, Git i CI/CD
Kompetencje personalne i komunikacja
KompetencjaZnaczenie w pracy programisty
OdpowiedzialnośćRealizujesz uzgodnione zadania, informujesz o ryzyku i odpowiadasz za jakość własnej pracy.
Etyka i poufnośćChronisz dane klienta, kod źródłowy, hasła i informacje objęte tajemnicą zawodową.
Zarządzanie czasemDzielisz zadania na mniejsze części, ustalasz priorytety, szacujesz czas i zgłaszasz opóźnienia.
Radzenie sobie ze stresemW sytuacji awarii zachowujesz kolejność działań, komunikujesz fakty i nie ukrywasz błędów.
Rozwój zawodowyAnalizujesz własne braki, korzystasz z dokumentacji i planujesz dalszą naukę.
  • Aktywne słuchanie – parafrazuj wypowiedź rozmówcy, zadawaj pytania doprecyzowujące i upewniaj się, że dobrze rozumiesz wymaganie.
  • Informacja zwrotna – opisuj konkretną sytuację i jej skutek; oceniaj rozwiązanie, nie osobę.
  • Negocjowanie – przedstawiaj ograniczenia, szukaj rozwiązania korzystnego dla projektu i potwierdzaj ustalenia.
  • Rozwiązywanie problemów – zbierz fakty, odtwórz problem, zaproponuj warianty i oceń skutki każdego rozwiązania.
Scrum – szybki przegląd

Scrum to framework zwinny do zarządzania pracą zespołu. Opiera się na krótkich, regularnych cyklach pracy zwanych sprintami.

ElementCo to jest
SprintOgraniczony czasowo okres pracy trwający miesiąc lub krócej. W każdym Sprincie zespół tworzy wartościowy, użyteczny przyrost produktu.
Product Owner (PO)Priorytetyzuje Product Backlog, reprezentuje klienta i użytkowników, decyduje co jest ważne. NIE zarządza zespołem.
Scrum MasterSerwant-lider. Dba o przestrzeganie Scruma, usuwa przeszkody, chroni zespół przed zakłóceniami z zewnątrz. NIE jest kierownikiem projektu.
DevelopersCzłonkowie Scrum Team odpowiedzialni za tworzenie przyrostu. Cały Scrum Team jest samoorganizujący się, wielofunkcyjny i zwykle liczy 10 lub mniej osób.
Daily Scrum15-minutowe codzienne wydarzenie Developers służące sprawdzeniu postępu względem Sprint Goal i dostosowaniu planu. Nie musi odbywać się na stojąco ani według trzech stałych pytań.
Sprint ReviewDemo ukończonych funkcji dla interesariuszy i PO po sprincie. Zbierasz feedback.
Sprint RetrospectiveCo poszło dobrze? Co poprawić? Konkretne działania usprawniające na następny sprint.
Product BacklogŻywa, priorytetyzowana lista wszystkich wymagań i zadań. Utrzymuje PO.
Sprint BacklogPodzbiór Product Backlog wybrany na dany sprint.
Burndown chartPopularny, ale niewymagany przez Scrum Guide wykres pokazujący pozostałą pracę w czasie.
Organizacja pracy małego zespołu
  • Planowanie – określ zakres, rezultaty, zależności, ryzyka, terminy i kryteria ukończenia zadania.
  • Przydział zadań – dopasuj zadania do kompetencji i dostępności osób, zapewniając możliwość konsultacji i rozwoju.
  • Monitorowanie – regularnie sprawdzaj postęp, blokady, jakość rezultatów oraz zgodność z harmonogramem.
  • Dokumentowanie – zapisuj decyzje, wymagania, statusy, wyniki testów i zmiany w sposób dostępny dla zespołu.
  • Ocena jakości – stosuj kryteria akceptacji, code review, testy i retrospektywę, a następnie wprowadzaj usprawnienia.
Git – kluczowe polecenia
  • git init – inicjalizuje nowe repozytorium w bieżącym folderze
  • git add . – dodaje wszystkie zmienione pliki do staging area (poczekalni)
  • git commit -m "Opis" – zapisuje snapshot zmian w lokalnym repozytorium z komentarzem
  • git push – wysyła lokalne commity na zdalny serwer (GitHub, GitLab)
  • git pull – pobiera i scala zmiany ze zdalnego repo do lokalnego
  • git branch nazwa – tworzy nową gałąź
  • git checkout -b nazwa – tworzy i przełącza się na nową gałąź jednocześnie
  • git merge gałąź – scala wskazaną gałąź do bieżącej
  • git log – historia commitów
  • git status – stan roboczego drzewa (które pliki zmienione, które w staging)
  • git reset --soft HEAD~1 – cofa ostatni commit, ale zachowuje zmiany w staging
  • git reset --hard HEAD~1 – cofa ostatni commit i usuwa zmiany (destrukcyjne!)
  • .gitignore – plik z listą plików/folderów ignorowanych przez Git (np. bin/, node_modules/, pliki .env)
  • Pull Request (PR) / Merge Request (MR) – prośba o włączenie gałęzi do głównej. Umożliwia code review przed scaleniem. To jest główny mechanizm współpracy zespołowej w Git.
  • Code Review – inny programista analizuje Twój kod przed mergem. Cel: wykrywanie błędów, poprawa jakości, transfer wiedzy w zespole.
CI/CD i narzędzia projektowe
  • CI (Continuous Integration) – po każdym commit/push automatycznie uruchamia się build i testy. Błędy wykrywane natychmiast. Narzędzia: GitHub Actions, GitLab CI, Jenkins.
  • CD (Continuous Delivery) – przetestowany kod jest gotowy do wdrożenia jednym kliknięciem. CD (Deployment) – wdrożenie odbywa się automatycznie bez ingerencji człowieka.
  • Jira – zarządzanie zadaniami (ticketami), sprint board, backlog. Obsługuje Scrum i Kanban. Integruje się z Git.
  • Kanban – ciągły przepływ zadań przez kolumny (To Do → In Progress → Review → Done). Bez stałych sprintów. Limit WIP (Work In Progress) na każdej kolumnie – zapobiega wielozadaniowości.
  • Diagram Gantta – słupki zadań na osi czasu z zależnościami między nimi. Narzędzie do planowania harmonogramu projektu.
  • Event Storming – warsztat odkrywania domeny biznesowej. Karteczki sticky notes: pomarańczowe = zdarzenia, niebieskie = komendy, żółte = aggregaty. Angażujesz ekspertów domenowych.
13 🔒 Bezpieczeństwo aplikacji
Przykładowe zagrożenia aplikacji
ZagrożenieNa czym polegaPodstawowa ochrona
SQL InjectionWstrzyknięcie kodu SQL przez dane wejścioweParametryzowane zapytania i ORM
XSSUruchomienie złośliwego skryptu w przeglądarceEscapowanie wyjścia i CSP
CSRFWysłanie żądania w imieniu zalogowanego użytkownikaTokeny CSRF i właściwe cookies
MITMPrzechwycenie komunikacji klient–serwerHTTPS/TLS i poprawna walidacja certyfikatu
Brute forceAutomatyczne próby odgadnięcia hasłaRate limiting, MFA i blokady prób

OWASP publikuje aktualizowany dokument OWASP Top 10 opisujący najważniejsze kategorie ryzyka aplikacji webowych. Poniższa tabela zawiera praktyczne przykłady zagrożeń, ale nie jest dosłowną listą OWASP Top 10:2025.

  • SQL Injection – atakujący wstrzykuje fragment SQL przez pole formularza (np. wpisuje ' OR '1'='1). Może odczytać całą bazę, usunąć dane lub ominąć logowanie. Ochrona: parametryzowane zapytania lub ORM (nigdy nie sklejasz SQL ze stringiem!).
  • XSS (Cross-Site Scripting) – atakujący wstrzykuje złośliwy JavaScript do treści strony (np. w komentarzu). Inny użytkownik odwiedza stronę, jego przeglądarka wykonuje skrypt. Ochrona: escapowanie danych wyjściowych, nagłówek Content-Security-Policy (CSP).
  • CSRF (Cross-Site Request Forgery) – złośliwa strona nakłania przeglądarkę zalogowanego użytkownika do wysłania żądania do innej strony (np. przelew bankowy bez wiedzy użytkownika). Ochrona: tokeny CSRF (unikalny token w każdym formularzu, serwer sprawdza).
  • MITM (Man-in-the-Middle) – atakujący wchodzi między klienta a serwer i przechwytuje komunikację (odszyfrować, odczytać, zmienić). Ochrona: HTTPS z ważnym certyfikatem TLS.
  • Brute force – automatyczne próbowanie wszystkich możliwych haseł. Ochrona: rate limiting (ograniczenie ilości prób), CAPTCHA, blokada konta po N próbach, wymaganie silnych haseł.
  • Path Traversal – atakujący wychodzi poza dozwolony katalog przez ../../etc/passwd w ścieżce pliku. Ochrona: walidacja i sanityzacja ścieżek.
Szyfrowanie i mechanizmy ochrony
  • Szyfrowanie symetryczne – ten sam klucz do szyfrowania i deszyfrowania (np. AES). Szybkie, ale problem jak bezpiecznie przekazać klucz drugiej stronie.
  • Szyfrowanie asymetryczne (klucz publiczny/prywatny) – dwa powiązane klucze. Klucz publiczny = możesz go udostępnić każdemu. Klucz prywatny = tylko Ty go znasz. Wiadomość zaszyfrowana kluczem publicznym = tylko Ty możesz odszyfrować kluczem prywatnym. Przykład: RSA. Podstawa TLS/HTTPS.
  • HTTPS + TLS – szyfruje całą komunikację między przeglądarką a serwerem. Certyfikat SSL/TLS weryfikuje tożsamość serwera. Bez HTTPS dane są przesyłane plaintext.
  • Haszowanie haseł (bcrypt) – hasła nigdy nie są przechowywane jako tekst jawny. bcrypt tworzy hash z solą (losowy string dodany przed haszowaniem). Celowo wolny algorytm – utrudnia brute force. NIE używaj MD5 ani SHA1 do haseł (za szybkie, złamane).
  • Funkcja skrótu (hash) – jednokierunkowa. Z danych wejściowych otrzymujesz stały hash. Hash NIE jest odwracalny (nie możesz odzyskać oryginalnych danych). Używana do: weryfikacji integralności plików, przechowywania haseł.
  • JWT (JSON Web Token) – format tokenu: header.payload.signature (Base64URL). Bezstanowa autoryzacja w REST API – serwer nie musi trzymać sesji. Podpis cyfrowy weryfikuje autentyczność. NIE przechowuj wrażliwych danych w payloadzie (jest tylko zakodowany, nie zaszyfrowany!).
  • OAuth 2.0 i OpenID Connect – OAuth 2.0 służy przede wszystkim do delegowanej autoryzacji dostępu do zasobów. Logowanie użytkownika realizuje zwykle OpenID Connect zbudowany na OAuth 2.0.
  • Zasada najmniejszych uprawnień (Least Privilege) – każdy komponent, użytkownik i konto ma tylko minimalne uprawnienia niezbędne do działania. Konto bazy danych aplikacji webowej nie potrzebuje DROP TABLE.
  • CSP (Content-Security-Policy) – nagłówek HTTP ograniczający skąd mogą pochodzić skrypty, style, obrazy. Skuteczna ochrona przed XSS.
  • CORS (Cross-Origin Resource Sharing) – mechanizm nagłówków określający, czy skrypt z innego originu może odczytać odpowiedź. Niektóre proste żądania cross-origin są wysyłane, ale bez właściwych nagłówków odpowiedź nie zostanie udostępniona skryptowi.
Uwierzytelnianie, autoryzacja i kody HTTP
  • Uwierzytelnianie (Authentication)kto to jest? Sprawdzasz tożsamość (login + hasło, biometria, klucz API).
  • Autoryzacja (Authorization)co mu wolno? Sprawdzasz czy zalogowany użytkownik ma prawo do danego zasobu/akcji.
  • 401 Unauthorized – brak uwierzytelnienia (nie zalogowany lub błędne dane). Mylna nazwa – tak naprawdę chodzi o autentykację, nie autoryzację.
  • 403 Forbidden – zalogowany, ale bez uprawnień do zasobu.
  • Walidacja po stronie serwera – zawsze obowiązkowa! Walidacja JavaScript w przeglądarce = tylko dla wygody użytkownika. Atakujący używa Postmana i wysyła żądania z dowolnymi danymi, omijając JS.
  • Sanityzacja danych wejściowych – oczyszczasz dane zanim je wyświetlisz lub zapiszesz. Usuwasz lub escapujesz potencjalnie niebezpieczne znaki.
Złota zasada bezpieczeństwa: nigdy nie ufaj danym od użytkownika. Waliduj i sanityzuj po stronie serwera, zawsze. Dane klienta mogą być sfałszowane.
Egzamin praktyczny INF.04

Jak działa egzamin i co oceniają?

Egzamin zawodowy INF.04 składa się z części pisemnej i praktycznej. Aby zdać, trzeba uzyskać co najmniej 50% punktów z części pisemnej oraz co najmniej 75% z części praktycznej. Wymagania dotyczące plików, rezultatów i dokumentacji zawsze sprawdzaj w konkretnym arkuszu.

📋 Struktura egzaminu praktycznego – co i ile czasu
ElementNajważniejsza informacja
Część pisemna40 zadań zamkniętych. Do zaliczenia potrzeba co najmniej 50% punktów.
Część praktyczna INF.04Zadanie wykonywane przy komputerze. Czas przewidziany dla kwalifikacji INF.04: 180 minut.
Próg części praktycznejCo najmniej 75% możliwych do uzyskania punktów.
Technologia i środowiskoWynikają z arkusza, wyposażenia stanowiska oraz informacji dotyczących danej sesji egzaminacyjnej.
Rezultaty, pliki i zrzutyPrzygotowujesz dokładnie te elementy, których wymaga arkusz. Nie zakładaj z góry nazw folderów ani liczby zrzutów.
Najważniejsza zasada: przed rozpoczęciem pracy przeczytaj cały arkusz, zaznacz oceniane rezultaty i wykonuj polecenia zgodnie z ich brzmieniem. Działający program jest ważny, ale egzaminator ocenia konkretne rezultaty wskazane w zasadach oceniania.
📁 Jak przygotować folder z pracą egzaminacyjną
Struktura folderu
  • Najpierw sprawdź arkusz – nazwa folderu, miejsce zapisu i wymagane podfoldery mogą różnić się między zadaniami i sesjami.
  • Zapisz cały projekt wraz z plikiem projektu, kodem źródłowym i zasobami potrzebnymi do uruchomienia.
  • Dodaj zrzuty ekranu, dokumentację lub inne rezultaty tylko wtedy, gdy wymaga ich arkusz.
  • Stosuj dokładne nazwy plików i formaty podane w poleceniu.
Co zapisujesz na pendrive / w systemie egzaminacyjnym
  • Komplet rezultatów wskazanych w arkuszu, zapisanych we właściwym miejscu.
  • Projekt możliwy do otwarcia i uruchomienia w środowisku egzaminacyjnym.
  • Zrzuty, dokumentację lub eksport danych, jeśli zostały wymienione w poleceniach.
Pro tip: co kilka minut zapisuj pracę (Ctrl+S). Krach systemu to nie usprawiedliwienie dla braku pliku.
💬 Jak pisać komentarze w kodzie na egzaminie
Wymagania dotyczące komentarzy
  • Dodaj komentarze dokładnie tam, gdzie wymaga ich arkusz. Nie zakładaj, że każda metoda zawsze musi mieć komentarz.
  • Pisz jasno i zwięźle, opisując cel metody lub istotnego fragmentu kodu.
  • W C# możesz zastosować zwykły komentarz lub XML Doc ///, jeśli pasuje do wymagań zadania.
Przykład komentarzy w C#

// Komentarz jednolinijkowy – krótkie wyjaśnienie
 
/* Komentarz wielolinijkowy
   używaj gdy wyjaśnienie jest dłuższe */
 
/// <summary>
/// Pobiera listę wszystkich produktów z bazy danych.
/// </summary>
/// <returns>Lista obiektów Produkt</returns>
public List<Produkt> PobierzProdukty() { ... }
Zasada: komentuj dlaczego coś robisz, nie co robisz (kod mówi co). Ale na egzaminie – komentuj wszystko co wymaga arkusz.
📸 Jak robić zrzuty ekranu
  • Alt + Print Screen – zrzut aktywnego okna (najczęściej używasz tego).
  • Print Screen – zrzut całego ekranu.
  • Win + Shift + S – narzędzie wycinania (wybierasz obszar). Wygodne ale sprawdź czy jest dostępne.
  • Zapisujesz do Paintu (Ctrl+V → Ctrl+S) lub wklejasz do Worda/LibreOffice.
  • Formaty: PNG lub JPG. Plik nazywasz opisowo: 01_widok_glowny.png, 02_wynik_dzialania.png.
Co musi być widoczne na zrzucie

Jeśli arkusz wymaga zrzutów, pokaż na nich dokładnie rezultat wskazany w poleceniu.

  • Działające okno aplikacji z danymi (nie pusty formularz!).
  • Wynik działania – np. po kliknięciu przycisku widać efekt (lista załadowana, wynik obliczenia, komunikat).
  • Jeśli wymagany jest pasek tytułowy – niech będzie widoczny z nazwą okna.
Najczęstszy błąd: zrzut nie pokazuje rezultatu wymaganego w poleceniu albo jest nieczytelny. Przed zapisaniem sprawdź nazwę pliku, zakres obrazu i widoczność wyniku.
📄 Dokumentacja aplikacji – co i jak pisać
Elementy dokumentacji na egzaminie
  • Cel i opis aplikacji – kilka zdań czym jest aplikacja i co robi.
  • Wymagania systemowe – system operacyjny, .NET w jakiej wersji, baza danych (jeśli używasz).
  • Opis interfejsu – jakie formularze/okna ma aplikacja i do czego służą.
  • Instrukcja obsługi – krok po kroku jak korzystać z aplikacji (z odwołaniem do zrzutów).
  • Opis działania kluczowych funkcji – np. „Przycisk Zapisz wywołuje metodę ZapiszDoBazy() która…”.
  • Struktura projektu – jakie klasy/pliki, co robią.
Styl dokumentacji
  • Piszesz pełnymi zdaniami, jasno i zwięźle.
  • Używasz nagłówków dla każdej sekcji.
  • Odwołujesz się do zrzutów ekranu: „Jak pokazano na Rysunku 1…”.
  • Nie kopiujesz kodu do dokumentacji – opisujesz go słowami.
Zasada: zakres, format i objętość dokumentacji wynikają z arkusza. Jeśli dokumentacja nie jest ocenianym rezultatem, skup się na elementach rzeczywiście wymaganych w zadaniu.
🎯 Typy zadań na egzaminie – co najczęściej się pojawia
Ważne: zakres zadań i dostępne środowisko mogą zmieniać się między sesjami. Poniższe przykłady traktuj jako kierunki ćwiczeń, a nie zamkniętą listę tego, co na pewno pojawi się w arkuszu.
Aplikacja konsolowa (C#)
  • Wczytanie danych od użytkownika, obliczenia, wyświetlenie wyników.
  • Praca z tablicami, listami, słownikami.
  • Sortowanie, filtrowanie, wyszukiwanie.
  • Obsługa pliku tekstowego (zapis/odczyt).
  • Klasy z właściwościami, konstruktorem i metodami.
Aplikacja okienkowa (WinForms / WPF)
  • Formularz lub okno z kontrolkami, np. TextBox, Button, ComboBox oraz DataGridView w WinForms albo DataGrid w WPF.
  • Operacje CRUD: dodawanie, wyświetlanie, edycja, usuwanie rekordów.
  • Połączenie z bazą SQLite lub SQL Server (lub plikami tekstowymi).
  • Walidacja danych (czy pole niepuste, czy liczba itp.).
  • Wyświetlanie wyników w DataGridView dla WinForms, DataGrid dla WPF albo w kontrolce listy.
Zaawansowana aplikacja webowa
  • Komponenty lub widoki, formularze, walidacja i routing w wybranym frameworku.
  • Komunikacja z backendem, przetwarzanie JSON oraz wyświetlanie danych z bazy.
  • Sesje, cookies, logowanie, kontrola dostępu i funkcje właściwe dla wskazanego typu serwisu.
Strategia na egzaminie
  • Najpierw przeczytaj cały arkusz. Zaplanuj co robisz w jakiej kolejności.
  • Zacznij od najprostszych poleceń – zbierasz punkty.
  • Jeśli arkusz wymaga zrzutów, wykonuj je po uzyskaniu właściwego rezultatu, nie odkładaj ich na ostatnią chwilę.
  • Aplikacja musi się kompilować i uruchamiać. Lepiej działająca część niż niedziałająca całość.
  • Zostaw 10–15 minut na koniec na przegląd i dokumentację.
Złota zasada: realizuj oceniane rezultaty w kolejności, regularnie zapisuj pracę i zostaw czas na sprawdzenie zgodności z arkuszem.
Sprawdź się

Test wiedzy INF.04 – 280 pytań

Przerobiłeś teorię? Czas sprawdzić ile zapamiętałeś. Tryb nauki z kategoriami albo losowy test 40 pytań jak na prawdziwym egzaminie.

📖
Tryb nauki

Wybierasz kategorię z bocznego menu i przerabiasz pytania jedno po drugim. Po każdej odpowiedzi widzisz wyjaśnienie.

🎯
Tryb egzaminu

40 losowych pytań ze wszystkich działów. Brak cofania. Na końcu wynik i ocena czy przekroczono próg 50%.

bitedu.pl · INF.04
Przejdź do bazy pytań egzaminacyjnych →
280 pytań · 13 kategorii · tryb nauki + egzamin

BITEDU.PL · INF.04 · Tekst aktualizowany zgodnie z podstawą programową dla technika programisty