Jak nauczyć się najnowszego C++ i być na bieżąco

[Jest to rozwinięcie mojego artykułu jak się nie zasiedzieć w IT]

C++ od ponad 10 lat ma bardzo szybki rozwój, w którym to standardy pojawiają się co 3 lata, kiedyś ten cykl wydawniczy był znacznie dłuższy. Ma to duże zalety, gdyż jest to język coraz bardziej nowoczesny, coraz wygodniejszy w użyciu, ale ma też wadę – ciężko być na bieżąco a najnowszym C++. Trudność ta polega na tym, że:

  1. Książki nie nadążają z najnowszymi standardami – książka jak już przejdzie cały cykl wydawniczy i się przebije do opinii publicznej to już jest co najmniej jeden standard w plecy.
  2. Firmy nie zawsze są w stanie podbić do nowszego standardu.
  3. Czynnik ludzki – nam się chce, ale komuś w zespole może się nie chcieć nadążać, bo to nie jest łatwe.

Zacznę od tego, że w nauce języków programowania jestem zwolennikiem książek, gdyż:

  1. Jakość: książkę autor lepiej przemyśli (bo nie tak łatwo ją potem zmienić), błędy mogą pogrążyć pisarza, że w przyszłości jego książki będą uważane za słabe, dlatego autorzy książek piszą je jak najlepiej. Następnie książka jest czytana i recenzowana przez innych, zawsze zgłoszą błędy. Autor nie jest anonimowy, to motywuje do większego starania.
  2. Kompletność: Wystarczające omówienie zagadnienia, książka ma cel, do którego dąży, nie musi być jak najkrótsza jak artykuły internetowe, ma dobrze wyjaśnić pewne zagadnienia. Dlatego książki posiadają dużo przykładów kodu, wyjaśniają go, oraz pokazują wydruk.

Oczywiście nie mówię, że artykuły poświęcone programowaniu są złe (sam zresztą piszę artykuły o programowaniu w C++ na stronę cpp0x.pl). Jeśli chcemy być na bieżąco to się bez tego nie obejdzie, bo artykuły powstają szybciej i są w stanie opowiedzieć o pojedynczym zagadnieniu w sposób prawie jak książka, ale nie opowiedzą o wszystkim.

Nowy standard C++, co to tak właściwie oznacza?

Oznacza to zasadniczo dwa aspekty:

  1. Rozwój biblioteki standardowej: czyli dodatkowe funkcje, metody, kontenery standardowe, nagłówki, stałe matematyczne itp.
    • Bardzo rzadko, ale jednak się zdarza, że ze standardu jest coś uznawane za złą praktykę i potem usuwane po kilku standardach np. auto_ptr w standardzie C++11 uznane za przestarzałe i usunięte w C++17. Nie wiele rzeczy jest usuwanych, tylko tzw. „ewidentne dziadostwo” (to nie jest określenie fachowe – sam to wymyśliłem, bo jest trafne).
  2. Wprowadzane ułatwienia do języka C++, które pomagają programistą pisać wysokiej jakości kod, które wyposażają w czytelne dla programisty i kompilatora oznaczenia (np. override), których tenże kompilator pilnuje. Identyfikowane są aspekty niezdefiniowane, którym jest precyzowane zdefiniowane znaczenie (np. constinit). Jak również rozluźnianie pewnych reguł, niesłusznie zbyt restrykcyjnych (np. co może zawierać funkcja constexpr). Poza tym aspekty związane z polepszeniem wydajności kodu.
    • Uspokoję czytelników: kolejne standardy C++ starają się zachowywać maksymalną kompatybilność wsteczną z poprzednimi standardami. W praktyce: można pisać w C++03 (z 2003 roku) i kompilować kompilatorem z C++23 i kod powinien się kompilować. Z tymże takie postępowanie jest nieprofesjonalne aby nie używać nic z nowości.

A teraz konkretnie – jak nauczyć się najnowszego C++?

Niestety właśnie w tym problem, że nie ma na to odpowiedzi podanej na tacy. Nie ma książki, która uczyłaby od razu C++ w najnowszym standardzie (na ten moment C++23 z 2023 roku). Powiem więcej, nie zetknąłem się z dobrą książką, która by od zera wprowadzała w C++ więcej niż C++11. Kursy internetowe również są do tyłu, najpopularniejszy kurs C++ Pasja Informatyki jest starszy niż C++11.

Rozwiązanie (wg mnie)

Nie* ma „papki łatwej do przyswojenia”, więc jak sobie z tym poradzić?

  1. Przeczytać && przećwiczyć Opus Magnum Grębosza – z niej nauczymy się do C++11 włącznie. Jest to najlepsza znana mi książka, największą konkurencją jest Język C++ Stroustrupa, ale jest to o wiele cięższa książka w przyswojeniu, wg mnie i wielu moich studentów właśnie Grębosz jest lepszy.
  2. C++14 i C++17 w łatwej formie można opanować z dodatkowego tomu Grębosza: Opus magnum C++: Misja nadprzestrzeń. Niestety jest to książka tłumacząca C++14 i 17 w wersji: „co się zmieniło” z przykładami, dlatego trzeba to co mamy sobie ułożyć w głowie. Jak się uczymy programować to jest to trudne (najpierw się uczymy, że się robi tak a tak, a potem się to zmienia).
  3. Z kolei aby ogarnąć C++20 natrafiłem na jedną książkę wartą polecenia: Wysoce wydajny C++. Opanuj sztukę optymalizowania działania kodu. Wydanie II – Bjorn Andrist, Viktor Sehr. Książka ta nie jest spisaniem „co przybyło w C++20”, ale bardziej skupienie od podstaw na tym jak działają komputery, jak korzystać z tego wydajnie. Opisuje ona nowe funkcjonalności C++20. Trudność tej książki jest różna, dla większości tej książki wystarczy przeczytanie Opus Magnum, ale są też rozdziały trudne pod koniec. Polecam jej przeczytanie, gdyż skupia się na działaniu komputerów wpływającym na wydajność – zrozumienie tego jest konieczne dla programisty C++.
  4. Do C++23 nie widziałem jeszcze napisanej książki, więc odsyłam do wystąpień konferencyjnych cppcon: C++23 – What’s In It For You? – Marc Gregoire – CppCon 2022

„Papka” może istnieć

Za „papkę” mam na myśli kurs programowania w C++ od zera do (prawie) najnowszego standardu. Wcześniej pisałem, że nie istnieje, ale jednak może ona istnieć, jednakże nie wszyscy mają do niej dostęp. Taką „papką” są dobre wykłady z C++. Tam wykładowca musi robić to co wyżej opisałem, aby z tego zrobić aktualną syntezę przedstawioną Państwu. Niestety nie wszyscy wykładowcy przygotowują najnowszą „papkę”. Oczywiście nie musi to wynikać ze złej woli – zatwierdzanie standardu jest w połowie semestru zimowego, oprogramowanie na uczelni może nie być aktualny (nie wspierać nowych standardów).

Ktoś może spytać o standard C++ – tam niby jest wszystko, ale językiem encyklopedycznym. Nie jest to do nauki programowania.

Niekompletność „papki”

Na uczelniach jest określona liczba godzin na wykłady, przy obecnej wersji C++ potrzeba by co najmniej 60 godzin wykładów i 60 godzin ćwiczeń praktycznych. Na ogół nie ma tego tak dużo, nawet czasami jest 14 godzin, wtedy robi się przegląd najpopularniejszych aspektów C++.

Podstawowe aspekty nowych standardów C++ na początkowych etapach nauki

Prowadzę programowanie w C++, takie aspekty najnowszych standardów zdążę powiedzieć (inne aspekty są zbyt zaawansowane na te 14-28 godzin)
[uwaga: poniższe punkty są w formie notatek, powinienem to porządniej opisać]

  1. C++23:
    • Operator indeksowania wieloargumentowy:
      T& operator[](size_t x, size_t y, size_t z)
    • W końcu w standardzie jest wyświetlanie warningów czasu kompilacji:
      #warning "Teraz jest to w standardzie"
    • Wygodne wyświetlanie zmiennych na ekran:
      std::println("To jest liczba {}", 44);
      std::print("{}", vectorInstance); // można cały std::vector wyświetlić
  2. C++20:
    • Moduły – przyśpieszenie kompilacji
    • Designed initialised” – możliwość przypisywania wartości poszczególnym polom w strukturach przy inicjalizacji
    • Operator porównywania: bool operator <=>(...) – teraz można wszystkie operatory porównania „wygenerować” z jednokrotnie napisanego operatora
    • skrócona wersja szablonów: void f(auto value) {…}
    • inicjalizatory w range-based-for:
      for(auto obj = GetObj(); auto item : obj.GetCollection()){
    • pomijanie typename przy typach zagnieżdżonych – teraz wolno
    • Z dużych zmian: w C++20 zostały jeszcze wprowadzone koncepty i courutines – są to jednak zbyt zaawansowane mechanizmy aby je przedstawić na początkowym etapie nauki

2 uwagi do wpisu “Jak nauczyć się najnowszego C++ i być na bieżąco

  1. Pingback: Polskojęzyczne artykuły o C++ mojego autorstwa | programowaniec

  2. Pingback: Nie! Nie potrzebujesz korepetycji z C++! Nie wyrzucaj pieniędzy!!! | programowaniec

Dodaj komentarz