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
@aseeon: pozwolę sobie tylko opisać to, czego próbowano (bo już to znałem parę (para to 2) lat wcześniej, byłem już olskoolowcem z Turbo Pascala i Delphi w tym momencie) mnie nauczyć na studiach, na podstawach C/C++:

1. Zmienne

2.
  • Odpowiedz
@soplowy: Ja wiem. PHP to taki COBOL XXI wieku. Niby przestarzały, ale systemów w nim napisanych jest tyle, że ciągle potrzebny. Teraz pensje programistów PHP będą tylko rosły. No i obowiązkowe zdanie w wątku o PHP: PHP to nie język programowania ;)
  • Odpowiedz
super wpis, widział ktoś coś podobnego o Javie lub może mi napisać jakie są główne różnice między tymi dwoma językami?
  • Odpowiedz
@nightcall: Są ale i tak lepiej od razu zaczynać od angielskich bo prędzej czy później i tak będziesz musiał korzystać z angielskiej dokumentacji czy szukać informacji na anglojęzycznych stronach.

Chyba jedna z popularniejszych i ogólnodostępnych po polsku jest:

http://pl.wikibooks.org/wiki/Zanurkuj_w_Pythonie

Ja i tak na początek polecam codecademy, nie wymaga żadnego przygotowania a pozwala sprawdzić czy się ma faktycznie zajawkę na takie zabawy :)
  • Odpowiedz
spoko materiały. zauważyłem że początkujący programiści skupiają się na książkach dotyczących składni, konstrukcji języka itd. Należy pamiętać że umiejętność programowania to matematyka, algorytmika, pomysłowość i logiczne myślenie. Język to kwestia tygodnia.
  • Odpowiedz
@aseeon: Znam wszystkie podstawowe konstrukcje (pętle itd.), ogarniam w miarę OOP, znam podstawy Pythona i liznąłem troszkę C# - mogę ominąć jakieś rozdziały w tej książce C++ Primer Plus, czy jechać wszystko od początku? Drugie pytanie - znając C++ bez problemu będę mógł przestawić się na pisanie w C? Kręcą mnie interpretatory, kompilatory itd.
  • Odpowiedz
mogę ominąć jakieś rozdziały w tej książce


@endriu17: odpowiedź brzmi, nie wiem, nie wiem na ile umiesz, co to znaczy, że liznąłeś trochę C#. Najlepsza rada jaką mogę ci dać, to nie omijaj nic, najwyżej szybciej zrobisz i nie będziesz musiał powtarzać informacji z jakiegoś rozdziału.

A jak cię kręcą kompilatory, interpretery i reszta, to po prostu się ucz C, jest książka tego samego autora do
  • Odpowiedz
@aseeon Powiedzmy, że uczę się programowania C++/C# i SQL 2 lata, nie mam wiedzy akademickiej (lub częściowo co pokryło się w książkach z których się uczę) - mam szanse na rynku pracy jako programista?

Zdaje sobie sprawę, że nie trzeba być magistrem, żeby być świetnym programistą ale powiedz tak szczerze, będę robił to tylko dla siebie czy też zarobie z tego na piwo a z czasem na whisky czy tylko piwo
  • Odpowiedz
@rubesom: wiedzę, którą nazywasz akademicką, możesz zdobyć z książek wymienionych w tym wpisie i gdy nauczysz się jej sam, z pasji, to będziesz się znał lepiej niż 95% absolwentów.

A odpowiadając wprost, będąc samoukiem możesz jak najbardziej zarobić na whisky, bo coś pić trzeba i na eleganckie szklanki. No i siąść gdzieś trzeba, więc i na kanapę zarobisz i na salon w którym ta kanapa stanie.
  • Odpowiedz
Symfonia jest ok jak ma się bibliotekę żeby dostać to za friko jak się nie może zrozumieć działania wskaźników czy innych pierdół bo akurat to co w książce wg. mnie ważne to umiejętność wytłumaczenia. Ale może lepiej doczytywać jak się czegoś nie rozumie. Angielski to prawda - pytałem profesora o książkę o algorytmach i jak podał angielski tytuł to zwątpiłem i kazał mi w wakacje angielski kuć bo bez tego ani rusz.
  • Odpowiedz
@aseeon Wielkie dzieki za ten wpis, leci plus! Mam tylko pytanko, polecasz ksiazke Algorithms 4th edition, ktora uzywa java'y: (http://www.amazon.com/Algorithms-4th-Edition-Robert-Sedgewick/dp/032157351X/).

Zauwazylem jednak ze jest rowniez ksiazka, nieco starsza, Algorithms in C++ (bodajze w 2 czesciach) tego samego autora (http://www.amazon.com/Algorithms-Parts-1-4-Fundamentals-Structure/dp/0201350882/ref=sr_1_1?s=books&ie=UTF8&qid=1415040077&sr=1-1&keywords=algorithms+in+c%2B%2B).

Czy miales z nia stycznosc? Czy moglbys ja rowniez polecic? Czy fakt ze jest z 1998 roku definitywnie ja przekresla i lepiej uzywac nowszej, ale w javie?

Z gory dzieki
  • Odpowiedz