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.
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.
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:
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.
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.
@haryen: To chyba musiałbyś prosić innych mirków: może @MacDada albo @JavaDevMatt lub @Eoghan (mógłbyś nawet zareklamować javastart przy okazji Eoghan )
@aseeon: A co powiesz o http://docs.oracle.com/javase/tutorial/ bo nie wiem czy opłaca się kupować książkę, jeśli ktoś już zna składnię języka, podstawy obiektowości (dziedziczenie, polimorfizm). Ogarnąć materiał z tego tutka i kupować Effective Java 2nd czy jednak to nie wystarczy?
Tyle tych materiałów... Świetny wpis (i pierwszy dodany do ulubionych). Widziałem "od zera do gier kodera", wikibooksa, symfonię, cplusplus.com i inne rzeczy, ale nie sądziłem że jest aż tyle informacji do nauki C++. Czuję teraz tzw. "mindf#ck'a" i zmieszany, bo nigdy się nie nauczę C++ do porządku. Życia "studenckiego" mi nie starczy. Mam 20 lat i znam raptem podstawy C (pętle, zmienne, tablice etc.). Tym wpisem mnie przestraszyłeś i to mocno, bo
Borland C++ Builder de facto już nie istnieje, w sensie nie jest rozwijany, null nic. A jak coś nie jest rozwijane to się praktycznie cofa w rozwoju. Choćby podświetlanie składni, wszystko co diametralnie zmieniło się w C++11 nie będzie nawet dobrze podświetlone, o podpowiadaniu takiej składni już nie wspomnę. Wszystko co zmieniło się od 2006 roku, wszystkie narzędzia które od tego czasu powstały czy zmieniły się, nie będzie dla nich
@aseeon: bogato, ale... było milion razy na setce for internetowych? ;)
Ogółem najprościej dla początkującego:
Symfonia C++ Standard albo Megatutorial Od zera do gier kodera (ten drugi trochę przyjemniejsze i za darmo jak dla mnie). Później jak ktoś załapie ocb i trochę popisze proste rzeczy dalej z neta może bez problemu ciągnąć wiedzę litrami bo później już łatwiej wchodzi niż na początku.
A wyjątki, template-y i inne pierdoły nie potrzebne na
@pejczi: dev-cpp nadaje sie na jedno-plikowe projekty >_< Polecam równie lekki i prosty w użyciu CodeBlocks. Jak ktoś chce kobyłę do dużego projektu to Visual jest świetny, taka prawda, ale trzeba sporo czasu spędzić nad nim żeby się dobrze go nauczyć. I ma super debugger, prosty i potężny.
###################
# 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ł
https://class.coursera.org/db
http://krainaksiazek.pl/C-Primer-Plus,9780321776402.html
* Meyers - doskonałe książki, trudno dostępne po polsku, mnie się udało wyrwać ledwo jedną :(
* Sutter - to samo + rewelacyjny blog pełen ultraciekawych ciekawostek (herbsutter.com)
* Alexandrescou - łatwiej dostępny, tematyka trudniejsza i może trochę niszowa, ale fajnie powytrzeszczać oczy ;)
@haryen: To chyba musiałbyś prosić innych mirków: może @MacDada albo @JavaDevMatt lub @Eoghan (mógłbyś nawet zareklamować javastart przy okazji Eoghan )
Czytasz
http://www.amazon.com/Java-Beginners-Guide-Herbert-Schildt/dp/0071809252/
później dorzucasz
http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683/
oraz
http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601/
I jesteś w domu ( ͡º ͜ʖ͡º)
Mam bardzo dobre doświadczenia z Borland Delphi od lat '90 po dziś dzień dlatego jestem ciekaw przeciwwskazań.
Borland C++ Builder de facto już nie istnieje, w sensie nie jest rozwijany, null nic. A jak coś nie jest rozwijane to się praktycznie cofa w rozwoju. Choćby podświetlanie składni, wszystko co diametralnie zmieniło się w C++11 nie będzie nawet dobrze podświetlone, o podpowiadaniu takiej składni już nie wspomnę. Wszystko co zmieniło się od 2006 roku, wszystkie narzędzia które od tego czasu powstały czy zmieniły się, nie będzie dla nich
Ogółem najprościej dla początkującego:
Symfonia C++ Standard albo Megatutorial Od zera do gier kodera (ten drugi trochę przyjemniejsze i za darmo jak dla mnie). Później jak ktoś załapie ocb i trochę popisze proste rzeczy dalej z neta może bez problemu ciągnąć wiedzę litrami bo później już łatwiej wchodzi niż na początku.
A wyjątki, template-y i inne pierdoły nie potrzebne na