Pisz zrozumiały kod w C!
Poznaj dobre praktyki i używaj odpowiednich narzędzi!
KURS
C DLA ZAAWANSOWANYCH

Aktualnie zapisy do kursu są zamknięte.
Zapisz się na listę oczekujących, aby nie przegapić kolejnego otwarcia.

ZAPISUJĘ SIĘ NA LISTĘ OCZEKUJĄCYCH!

Czy ten kurs jest dla Ciebie?

TAK, jeżeli:

  • Umiesz już pisać w C i masz za sobą pierwsze projekty
  • Wiążesz z programowaniem swoją karierę zawodową
  • Chcesz wiedzieć, co się dzieje pod maską
  • Chcesz zdobyć solidną wiedzę na lata, wyrobić dobre praktyki i używać odpowiednich narzędzi
  • Chcesz mieć wszystkie najważniejsze informacje w jednym miejscu

NIE, jeżeli:

  • Dopiero zaczynasz programować - pewnie treści będą dla Ciebie zbyt trudne. Lepiej zacząć od darmowych materiałów w internecie.
  • Jesteś ekspertem z wieloletnim doświadczeniem - pewnie nie jestem w stanie Cię nauczyć niczego nowego.

Jeśli jesteś doświadczonym programistą, to znasz wiele tematów poruszanych w kursie, ale pewnie znajdziesz też trochę nowych informacji.

Twój prowadzący

Nazywam się Maciek Gajdzica i jestem programistą embedded od 2012 roku. Przez ten czas poznałem na własnej skórze skutki zbyt sprytnego kodu, czy nadmiernego uzależnienia od narzędzi, których działania do końca nie rozumiałem.

Nauczyłem się wspomagać różnymi narzędziami i technikami zmniejszającymi ilość błędów, czy automatyzującymi żmudne czynności. Miałem również trudności ze znalezieniem materiałów do nauki na bardziej zaawansowanym poziomie.

Dlatego teraz sam takie materiały tworzę i dzięki temu Ty nie musisz popełniać moich błędów.

W ciągu ostatnich kilku lat powstało:

Co znajdziesz w kursie?

Zakamarki składni

Nieraz wydaje nam się, że C to prosty język. Wystarczy, że nauczymy się kilku podstawowych komend i już możemy pisać większe programy. Jednak niektóre elementy składni są często pomijane albo niewłaściwie używane. W kursie się nimi szczegółowo zajmujemy.

Skupienie na szczegółach

C pozwala na wiele, ale często wewnątrz dzieje się magia. Wspólnie ją odczarujemy analizując kod w kompilatorze online. W pierwszych tygodniach kursu będzie go bardzo dużo. Zobaczysz na przykładach, co robi undefined behavior, czy co zmieniają poszczególne flagi kompilatora.

Praktyczne wskazówki

Dowiesz się nie tylko jak coś działa, ale też kiedy tego używać, jakie ma mocne i słabe strony. Poznasz dobre praktyki i typowe zastosowania poszczególnych elementów składni, koncepcji, czy narzędzi.  

Narzędzia ułatwiające pracę

Wyjdziemy poza sam język C i zajmiemy się całym ekosystemem. Porozmawiamy o toolchainie i co możemy zrobić za pomocą narzędzi dostępnych razem z kompilatorem. Porozmawiamy również o dodatkowych narzędziach, procesach i technikach ułatwiających codzienną pracę.  

Aktualnie zapisy do kursu są zamknięte.

Zapisz się na listę oczekujących, aby nie przegapić kolejnego otwarcia.

Agenda

1.1 Intro
1.2 Dla kogo jest ten kurs?
1.3 Czy warto uczyć się C
1.4 Typowe błędy podczas nauki
1.5
Efekt końcowy
1.6 Jak studiować ten kurs?
1.7 Plan działania
1.8 Twój instruktor
1.9 Praca domowa

2.1 Intro
2.2 Liczby całkowite
2.3 Liczby zmiennoprzecinkowe
2.4 Typ logiczny - Bool
2.5 Typ znakowy - Char
2.6 Typ wyliczeniowy - Enum
2.7 Jaki typ zmiennej wybrać? -
Część 1
2.8 Jaki typ zmiennej wybrać? -
Część 2
2.9 Stałe liczbowe
2.10 Inicjalizacja zmiennych
2.11 Praca domowa
2.B1 Bonus - Tutorial Godbolta
2.B2 Bonus - Systemy liczbowe
2.B3 Bonus - Systemy zapisu liczb
ujemnych
2.B4 Bonus - Typy z biblioteki
standardowej

3.1 Intro
3.2 Struktury
3.3 Pola bitowe
3.4 Pola bitowe vs Maski bitowe
3.5 Unie
3.6 Inicjalizacja struktur, unii i pól
bitowych
3.7 Wskaźniki - Podstawy
3.8 Wskaźniki - Rozszerzenie
3.9 Wskaźniki - Typowe błędy
3.10 Arytmetyka wskaźników
3.11 Tablice
3.12 Tablice jako argumenty
funkcji
3.13 Stringi w C
3.14 Inicjalizacja tablic
3.15 Wskaźniki vs Tablice
3.16 Praca domowa
3.B1 Bonus - Wyrównanie pamięci

4.1 Intro
4.2 If - Else
4.3 Operator warunkowy (? :)
4.4 Switch - Case
4.5 Pętle
4.6 Goto considered harmful?
4.7 Funkcje
4.8 Wskaźniki na funkcje
4.9 Callbacki i interfejsy
4.10 Mappery
4.11 Funkcje inline
4.12 Typedef
4.13 Praca domowa

5.1 Intro
5.2 Jak działa preprocesor?
5.3 Dyrektywa include
5.4 Dyrektywa define - Stałe
5.5 Dyrektywa define - Macra
5.6 Kompilacja warunkowa
5.7 Predefiniowane symbole
5.8 Dyrektywy pragma, error i
warning
5.9 Operacje na tekście
5.10 Praca domowa

6.1 Intro
6.2 Operatory i ich kolejność
6.3 Rzutowanie jawne i niejawne
6.4 Modyfikator Const
6.5 Modyfikator Volatile
6.6 Modyfikator Restrict
6.7 Widoczność symboli
6.8 Czas życia symboli
6.9 Static i Extern
6.10 Łączenie modyfikatorów
6.11 Stos
6.12 Dynamiczna alokacja pamięci
6.13 Undefined behavior
6.14 Praca domowa

7.1 Intro
7.2 dlaczego czytelność kodu jest
ważna?
7.3 Jak pisać czysty kod?
7.4 Poziomy czytelności kodu
7.5 Jak wybierać nazwy?
7.6 Czytelność każdej linijki kodu
7.7 Jak pisać dobre funkcje?
7.8 Komentarze
7.9 Dokumentacja w kodzie
7.10 Formatowanie kodu
7.11 Obsługa błędów
7.12 Zasady w projekcie
7.13 Praca domowa

8.1 Intro
8.2 Co się dzieje podczas
kompilacji?
8.3 Pliki tworzone podczas
kompilacji
8.4 Flagi kompilacji
8.5 Skrypty linkera
8.6 Co się dzieje przed funkcją
main?
8.7 Rozszerzenia kompilatora
8.8 Standardy C
8.9 Biblioteki prekompilowane
8.10 Kompilacja inkrementalna
8.11 Skrypty makefile
8.12 Jak skracać czas kompilacji?
8.13 Co znajdziemy w naszym
toolchainie?
8.14 Praca domowa

9.1 Intro
9.2 Biblioteka standardowa C
9.3 Biblioteka stdlib.h
9.4 Biblioteka stdio.h
9.5 Biblioteka string.h
9.6 Inne przydatne headery
9.7 Syscalls – interfejs między
biblioteką C a systemem
9.8 Jak działa procesor?
9.9 Podstawy asemblera
9.10 Łączenie asemblera z C
9.11 Łączenie C z C++
9.12 Praca domowa

10.1 Intro
10.2 Mity o optymalizacji
10.3 Optymalizacja vs dobra praktyka
10.4 Jak mierzyć wydajność
10.5 Kiedy optymalizować?
10.6 Wrogowie wydajności – złożoność
obliczeniowa
10.7 Wrogowie wydajności
oczekiwanie na zasoby
10.8 Kiedy wiemy więcej niż kompilator
10.9 Mikrooptymalizacje
10.10 Optymalizacja z wykorzystaniem
tablic
10.11 Praca domowa

11.1 Intro
11.2 Wizualizacja projektu całego
systemu
11.3 Podział na warstwy
11.4 Elementy aplikacji – logika,
scenariusze, infrastruktura
11.5 Interfejsy
11.6 Jak odcinać się od cudzego
bałaganu?
11.7 Zależności
11.8 Wzorce projektowe
11.9 Na jakiej części systemu
najbardziej się skupić?
11.10 Architektura a testy
11.11 Czytelność projektu
11.12 Ewolucja architektury
11.13 Praca domowa

12.1 Intro
12.2 System kontroli wersji
12.3 Continuous Integration
12.4 Test Driven Development
12.5 Code Review
12.6 Dokumentacja
12.7 Narzędzia do analizy kodu
12.8 W czym pisać kod?
12.9 Debugowanie
12.10 Jak wprowadzać usprawnienia?
12.11 Praca domowa

13.1 Intro
13.2 Co dalej? - Inne języki
programowania
13.3 Co dalej? - Hardware
13.4 Co dalej? - Test Driven
Development
13.5 Co dalej? - Projektowanie i
Architektura Systemów
13.6 Co dalej? - Metody Prowadzenia
Projektów
13.7 Co dalej? - Dzielenie się wiedzą
13.8 Praca domowa

1. Refactoring
2. Konfiguracja cmake
3. TDD - konfiguracja projektu
4. Debugowanie z użyciem konsoli
5. Architektura Embedded
6. Programowanie według norm
7. Strategie include'owania
modułów

Aktualnie zapisy do kursu są zamknięte.

Zapisz się na listę oczekujących, aby nie przegapić kolejnego otwarcia.

Kontakt

Jeżeli masz jakiekolwiek pytania - pisz na kontakt@ucgosu.pl