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 ›
- 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.
- 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).
- 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).
S·02 📐 Typy danych w C# i kiedy który wybrać ›
| Typ | Rozmiar | Zakres / opis | Kiedy używać |
|---|---|---|---|
int | 4 B | –2 147 483 648 do 2 147 483 647 | Domyślny wybór dla liczb całkowitych |
long | 8 B | ok. ±9,2 × 10¹⁸ | Gdy int za mały (duże ID, czas Unix) |
double | 8 B | ok. 15–17 cyfr znaczących | Obliczenia naukowe, fizyka, geometria |
float | 4 B | ok. 6–9 cyfr znaczących | Grafika 3D, gdy liczy się pamięć |
decimal | 16 B | 28–29 cyfr znaczących; ogranicza typowe błędy reprezentacji dziesiętnej, ale nadal ma skończoną precyzję | Pieniądze, finanse, podatki |
byte | 1 B | 0–255 | Bajty, kolory RGB, dane binarne |
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 jednymchar, 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.
- 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.
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 ›
int.Parse("42")– konwertuje string na int. RzucaFormatExceptiongdy string nie jest liczbą. Używaj gdy jesteś pewny danych.int.TryParse("42", out int wynik)– bezpieczna wersja. Zwracatrue/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żyjCultureInfo.InvariantCulturedla kropki.Convert.ToInt32()– toleruje null (zwraca 0), obsługuje bool i inne typy. Wolniejszy od Parse.
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.
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 ›
- 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.
- 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(lubreturn).default= else. - switch expression (C# 8+):
string opis = dzien switch { 1 => "Pon", 2 => "Wt", _ => "Inny" };. Zwięźlejsze, bez break.
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 ›
- 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.
- 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).
- Ta sama nazwa metody, różne parametry.
Powitaj(string imie)iPowitaj(string imie, int wiek)– obie mogą istnieć obok siebie. - Kompilator wybiera wersję na podstawie typów i liczby argumentów przy wywołaniu.
S·06 📦 Tablice i kolekcje (List, Dictionary) ›
- Deklaracja i inicjalizacja:
int[] oceny = new int[5];lubint[] 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.
- 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ę.
- 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 zapisslownik[klucz] = wartoscdodaje nowy wpis albo aktualizuje istniejący.
.Length, listy mają .Count. Mały szczegół który potrafi pogrążyć w stresie egzaminacyjnym.S·07 💾 Obsługa plików tekstowych i JSON ›
- 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);lubFile.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.
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
usingautomatycznie zwalnia zasób po wyjściu z bloku, także przy obsługiwanym wyjątku. Stosuj go dla obiektów implementującychIDisposable.
- 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).
S·08 ⚠️ Obsługa wyjątków (try-catch-finally) ›
- 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śćMessagezawiera opis błędu po ludzku.
| Wyjątek | Kiedy powstaje | Jak zapobiec |
|---|---|---|
NullReferenceException | Wywołanie metody na null | Sprawdź if (obj != null) lub użyj ?. |
FormatException | int.Parse(„abc”) | Użyj TryParse zamiast Parse |
IndexOutOfRangeException | tab[tab.Length] | Warunek i < tab.Length, nie <= |
DivideByZeroException | x / 0 (dla int) | Sprawdź mianownik przed dzieleniem |
FileNotFoundException | File.ReadAllText(„brak.txt”) | File.Exists() przed odczytem |
StackOverflowException | Rekurencja bez warunku stopu | Zawsze definiuj base case |
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ń.
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ą.
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.
- 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.
- 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
usingzamknie automatycznie). - Alternatywa: Entity Framework Core – zamiast SQL piszesz LINQ w C#, ORM generuje SQL za Ciebie.
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.
- 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">. Atrybutnameto 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.
- 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-boxsprawia że padding i border są wliczone w zadeklarowaną szerokość – używaj zawsze. - Flexbox:
display: flexna rodzicu.justify-contentwyrównuje wzdłuż osi głównej, aalign-itemswzdłuż osi poprzecznej. Kierunek osi głównej zmieniaflex-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).
@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.
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.
00 🧭 Podstawy informatyki, sieci, dostępność i normy ›
| Element | Rola i ważne parametry |
|---|---|
| CPU | Wykonuje instrukcje programu. Ważne są m.in. architektura, liczba rdzeni i wątków, taktowanie, pamięć cache oraz pobór energii. |
| RAM | Szybka pamięć robocza używana przez działające programy. Po wyłączeniu zasilania jej zawartość znika. |
| SSD / HDD | Pamięć trwała. SSD ma znacznie krótszy czas dostępu; znaczenie mają pojemność, interfejs i szybkość odczytu/zapisu. |
| GPU | Wykonuje obliczenia równoległe związane z grafiką, multimediami oraz częścią obliczeń naukowych i AI. |
| System operacyjny | Zarządza procesami, pamięcią, plikami, urządzeniami i uprawnieniami oraz udostępnia aplikacjom usługi systemowe. |
| Pojęcie | Znaczenie |
|---|---|
| Adres IP | Identyfikuje interfejs urządzenia w sieci IP. IPv4 ma 32 bity, IPv6 ma 128 bitów. |
| Maska / prefiks | Określa część sieciową adresu, np. 192.168.1.0/24. |
| DNS | Tłumaczy nazwy domenowe na adresy IP. |
| TCP | Zapewnia połączeniowy, uporządkowany i niezawodny strumień danych. |
| UDP | Przesyła datagramy bez gwarancji dostarczenia; ma mały narzut i sprawdza się m.in. w transmisji czasu rzeczywistego. |
| HTTP / HTTPS | Protokoły komunikacji aplikacji webowych; HTTPS chroni transmisję za pomocą TLS. |
| Przepustowość i opóźnienie | Przepustowość określa ilość danych na jednostkę czasu, a opóźnienie czas potrzebny na przesłanie 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.
| Zasada | Przykł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. |
- 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 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.
Na egzaminie bardzo często pojawia się pytanie o to, do jakiej kategorii należy dane zagrożenie. Zapamiętaj cztery kategorie:
| Kategoria | Przykłady |
|---|---|
| Fizyczne | Hałas, drgania (wibracje), temperatura (za wysoka lub za niska), promieniowanie (podczerwone, UV, elektromagnetyczne), oświetlenie |
| Chemiczne | Substancje toksyczne, żrące, drażniące (np. tusze drukarek, środki czyszczące) |
| Biologiczne | Bakterie, wirusy, grzyby (np. pleśń w klimatyzacji) |
| Psychofizyczne | Stres, monotonia pracy, praca w wymuszonych pozycjach ciała, praca nierytmiczna, presja czasu, wypalenie zawodowe |
- 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.
- 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.
- 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).
- 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!).
- 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.
| Typ gaśnicy | Do czego służy | Elektryka? |
|---|---|---|
| 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 |
| Pianowa | Materiały stałe, ciecze palne | Tylko jeśli oznaczenie producenta dopuszcza gaszenie urządzeń pod określonym napięciem i z wymaganej odległości |
| Wodna | Materiał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 |
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ą).
- 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.
- 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.
02 🗂️ Typy aplikacji, etapy powstawania i cykl życia ›
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.
| Typ | Gdzie działa | Przykłady technologii | Przykłady |
|---|---|---|---|
| Konsolowa | Terminal / wiersz poleceń | C#, Python, Java | git, npm, skrypty automatyzacji |
| Desktopowa | Lokalnie na komputerze | WinForms, WPF, .NET MAUI, JavaFX | VS Code, Notepad++, VLC |
| Webowa | Przeglądarka / serwer | HTML/CSS/JS, Angular, React, ASP.NET | Gmail, Allegro, systemy szkolne |
| Mobilna | Smartfon / tablet | Android (Kotlin), iOS (Swift), Flutter, .NET MAUI | WhatsApp, Instagram, Uber |
| Wbudowana (embedded) | Mikrokontroler / urządzenie | C, C++, Assembly | oprogramowanie drukarki, sterownik PLC |
| Usługi / API | Serwer (bez UI) | ASP.NET Core, Node.js, Spring | backend dla aplikacji mobilnych, mikroserwisy |
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.
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ę zdarzenieForm.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.
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.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.
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).
03 🔢 Algorytmy i struktury danych ›
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.
| Notacja | Nazwa | Przykład |
|---|---|---|
O(1) | Stała | Dostęp do tablicy po indeksie (tab[5]) |
O(log n) | Logarytmiczna | Binary search (wyszukiwanie binarne) |
O(n) | Liniowa | Przejście przez całą listę raz |
O(n log n) | Liniowo-logarytmiczna | Merge sort, Quick sort (średnio) |
O(n²) | Kwadratowa | Bubble sort, dwie zagnieżdżone pętle po n elementów |
O(2ⁿ) | Wykładnicza | Brute-force wszystkich podzbiorów – katastrofalnie wolne |
- 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.
- 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 – 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.
| Grupa | Przykład i zastosowanie |
|---|---|
| Tekstowe | Wyszukiwanie wzorca, zliczanie znaków, sprawdzanie palindromu i przetwarzanie napisów. |
| Tablicowe | Minimum, maksimum, suma, sortowanie, wyszukiwanie i filtrowanie elementów. |
| Kryptograficzne | Szyfr Cezara, XOR jako ćwiczenie oraz funkcje skrótu i szyfrowanie stosowane w rzeczywistych systemach. |
| Heurystyczne | Szukają dobrego rozwiązania szybciej, ale nie zawsze gwarantują rozwiązanie optymalne. |
| Problem komiwojażera | Wyznaczenie najkrótszej trasy odwiedzającej wszystkie punkty; przykład problemu trudnego obliczeniowo. |
04 🧩 Programowanie obiektowe (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 kluczowebaseodwoł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
virtualioverride; 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.
- 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)piszeszif (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.
| Pojęcie | Poprawne rozumienie |
|---|---|
| Kompilator | Tłumaczy kod źródłowy do innej postaci przed uruchomieniem, np. C# do kodu pośredniego IL. |
| Interpreter / środowisko wykonawcze | Wykonuje kod lub jego postać pośrednią podczas działania programu. .NET korzysta m.in. z CLR i kompilacji JIT. |
| Debugger | Pozwala zatrzymywać program, wykonywać go krokowo oraz obserwować zmienne, stos wywołań i wyjątki. |
| Konstruktor kopiujący | W 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 / finalizer | W C# finalizer jest uruchamiany niedeterministycznie przez mechanizm odśmiecania. Zasoby zwalniaj zwykle przez IDisposable i using. |
| friend i szablony | friend oraz templates są pojęciami C++. Najbliższym odpowiednikiem szablonów w C# są typy generyczne. |
| Słowo | Znaczenie |
|---|---|
static | Należy do klasy, nie do instancji. Można wywołać bez tworzenia obiektu. Współdzielone przez wszystkie obiekty klasy. |
readonly | Pole przypisywane tylko w deklaracji lub konstruktorze. Nie można zmienić potem. |
virtual / override | virtual w bazowej = metoda może być nadpisana. override w pochodnej = nadpisuję tę metodę. |
sealed | Klasa nie może być dziedziczona. Lub: metoda override nie może być nadpisana dalej. |
base | Odwołanie do klasy bazowej (np. base.MetodaBazowa() lub base(param) w konstruktorze). |
protected | Dostęp w obrębie klasy i klas pochodnych. Niedostępny z zewnątrz. |
this | Odwołanie do bieżącej instancji obiektu. |
abstract | Metoda bez implementacji – wymaga nadpisania w klasie pochodnej. |
- 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). - Generyki –
List<T>,Dictionary<K,V>. Piszesz kod raz, działa bezpiecznie dla każdego typu. T to placeholder na typ. - LINQ –
lista.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
TasklubTask<T>. - try/catch/finally – obsługa wyjątków.
NullReferenceException= wywołanie metody na obiekcie null.finallywykonuje się zawsze, nawet po wyjątku.
+= 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 ›
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.
| Litera | Zasada | Co oznacza w praktyce |
|---|---|---|
| S | Single Responsibility | Jedna klasa = jeden powód do zmiany. Klasa obsługująca zamówienia NIE powinna jednocześnie obsługiwać e-maili i logów. |
| O | Open/Closed | Otwarta na rozszerzenie, zamknięta na modyfikację. Dodajesz nowe funkcje przez nowe klasy, nie modyfikując istniejących. |
| L | Liskov Substitution | Obiekt klasy pochodnej możesz podstawić wszędzie tam, gdzie oczekiwany jest obiekt klasy bazowej – i program nadal działa poprawnie. |
| I | Interface Segregation | Lepiej wiele małych interfejsów niż jeden ogromny. Klasa nie powinna być zmuszana do implementowania metod, których nie używa. |
| D | Dependency Inversion | Zależysz od abstrakcji (interfejsów), nie od konkretnych implementacji. Zamiast tworzyć obiekt wewnątrz klasy, wstrzykujesz go przez konstruktor (Dependency Injection). |
- 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.
- 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.
Where(x => warunek)– filtruje, zostawia tylko elementy spełniające warunekSelect(x => przekształcenie)– przekształca każdy element (jak map w funkcyjnym)OrderBy(x => klucz)/OrderByDescending()– sortujeFirstOrDefault(x => warunek)– pierwszy pasujący element lub wartość domyślna typu, np.nulldla klasy albo0dlaintAny(x => warunek)– czy istnieje jakikolwiek pasujący element (bool)Count(x => warunek)– ile elementów spełnia warunekGroupBy(x => klucz)– grupuje elementyToList()/ToArray()– materializuje wynik zapytania
06 🖥️ Aplikacje desktopowe (WinForms i WPF) ›
| Technologia | Interfejs | Najważniejszy model pracy | Główne zastosowanie |
|---|---|---|---|
| WinForms | Projektant formularzy i kontrolki | Zdarzenia oraz code-behind | Klasyczne aplikacje Windows |
| WPF | XAML, style i binding | Code-behind lub MVVM | Rozbudowane aplikacje Windows |
| .NET MAUI | XAML i kontrolki wieloplatformowe | Code-behind lub MVVM | Aplikacje 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()lubBeginInvoke(). W nowym kodzie często wygodniej użyćasync/awaiti 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.
- 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
PropertyChangedinformuje 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.
- .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.
07 🌐 Ekosystem webowy: JS, TypeScript, Node.js, Angular, React, Bootstrap ›
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łasnegothis– ważne przy callbackach. - async / await:
const dane = await fetch(url). Asynchroniczne operacje (żądania HTTP, odczyt pliku) bez blokowania wątku. Metoda musi być oznaczonaasync. - Promise: obiekt reprezentujący wynik asynchronicznej operacji, który nastąpi w przyszłości.
then()/catch()lubawait. - 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();
- 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: flexna 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, potemcolor: var(--kolor-glowny). Łatwa zmiana motywu w całym projekcie.
- 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 – ś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 przeznpm 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 – 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.
- Routing –
RouterModule. 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).
*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 (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łaniesetLicznik(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 – 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 | React | |
|---|---|---|
| Typ | Pełny framework | Biblioteka UI |
| Język | TypeScript (obowiązkowy) | JS lub TS (opcjonalnie) |
| Twórca | Meta (Facebook) | |
| Składnia szablonów | HTML + dyrektywy Angular | JSX (JS + HTML) |
| Zarządzanie stanem | Wbudowane serwisy + RxJS | useState, useReducer + Redux/Zustand |
| Routing | Wbudowany RouterModule | zewnętrzny React Router |
| CLI | Angular CLI (ng) | Vite, Create React App |
| Krzywa uczenia | Stroma (dużo konceptów) | Łagodniejsza (zaczynasz od hooks) |
| Element | Co trzeba umieć w INF.04 |
|---|---|
| Backend | Tworzyć endpointy w wybranym frameworku, np. ASP.NET Core, Node.js albo Django, przyjmować dane, walidować je i zwracać odpowiedzi. |
| REST API | Projektować zasoby i używać metod HTTP, kodów odpowiedzi oraz JSON do komunikacji front-endu z serwerem. |
| Baza danych | Wykonywać operacje CRUD, łączyć rekordy relacjami i bezpiecznie przekazywać parametry zapytań. |
| Sesja i cookies | Rozumieć, że cookie jest przechowywane po stronie klienta, a sesja zwykle przechowuje dane po stronie serwera pod identyfikatorem przesyłanym w cookie. |
| Logowanie i dostęp | Rozróżniać uwierzytelnianie od autoryzacji, chronić trasy i funkcje oraz nie przechowywać haseł jako tekst jawny. |
| Projekt domenowy | Umieć stworzyć funkcje typowe dla sklepu, rezerwacji, serwisu ogłoszeniowego lub społecznościowego. |
08 📱 Aplikacje mobilne (cross-platform i web mobile) ›
| Typ | Język/Technologia | Cechy |
|---|---|---|
| Natywna iOS | Swift (lub Objective-C) | Najlepsza wydajność, pełny dostęp do API Apple, tylko dla iOS |
| Natywna Android | Kotlin lub Java | Najlepsza wydajność, pełny dostęp do API Google, tylko dla Android |
| Cross-platform | Flutter (Dart), .NET MAUI (C#), React Native (JS) | Jedna baza kodu, kilka platform, kompromis między wydajnością a wygodą |
| Hybrydowa | Ionic, Cordova (HTML w WebView) | Webowa aplikacja opakowana w kontener natywny. Łatwa do pisania, najgorsza wydajność. |
| PWA (Progressive Web App) | HTML/CSS/JS + Service Worker | Działa w przeglądarce, może działać offline (Service Worker cachuje zasoby), instalowalna bez sklepu. |
- 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 – 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.
| Obszar | Przykładowe wykonanie |
|---|---|
| Dane i ustawienia | Pliki, JSON, Preferences/SecureStorage oraz lokalna baza SQLite. |
| Nawigacja i formularze | Wiele ekranów, listy, dialogi, walidacja danych i pasek narzędzi. |
| Internet | Pobieranie i wysyłanie danych przez HTTP/REST, obsługa błędów i braku połączenia. |
| Funkcje urządzenia | Lokalizacja, powiadomienia, multimedia, zegar, kalendarz i uprawnienia użytkownika. |
| Dostosowanie platformowe | Uwzględnianie różnic Android/iOS/Windows, rozmiaru ekranu i zachowania kontrolek. |
| Publikacja | Konfiguracja identyfikatora, wersji, ikon, podpisu oraz przygotowanie pakietu publikacyjnego. |
09 🤖 Android – cykl życia, komponenty, Jetpack ›
| Metoda | Stan ekranu | Typowe zadanie |
|---|---|---|
onCreate() | Tworzony | Budowa UI i inicjalizacja danych |
onStart() / onResume() | Widoczny i aktywny | Wznowienie interakcji, animacji i zasobów |
onPause() / onStop() | Traci aktywność lub znika | Zapis stanu i zwolnienie zasobów |
onDestroy() | Niszczony | Koń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!
- 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_VIEWdla 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).
- 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
@Composableopisują jak wygląda UI, a nie jak je zbudować krok po kroku.
- 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.
10 🧪 Testowanie oprogramowania ›
| Rodzaj | Zakres | Szybkość | Ile zwykle |
|---|---|---|---|
| Jednostkowe | Pojedyncza metoda lub klasa | Bardzo szybkie | Najwięcej |
| Integracyjne | Współpraca modułów | Średnie | Mniej |
| E2E | Cały scenariusz użytkownika | Najwolniejsze | Najmniej |
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.
- 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.
- 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.
| Etap | Rezultat |
|---|---|
| Planowanie | Zakres, środowisko, rodzaje testów, odpowiedzialności i kryteria zakończenia. |
| Projektowanie | Scenariusze i przypadki testowe obejmujące dane poprawne, błędne oraz wartości brzegowe. |
| Wykonanie | Wyniki rzeczywiste, status pass/fail, dowody wykonania oraz raporty błędów. |
| Testy niefunkcjonalne | Wydajność, obciążenie, bezpieczeństwo, kompatybilność, użyteczność i dostępność interfejsu. |
| Automatyzacja | Powtarzalne testy jednostkowe, integracyjne lub UI uruchamiane lokalnie albo w CI. |
| Dokumentacja | Komentarze kodu, dokumentacja techniczna, instrukcja użytkownika, instrukcja wdrożenia i historia zmian. |
11 📐 UML, dokumentacja projektowa i modele SDLC ›
| Diagram | Do czego służy |
|---|---|
| Klas | Statyczna struktura systemu: klasy, atrybuty, metody, relacje między nimi. + = public, – = private, # = protected. |
| Przypadków użycia | Kto (aktorzy) korzysta z jakich funkcji systemu. «include» = obowiązkowe włączenie (zawsze wykonywane). «extend» = opcjonalne rozszerzenie (w pewnych warunkach). |
| Sekwencji | Komunikaty między obiektami w określonej kolejności czasowej. „Kto do kogo wysyła wiadomość i kiedy?” |
| Aktywności | Przepływ czynności i decyzji. Rozbudowany schemat blokowy. Używasz do modelowania procesów biznesowych lub algorytmów. |
| Stanów | Stany obiektu i przejścia między nimi. Np. zamówienie: Nowe → Zatwierdzone → Wysłane → Dostarczone → Anulowane. |
| Wdrożenia | Jak 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. |
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 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ść.
- 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).
12 🤝 Praca zespołowa, komunikacja, Git i CI/CD ›
| Kompetencja | Znaczenie 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 czasem | Dzielisz zadania na mniejsze części, ustalasz priorytety, szacujesz czas i zgłaszasz opóźnienia. |
| Radzenie sobie ze stresem | W sytuacji awarii zachowujesz kolejność działań, komunikujesz fakty i nie ukrywasz błędów. |
| Rozwój zawodowy | Analizujesz 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 to framework zwinny do zarządzania pracą zespołu. Opiera się na krótkich, regularnych cyklach pracy zwanych sprintami.
| Element | Co to jest |
|---|---|
| Sprint | Ograniczony 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 Master | Serwant-lider. Dba o przestrzeganie Scruma, usuwa przeszkody, chroni zespół przed zakłóceniami z zewnątrz. NIE jest kierownikiem projektu. |
| Developers | Czł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 Scrum | 15-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 Review | Demo ukończonych funkcji dla interesariuszy i PO po sprincie. Zbierasz feedback. |
| Sprint Retrospective | Co 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 Backlog | Podzbiór Product Backlog wybrany na dany sprint. |
| Burndown chart | Popularny, ale niewymagany przez Scrum Guide wykres pokazujący pozostałą pracę w czasie. |
- 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 init– inicjalizuje nowe repozytorium w bieżącym folderzegit add .– dodaje wszystkie zmienione pliki do staging area (poczekalni)git commit -m "Opis"– zapisuje snapshot zmian w lokalnym repozytorium z komentarzemgit push– wysyła lokalne commity na zdalny serwer (GitHub, GitLab)git pull– pobiera i scala zmiany ze zdalnego repo do lokalnegogit branch nazwa– tworzy nową gałąźgit checkout -b nazwa– tworzy i przełącza się na nową gałąź jednocześniegit merge gałąź– scala wskazaną gałąź do bieżącejgit log– historia commitówgit status– stan roboczego drzewa (które pliki zmienione, które w staging)git reset --soft HEAD~1– cofa ostatni commit, ale zachowuje zmiany w staginggit 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 (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 ›
| Zagrożenie | Na czym polega | Podstawowa ochrona |
|---|---|---|
| SQL Injection | Wstrzyknięcie kodu SQL przez dane wejściowe | Parametryzowane zapytania i ORM |
| XSS | Uruchomienie złośliwego skryptu w przeglądarce | Escapowanie wyjścia i CSP |
| CSRF | Wysłanie żądania w imieniu zalogowanego użytkownika | Tokeny CSRF i właściwe cookies |
| MITM | Przechwycenie komunikacji klient–serwer | HTTPS/TLS i poprawna walidacja certyfikatu |
| Brute force | Automatyczne próby odgadnięcia hasła | Rate 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/passwdw ścieżce pliku. Ochrona: walidacja i sanityzacja ścieżek.
- 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 (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.
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 ›
| Element | Najważniejsza informacja |
|---|---|
| Część pisemna | 40 zadań zamkniętych. Do zaliczenia potrzeba co najmniej 50% punktów. |
| Część praktyczna INF.04 | Zadanie wykonywane przy komputerze. Czas przewidziany dla kwalifikacji INF.04: 180 minut. |
| Próg części praktycznej | Co najmniej 75% możliwych do uzyskania punktów. |
| Technologia i środowisko | Wynikają z arkusza, wyposażenia stanowiska oraz informacji dotyczących danej sesji egzaminacyjnej. |
| Rezultaty, pliki i zrzuty | Przygotowujesz dokładnie te elementy, których wymaga arkusz. Nie zakładaj z góry nazw folderów ani liczby zrzutów. |
📁 Jak przygotować folder z pracą egzaminacyjną ›
- 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.
- 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.
💬 Jak pisać komentarze w kodzie na egzaminie ›
- 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.
// 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() { ... }
📸 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.
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.
📄 Dokumentacja aplikacji – co i jak pisać ›
- 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ą.
- 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.
🎯 Typy zadań na egzaminie – co najczęściej się pojawia ›
- 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.
- 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.
- 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.
- 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ę.
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.
Wybierasz kategorię z bocznego menu i przerabiasz pytania jedno po drugim. Po każdej odpowiedzi widzisz wyjaśnienie.
40 losowych pytań ze wszystkich działów. Brak cofania. Na końcu wynik i ocena czy przekroczono próg 50%.
BITEDU.PL · INF.04 · Tekst aktualizowany zgodnie z podstawą programową dla technika programisty