Wpis z mikrobloga

#cpp #naukaprogramowania #programowanie

###################

# WSTĘP

###################

Częstotliwość pytań o to jak lub z czego się uczyć programowania C++ jest wysoka. Więc dla wszystkich tych którzy zadali to pytanie, a może ktoś też podrzuci tą odpowiedź zadającym to pytanie w najbliższej (bo kiedyś i ta odpowiedź się zdezaktualizuje) przyszłości, postanowiłem napisać ten post.

###################

# JAK SIĘ NIE UCZYĆ

###################

Chciałbym raz na zawsze wyjaśnić pewną rzecz, nawet jeżeli część z was się ze mną nie zgodzi.

Otóż "Symfonia C++" to nie jest dobry podręcznik,nie należy go nikomu polecać. Szczególnie w dzisiejszych czasach. Trzymam ten podręcznik właśnie w rękach. Czytałem ten podręcznik jak byłem na studiach. Ten podręcznik uczy starego stylu i wielu złych praktyk. Język C++ naprawdę się rozwinął od tamtego czasu.

Zacznijmy od kilku podstaw:

"Symfonia C++" to książka opisująca starodawną wersję C++ ARM. Nie brzmi strasznie, ale straszne jest w istocie:

- Nie znajdziesz w Symfonii C++ czegoś tak potrzebnego i popularnego jak obsługa wyjątków (exception handling)

- Nie znajdziesz przestrzeni nazw (namespaces)

- Nie znajdziesz szablonów (templates)

- Nie znajdziesz wielu innych rzeczy takich jak różne rodzaje rzutowań

- Nie znajdziesz nic co doszło w standardzie ISO.

"Symfonia C++ Standard" to nowsza wersja opisująca standard ISO zamiast archaicznego ARM. Ale. Dalej nie znajdziesz tam obsługi wyjątków i szablonów.


Ale to wszystko umywa się przy tym, że w całej książce nazwy zmiennych (i funkcji i klas) są napisane po polsku. Nikt tak nie uczy, nawet na studiach się od tego odchodzi lub już się dawno odeszło. Tylko najbardziej przestarzali i zatwardziali w swoim konserwatyzmie wykładowcy się tego trzymają.

Osobliwy sposób wcięć szczególnie i formatowania w ogólności to już sprawa subiektywna, ale mnie nie podszedł.

But wait, there's more!

Gdyby tego wszystkiego było mało, to w 2011 roku wyszła nowa wersja standardu, C++11, wnosząca bardzo dużo do języka, w tym ogromnie dużo dobrego.

https://en.wikipedia.org/wiki/C%2B%2B11

Można by rzec "ale kto by z tego korzystał to na pewno zaawansowane rzeczy dla wymiataczy" - ale to nie prawda. Zmiany były tak szerokie że nawet fundamentalne rzeczy używane przez początkujących programistów zostały pozmieniane. Nic z tego w tej książce (tych książkach) nie zobaczysz.

###################

# JAK SIĘ UCZYĆ

###################

1. Zacznijmy od książek:

http://www.amazon.com/Primer-Plus-6th-Developers-Library/dp/0321776402/ - to bardzo dobra książka, bardzo dokładna, zaprowadzi się od zera do kompetencji.

Jeżeli natomiast już coś ogarniasz, ale nie jesteś pewien swojej wiedzy, albo skończyłeś część (lub całość) powyższej książki i chcesz więcej albo inaczej:

http://www.amazon.com/C-Programming-Language-4th/dp/0321563840/

http://www.amazon.com/Tour-C--Depth/dp/0321958314/


http://helion.pl/ksiazki/jezyk-c-szkola-programowania-wydanie-vi-stephen-prata,cppri6.htm


http://helion.pl/ksiazki/jezyk-c-kompendium-wiedzy-bjarne-stroustrup,jcppkw.htm


But wait, there's more!

W tym roku (2014) wyszła wersja C++14.

https://en.wikipedia.org/wiki/C%2B%2B14

Być może niedługo po napisaniu tego wpisu, zostanie w pełni opublikowana książka Scotta Mayersa która pozwoli ci "być na bierząco".

http://shop.oreilly.com/product/0636920033707.do

Znajomość języka to jednak nie wszystko i jeżeli chcesz być ogólnie kompetentnym programistom polecam poniższe książki:

Algorytmy:

http://www.amazon.com/Introduction-Algorithms-Edition-Thomas-Cormen/dp/0262033844/

http://www.amazon.com/Algorithms-4th-Edition-Robert-Sedgewick/dp/032157351X/

Wzorce obiektowe:

http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/

Bazy danych:

http://www.amazon.com/Database-Design-Mere-Mortals-Hands-/dp/0321884493/

http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers/dp/1934356557/

Pozycje nieobowiązkowe, ale najdogłębniejsze - http://www.amazon.com/C.-J.-Date/e/B000AQ6OJA/

Dobre praktyki i inne:

http://www.amazon.co.uk/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/

http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X/

http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/

http://www.amazon.com/The-Mythical-Man-Month-Engineering-Anniversary/dp/0201835959/

Nie trzeba przeczytać wszystkiego (ale MOŻNA), niemniej należałoby przeczytać przynajmniej po jednej książce z każdej grupy.

2. Video:

Screencasty / kursy video potrafią sporo pomóc, nie korzystaj wyłącznie z nich, to po prostu kolejna pomoc naukowa.

http://www.pluralsight.com/courses/table-of-contents/learn-programming-cplusplus - od postaw - niemniej nie rezygnuj z książek, skorzystaj z kursu video jako dodatku do książki.

http://www.pluralsight.com/courses/modern-cplusplus-libraries - aby poszerzyć wiedzę

http://www.pluralsight.com/courses/introduction-qt-cplusplus-framework - nauka Qt taka biblioteka do tworzenia graficznych interfejsów

http://www.pluralsight.com/courses/boost-cpp-libraries-introduction - popularna biblioteka wielorakiego użytku

http://www.informit.com/store/introduction-to-c-plus-plus-concurrency-livelessons-9780134031484 - programowanie współbieżne - super ważna rzecz w dzisiejszych czasach

Filmy z konferencji, np. najświeższe - https://www.youtube.com/user/CppCon

3. Wyzwania i potyczki

TO SUPER WAŻNE żebyś podczas czytania i oglądania programował, nie kopiował gotowego kodu z paczek źródłowych do książek tylko ręcznie pisał, starając się zrozumieć co piszesz. Musisz eksperymentować, wprowadzać własne zmiany, pisać własne projekty i realizować własne pomysły.

https://warosu.org/data/g/img/0441/94/1410874830625.png - zbiór 100 pomysłów na projekty treningowe aby nauczyć się na nich programowania

Strony z zadaniami i zagadkami algorytmicznymi, poćwiczą twoje myślenie i niejednokrotnie optymalizację kodu. Miłe oderwanie od innej nauki. Uwaga - nie przesadzać, bo wpadniesz w złe praktyki i spiralę przedwczesnej optymalizacji.

http://pl.spoj.com/

http://codeeval.com/

https://www.hackerrank.com/

http://www.codechef.com/

https://www.reddit.com/r/dailyprogrammer

Różnego rodzaju ćwiczenia znajdziesz też na http://www.programmr.com/zone/cpp

4. Pozostałe

Korzystaj z dobrego środowiska:

- Zapomnij o Dev-Cpp i Borland C++ Builderze, a jeżeli ich nie znałeś to nawet ich nie googluj

- Jeżeli chcesz pisać tylko (głównie) na Windowsa to używaj Microsoft Visual Studio, tak tylko tego, yup, poważnie (http://www.visualstudio.com/)

- Jeżeli interesuje cię wiele platform, zainteresuj się QtCreatorem (http://qt-project.org/wiki/Category:Tools::QtCreator) lub, odrobinę w ciemno, ale z dużą dozą pewności (bo JetBrains jest znane z fenomenalnych IDE) polecam też CLiona (http://www.jetbrains.com/clion/) który jest obecnie w fazie ostrej produkcji.

Korzystaj z dobrego kompilatora:

- Microsoft C++ Compiler (raczej tylko jeżeli wybrałeś powyżej Visual Studio)

- GCC (https://gcc.gnu.org/)

- Clang (http://clang.llvm.org/)

Tyle, jeżeli nie masz naprawdę dobrego argumentu to nie zmieniaj kompilatora na jakiś niszowy.

Nauczyć się ładnego formatowania kodu i odpowiedzi na najczęściej zadawane pytania:

https://google-styleguide.googlecode.com/svn/trunk/cppguide.html

http://www.stroustrup.com/bs_faq2.html

Naucz się GITa (system kontroli wersji):

http://git-scm.com/book

https://try.github.io/

https://www.atlassian.com/git/

http://www.git-tower.com/learn/ebook/command-line/introduction

Publikuj swój kod i czytaj kod innych:

https://github.com/

https://bitbucket.org/

Naucz się języka SQL i opanuj przynajmniej jeden system zarządzania bazą danych:

O SQL jest 4 tony całkiem niezłych książek, kursów i tutoriali, łatwo znaleźć więc nic konkretnego nie podam.

PostgreSQL - gorąco polecam - http://www.postgresql.org/

MySQL (MariaDB) - https://www.mysql.com/

Oracle - http://www.oracle.com/pl/products/database/overview/index.html


Naucz się co to CMake i jak go używać:

http://www.cmake.org/cmake/help/cmake_tutorial.html

Interesuj się i bądź na bieżąco:

https://www.reddit.com/r/cpp

https://www.reddit.com/r/learnprogramming

https://www.reddit.com/r/programming

Jeżeli prosisz kogoś o pomoc pamiętaj żeby:

- Wkleić kod na jakieś pastie - np. http://dpaste.com/ , http://hastebin.com/

- Sprawdzić czy kod faktycznie nie działa -u siebie i np na http://ideone.com/

- Wklejając fragmenty kodu na wykop używać http://wykop-code.appspot.com/ w celu zachowania czytelności i wcięć

- Opisać zrozumiale z czym masz problem i czego już probowałeś żeby temu zaradzić

- Wkleić pełną treść błędu (jeżeli jest długo to na pastie) jeżeli takowy wystąpił
  • 203
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

- Nie znajdziesz w Symfonii C++ czegoś tak potrzebnego i popularnego jak obsługa wyjątków (exception handling)


- Nie znajdziesz przestrzeni nazw (namespaces)


- Nie znajdziesz szablonów (templates)
  • Odpowiedz
@aseeon: To nic nie zmienia. Równie dobrze można z Sienkiewicza łacha drzeć pisząc coś w stylu:

"Potop jest bez sensu, bo nie ma tam nabijania nikogo na pal, ani wysadzania się w powietrze z najlepszym kumplem. Co prawda jest to opisane w Panu Wołodyjowskim, ale jednak nie w Potopie. Nie polecam."


Poza tym odniosłem wrażenie, że chodzi o naukę języka C++, a nie wszelkich możliwych wzorców projektowych/dobrych praktyk programistycznych/itd. Te są niezależne od języka. Dlatego powinny być opisane
  • Odpowiedz
@alosha: Czyli najpierw komentujesz mój wpis, w ogóle go nie czytając, bazując tylko na kogoś innego zacytowaniu. Później porównujesz książki do nauki języków programowania do trylogii Henryka Sienkiewicza. Aha.

Powiedz jeszcze, że nie czytałeś Praty w ogóle i skończymy tą jałową dyskusję.

Ty uważasz, że Symfonia C++ Standard jest zajebista, a Pasja C++ (treść merytoryczna z przed 15 lat, lekko odświeżona kosmetycznie 12 lat temu) to jej nieodłączna część i
  • Odpowiedz
Witam, jak myślicie, po jakim czasie dosyć intensywnej nauki programowania w c++ można dostać pracę jako młodszy programista? Jestem w klasie maturalnej i wybieram się na informatykę, chciałbym już od pierwszego roku zacząć pracować, czy jest ktoś kto po pół roku, albo roku zaczął pracować w tej branży? Podzieli się ktoś swoim doświadczeniem z początkami? Planuję w przyszłości zostać freelancerem i wydaje mi się, że w pracy dużo się można nauczyć w
  • Odpowiedz
@alosha: Dalej nie rozumiem fanatyzmu i bronienia przestarzałych książek które nic dobrego nie wnoszą do programowania a wręcz mogą uczyć jak nie-programować. Język się zmienią tym bardziej od czasu wydania tych książek.

Zauważyłem że tylko do C++ jest taka silna tendencja bronienia dinozaurów której nie ma w Pythonie, Javie czy C# bo tam nikt nie lamentuje i narzeka po co się uczyć nowych standardów jak są książki z przed kilku
  • Odpowiedz
"Symfonia C++ Standard" to nowsza wersja opisująca standard ISO zamiast archaicznego ARM. Ale. Dalej nie znajdziesz tam obsługi wyjątków i szablonów.


Żeby być zgodnym z prawdą muszę nadmienić, że jest im poświęcona inna książka - "Pasja C++".


@a
  • Odpowiedz
@a....n: O ile mogę się zgodzić, że symfonia jest stara i dlatego nienajlepsza do nauki na początek, to wypunktowanie, że nie ma tam opisu wyjątków czy szablonów, jest jakby nie na miejscu, bo te sa opisane że tak powiem w dalszej części - czyli w Pasji.
  • Odpowiedz