Nie! Nie potrzebujesz korepetycji z C++! Nie wyrzucaj pieniędzy!!!

[Doprecyzuje: chodzi mi o korepetycje uczące C++, nie te przygotowujące do matury. Matura z informatyki jest tak specyficznym egzaminem, że poniższy wpis tego nie dotyczy. Niestety z moich obserwacji niewiele ma matura z informatyki pisana w C++ wspólnego z C++.]

Ostatnimi czasy pocztą pantoflową docierają do mnie zapytania o korepetycje z C++. Przy okazji rozmów z rodzicami osób, dla których szukane są korepetycje, dowiaduję się, że mimo iż w internecie jest dużo ofert, to od kilku miesięcy nie udało się im nikogo znaleźć, kto by spełniał kryteria. Korepetycje są modne, dzięki nim osoby mające problemy szybciej nadrabiają i zdają (chociaż nie zawsze), na uczelniach wiszą ogłoszenia z korepetycjami, korepetytorzy proszą swoich „klientów” aby mówili o nich swoim kolegom i tak się to nakręca. Korepetycje z języków obcych z native speakerem – mają uzasadnienie, jednakże zamierzam obronić tezę, że do zwykłej nauki C++ nie potrzebujesz korepetycji, a jak masz za dużo pieniędzy, to przelewaj na cele charytatywne (np. Siepomaga.pl).

W temacie korepetycji muszę powiedzieć, że na studiach na UJ nie brałem ani razu korepetycji, mimo iż byłem po profilu humanistycznym, a UJ ciśnie matematykę. Jak sobie poradziłem bez korepetycji:

  • praca – musisz przysiąść, może nawet więcej niż inni
  • regularność – przez cały semestr trzeba pracować
  • utkniesz na problemie, którego nie możesz rozwiązać – pytasz nauczyciela. Każdy nauczyciel akademicki ma obowiązek mieć konsultacje – chodzisz na nie, nawet co tydzień. Jak nauczyciel nie umie tłumaczyć to drążysz -on na tym też skorzysta bo się nauczy. Na zajęciach pytasz, nie przejmuj się jak nikt inny nie pyta.
    • wstydzisz/boisz się nauczyciela to pytasz kolegów/koleżanki, równocześnie pomagając innym kolegom/koleżankom
  • korzystasz z wyszukiwarki, musisz sam spróbować naprawić problem zanim spytasz (nie dotyczy jeśli wątpliwości są w trakcie zajęć)

Powyższe kroki można podsumować sformułowaniem: musisz postępować jak sympatyczny kujon, który pomaga innym.

Jak się nauczyć C++ bez korepetycji

A teraz konkretnie: aby się nauczyć C++ potrzebujesz dwóch rzeczy: teorii i kodzenia. Za teorię polecam książkę (opisałem je w innym moim wpisie), np. rozdział dziennie. A potem kodujesz, aż przetestujesz co było w książce. Ja stosowałem taką metodę, że czytałem sobie rozdział z Symfonii C++ (poprzednik Opus Magnum Grębosza), dokładnie analizowałem kod, jak już go rozumiałem to bez patrzenia do książki robiłem to samo. Jeśli się udało to kolejny przykład, a jak nie… to wracałem do książki, analizowałem ponownie i znowu siadałem aby to zakodować. Poza zrozumieniem rozdziałów z książki są tam ćwiczenia – sugeruję je robić (przynajmniej na początku), ale nie tylko „w głowie”, ale na komputerze. Nudzą Cię ćwiczenia, to korzystaj z narzędzi online judge np. Hackerrank – tam za zadania dostajesz punkty, za punkty np. złotego badge’a. Masz już dużo punktów, maksymalne odznaczenia, zadanka przychodzą Ci łatwo – czas „zmaterializować” dotychczasową wiedzę! Robi się to w jeden sposób – poprzez zrobienie większego zadania własnego (innymi słowy powinieneś zrobić własny projekt, lub projekty)! Pomysłów jest wiele, wszędzie wokoło programy, oraz, co dziwne, braki wielu narzędzi. Jako inspirację polecam mój wpis. Poza samym aspektem nauczenia projekty mają zalety, o których nie macie nawet pojęcia (piszę to z perspektywy doświadczonego programisty C++ o doświadczeniu komercyjnym) – rekruterom własny projekt wpisany w CV udziela bardzo wiele cennych informacji.

Już umiesz programować w C++, co dalej?

[Zakładając, że chcesz iść dalej w C++] Dalej czytasz książki, nadążasz za bieżącymi standardami C++, kodujesz (co prawda można już wtedy więcej „w głowie”, jednakże nie za dużo). Ale nadchodzi kolejny etap, do którego już potrzebujesz innych ludzi (= potrzebujesz zespołu). Zespół będzie Cię uczyć jak się programuje, oraz czytania kodu. W książkach się robi pewne rzeczy, których się nie robi w kodzie komercyjnym (chociażby polskie nazwy i nawet komentarze), ale tych aspektów jest znacznie więcej. Akapit ten sprowadza się do tego, że powinieneś: znaleźć pracę w C++.

Są ludzie, którzy od razu na studiach chcą założyć własną firmę, bo są kreatywni, mają czas (tak, uwierzcie mi – macie go … w porównaniu z tym co będzie!). Jednakże sugeruję gdzieś powspółpracować z bardziej zaawansowanymi programistami. Niezależnie od tego jak jesteś dobrym w czymkolwiek, to pokornie znoś krytykę, rozmawiaj na argumenty.

A czasowo?

Masz już trochę wiosen, znasz siebie lepiej niż trenerzy personalni. Proponuję rozdział dziennie w dni robocze, nie mniej, w weekendy nadrabiamy. Na uczelni przedmiot to 14 tygodni (wg mnie za mało) * 5 dni = 70 rozdziałow. Opus Magnum ma 38. Niektóre dłuższe. Zacznij od pierwszego tygodnia zajęć!
Nie namawiam Cię do mycia toalet publicznych własną szczoteczką do zębów bez rękawiczek. To jest fajne, tylko trzeba poznać C++.

Podsumowując

Nie czytaj głupot w internecie tylko się bierz za książkę i programy! Bądź dobrym kolegą! Kujon to ten co mu się coś chce i w życiu coś osiągnie!

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