Ten krótki artykuł jest skierowany do osób, które same chciałyby się uczyć programowania od zera oraz dla osób, które mają już jakieś podstawy i nie wiedzą jak je rozwijać dalej.
Jedną z najważniejszych kwestii dotyczących uczenia się programowania jest zadanie sobie pytania po co to właściwie robimy. Jeśli Twoją odpowiedzią jest by "zaliczyć przedmiot w szkole" ogólnie nie trać czasu, przestań czytać ten artykuł i poszukaj sobie czegoś innego. Artykuł ten kieruje przede wszystkim do osób, które stwierdziły, że ich to mocno zainteresowało i chcą się uczyć programować, a nie tylko uczyć się języka programowania. Do osób, które chcą używać tego języka, tak by stał się dla nich przydatnym narzędziem, do osób, które chcą coś przy jego pomocy tworzyć.
Linki do źródeł, które chcę przedstawić zawierają naprawdę ogrom treści i potrzeba dużo czasu, by to wszystko przeanalizować, przetrawić, ale najważniejszym nie jest to, by to wszystko zapamiętać i dobrze zrozumieć, ale by gdy będziemy mieli jakiś problem materii, która jest przedstawiona w jednym z tych źródeł pamiętać, gdzie to źródło jest i do niego sobie sięgnąć.
Ja radzę po pierwsze przeczytać artykuł Gynvael'a http://gynvael.coldwind.pl/?id=238. Długi, ale znajduje się w nim bardzo dużo naprawdę cennych rad.
Bardzo istotną kwestią jest, według mnie, wybór problemów i zadań z jakimi się zmierzamy w ciągu naszej nauki programowania. Wyznaję zasadę, że jeśli musimy być w stanie rozwiązywać zadania średniej trudności, dobrze jest próbować rozwiązywać zadania trudne. Wtedy nauczymy się rozwiązywać zadania średnie i będziemy je w stanie rozwiązywać bardzo szybko, a gdy przypadkiem jednak spotkamy zadanie trudne, będziemy mieli już jakąś metodykę jak do niego podejść.
Najtrudniejszym zadaniem jest nauczenie się tak naprawdę myślenia w danym języku programowania, umiejętność zamiany problemu rzeczywistego na jego interpretację, pozwalającą rozwiązać dany problem przy pomocy narzędzi informatycznych. Jest to rzecz, którą trzeba mieć opanowaną bardzo dobrze, by być efektywnym.
Kolejną ważną kwestia jest efektywność naszego rozwiązania. Programy, które tworzymy powinny być efektywne, nie powinny zużywać wiele zasobów (czas też jest swego rodzaju zasobem), by zadowolić użytkownika.
Nauką zajmującą się projektowaniem efektywnych rozwiązań problemów, czyli algorytmów, jest algorytmika i każdy programista powinien być z nią w pewnym stopniu obeznany. Oczywiście programy operują na różnego rodzaju danych, tak więc programista musi też znać struktury danych, które pozwalają na tych danych efektywnie pracować.
By rozwijać te umiejętności powstało wiele stron internetowych, na których znajdują się zadania dla programistów, które mają rozwijać te umiejętności. Różnego rodzaju konkursy programistyczne polegają przede wszystkim na rozwiązywaniu, w pewnym określonym limitowanym czasie, jakiegoś zbioru zadań. W takim zadaniu istotne jest, by zrozumieć co właściwie trzeba obliczyć czyli zinterpretować jakiś problem rzeczywisty tak, by dało się go rozwiązać przy pomocy programu, stworzyć efektywne rozwiązanie z pomocą algorytmiki oraz zaimplementować je przy pomocy języka programowania. Program jest następnie automatycznie testowany, sprawdzana jest poprawność rozwiązania oraz jego efektywność, czyli dla różnych danych wejściowych określany jest limit czasu wykonania programu.
Oczywiście w rozwoju nie wolno zapomnieć też o innych sferach programowania, programowanie nie kończy się tylko na algorytmice i robieniu zadanek. By napisać na przykład prosty kalkulator z przyciskami, trzeba już trochę więcej niż czysty język programowania i algorytmika.
Na początku więc osobiście polecam jednoczesną naukę języka programowania i rozwiązywanie po kolei coraz to trudniejszych zadań algorytmicznych, a od pewnego poziomu stopniowo pisanie coraz to więcej bardziej życiowych projektów. Na początek na przykład napisanie programu wczytującego bitmapę i rozmazującego ją, a gdzieś potem prostą grę 2D.
Co do wyboru języka programowania, ja jednak na początku poleciłbym C++. Przyczyn jest kilka. Jedną z nich jest właśnie to, że ten język jest dostępny na większości konkursów programistycznych oraz stron z zadaniami. Programy napisane w C++ wykonują się "na procesorze" , tak więc efektywnie napisane wykonują się szybciej niż programy napisane w interpretowanych językach programowania. Dla niektórych to wada, dla mnie natomiast zaleta, że, by pisać efektywnie w C++, trzeba więcej wiedzieć jak co działa. Dodatkowo w C++ można pisać używając różnych paradygmatów, wybierając Javę jesteśmy "skazani" na programowanie obiektowe. Dodatkowo programować w C++ w mniejszym lub większym stopniu potrafi większość programistów, tak więc łatwiej znaleźć pomoc. W C++ także bardzo wygodnie pisze się zarówno malutkie programiki, jak i duże projekty.
Zanim przejdę do przedstawiania od czego zacząć naukę języka, chciałbym wspomnieć o tym, że TY czytelniku już przez samo czytanie tego artykułu, przez samo zainteresowanie się nim, niejako pokazałeś, że jesteś w stanie się tego nauczyć. Uważam, że każdy jest się w stanie nauczyć choć podstaw programowania. Jest to trudne i proces nauki na początku może być bardzo bolesny, spędzenie paru godzin nad kilkulinijkowym kodem i szukanie błędu, dlaczego nie działa, wcale nie jest oznaką braku naszej inteligencji, a jedynie niedostatecznymi umiejętnościami, które się dopiero rozwija. Niektórzy uczą się bardzo szybko, inni bardzo wolno. To, że ktoś się uczył wolno wcale nie oznacza, że jest gorszy, w tym czasie mógł lepiej poznać więcej szczegółów i lepiej nauczyć się rozwiązywać problemy implementacyjne.
Podobnie ma się rzecz z rozwiązywaniem zadań algorytmicznych. To, że nie udało się rozwiązać jakiegoś problemu wcale nie świadczy o naszej słabości. Tak naprawdę nie chodzi o samo rozwiązanie problemu, a o dochodzenie do tego rozwiązania. Nie zawsze musi się nam udać dojść do końca. To, że rozwiązanie jest proste nie oznacza, że jest je prosto wymyślić, w większości przypadków jest odwrotnie.
W internecie można znaleźć ogrom kursów i książek, z których nie wiadomo co wybrać. Niestety, ja też tego nie powiem. Sprawa doboru kursu jest kwestią indywidualną. Ja w czasie swojej nauki korzystałem z różnych kursów i stron. Gdy nie rozumiałem jakiegoś zagadnienia opisanego na jednej stronie, szukałem innego opisu, aż do skutku. Co mi się natomiast kojarzy, że z tego korzystałem, to bardzo popularny megatutorial Xion'a https://xion.org.pl/productions/texts/coding/megatutorial/ Inne źródło, które, z tego co wiem, jest popularne to "C++ bez cholesterolu" https://inf.ug.edu.pl/~piotao/old/cbx/ Najpopularniejszą książkami drukowanymi do nauki C++ są, z tego co się orientuję "Symfonia C++" oraz "Thinking in C++", której wersja angielska jest legalnie dostępna w internecie. Oczywiście C++ jest też w wikibooksach https://pl.wikibooks.org/wiki/C++. Po wpisaniu w Google frazy "Kurs C++" można znaleźć wiele interesujących kursów (przypominam, że najważniejsza i tak jest praktyka!).
By rozwiązywać zadania informatyczne, bardzo dobrym kursem jest według mnie kurs C++ na MAIN'ie https://main.edu.pl/pl/user.phtml?op=show&page=cpp&c=70000 Do prawie każdego tematu zawiera dodatkowo zadania, na których można poćwiczyć programowanie (nie wszystkie zadania są proste). Ogólnie polecam przejrzeć sobie MAIN'a, znajduje się tam na przykład duża baza zadań, między innymi z Olimpiady Informatycznej oraz Olimpiady Informatycznej Gimnazjalistów.
Bardzo dobre, wręcz obowiązkowe, jest przeczytanie/przejrzenie sekcji "Dla zawodników" na stronie Olimpiady Informatycznej https://www.oi.edu.pl/l/82/ Znajduje się tam między innymi dokładny opis, jak wysyłać zgłoszenia zadań, jak zadania są oceniane i tym podobne. Ogólnie cała strona olimpiady informatycznej jest bardzo wartościowa (na przykład "Książeczki" czy "Linki") i polecam ją sobie przejrzeć.
Na początek polecam zrobić sobie kurs Algorytmiki na MAIN'ie https://main.edu.pl/pl/user.phtml?op=show&page=algorytmika&c=50000. Powinien od dać jakieś podstawy. Kolejnym bardzo dobrym przystankiem jest sekcja Algorytmika/Zostań zawodnikiem na Wrocławskim Portalu Informatycznym https://informatyka.wroc.pl/algorytmika/zacznij Znajduje się tam trochę podstawowych zagadnień informatycznych wraz z zadaniami do nich.
Gdy już przerobimy powyższe zagadnienia, które uważam za podstawowe, możemy sięgnąć do Wykładów z Algorytmiki Stosowanej http://was.zaa.mimuw.edu.pl/ Według mnie są to bardzo dobrze poprowadzone wykłady, które naświetlają mocno praktyczne aspekty, czyli między innymi jak coś zaimplementować. Przez cały czas pomocą powinien nam służyć Ważniak, a na nim kurs Algorytmy i Struktury Danych http://wazniak.mimuw.edu.pl/index.php?title=Algorytmy_i_struktury_danych
Oczywiście do algorytmiki są też książki, które bardzo dokładnie omawiają wiele kwestii. Świetna jest publikacja Piotra Stańczyka "Algorytmika Praktyczna", która ponadto jest dostępna legalnie w internecie https://www-users.mat.umk.pl/~stencel/acm/algorytmika_praktyczna.pdf (mirror) Kolejną bardzo ważną książką, tak naprawdę swego rodzaju "Biblią algorytmików" nazywaną "Kormenem" jest praca Thomasa H. Cormen, Charlesa E. Leiserson, Ronalda L. Rivest, Clifforda Stein "Wprowadzenie do algorytmów".
Wszystkich informacji w źródłach, które podałem, jest bardzo dużo i nie sposób tego wszystkiego przerobić, nauczyć się i zapamiętać. Trzeba się uczyć z głową. Uczyć się wybiórczo. Przez cały czas oczywiście to wszystko poszerzać informacjami z Wikipedii i innych źródeł, które znajdziemy sami.
Istnieje jeszcze bardzo ciekawy twór zwany "Planem Arka" https://mokip.wdfiles.com/local--files/linki/plan_arka.pdf (mirror). Jest to zbiór tematów i zagadnień, które powinny być poruszone na kółkach mających na celu przygotowanie do Olimpiady Informatycznej. Można z tego planu korzystać wygooglowując sobie kolejne zagadnienia i ucząc się w ten sposób o nich.
Przez cały czas powinny nam towarzyszyć zadania. Trening czyni mistrza - w tym przypadku jest to zdecydowanie prawdą. Na samym początku nie liczmy na to, że zrobimy wszystkie zadania, że nawet za jakieś będziemy się w stanie zabrać. Przedtem napisałem, by uczyć się na zadaniach trudnych i wciąż to podtrzymuję, jednakże stosujmy tę zasadę z umiarem, gdy uczymy się algorytmiki drugi dzień nie liczmy na to, że będziemy w stanie zrobić zadanie z finału Olimpiady Informatycznej.
Zadania na początek powinny być dla nas zadaniami zawartymi pod kursem języka programowania. Większość kursów takowe posiada. Na MAIN'ie możemy nawet nasze rozwiązania wysłać i sprawdzić, czy są poprawne. Jest wiele stron z zadaniami (wiele znajduje się na przykład na tej stronie w dziale "linki"). Na części z nich można posortować zadania stopniem trudności. To pomocne, gdy zaczynamy robimy te najłatwiejsze, stopniowo zwiększając stopień trudności.
Uważam, że można robić zadania najpierw z Olimpiady Informatycznej Gimnazjalistów (najnowsze edycje olimpiady są prostsze od starszych) a potem z Olimpiady Informatycznej. Dodatkowo wszystkie rozwiązania zadań są opisane we wspomnianych wcześniej książeczkach dostępnych na stronie Olimpiady Informatycznej. Oczywiście to tylko propozycja, jedna z możliwości.
Kolejna propozycją jest książka Steven S. Skiena, Miguel Revilla "Programming Challenges", w której znajdują się zadania z rozwiązaniami z ACM ICPC. Zadania można wysyłać na testerkę UVA https://uva.onlinejudge.org/
Najważniejszą zasada jest, że internet jest pełen informacji i wiedzy z interesujących nas tematów. Często nawet warto sobie po prostu poskakać po różnego rodzaju stronach, gdzie ludzie podają ciekawe linki. Posiadam jeszcze taką opinię, że na różnego rodzaju forach ciężko znaleźć jest z algorytmiki coś ciekawego, ale to tylko moja subiektywna opinia.
Warto startować w Olimpiadzie Informatycznej, do drugiego etapu jest się dość łatwo dostać, często wystarczy tylko jedno poprawnie zrobione zadanie, a w drugim etapie można się naprawdę dużo dowiedzieć i najważniejsze - poznać ludzi, którzy zajmują się tą samą tematyką. Kontakty są bardzo ważne, są często bardzo motywujące.
Marek Rusinowski