Mówi się, że informatyka jest nauką o rozwiązywaniu problemów. Po przeczytaniu kilku różnych wpisów na blogach dotyczących studiowania informatyki (zwłaszcza tekstu Gynvaela) postanowiłem trochę napisać o samodzielnej nauce programowania. Znacznie się różni od metod przyjętych na uczelniach, sądzę, że może być przydatna zwłaszcza na studentów. Tego sposobu nauki nie poznacie w szkole (przynajmniej polskiej), będziecie natomiast musieli przyswoić go w pracy.
Podstawowe zadanie programisty to "get it done". Trzeba zrobić coś, co działa - dokładnie tak, jak działać powinno. Typowym zadaniem uczelnianym jest "zaimplementuj algorytm sortowania w miejscu" - treść zadania w połączeniu z Google pozwala rozwiązać problem bez większych trudności. Natomiast na rozmowach kwalifikacyjnych czy w pracy nie spotkałem się z takim poleceniem nigdy - za to może pojawić się coś typu "trzeba sortować te dane dbając o uniknięcie alokacji i fragmentacji pamięci". Rozwiązanie to samo, droga rozwiązania zupełnie inna.
Najlepszym, w moim odczuciu, sposobem na samodzielną naukę programowania i wybór materiału jest "podejście problemowe". Należy znaleźć jakiś problem, jakiś cel, zadanie. Przykładowo, gdy chcemy się nauczyć programowania 3D: "zrobić program, który wyświetli animowany model człowieka chodzący po wodzie w kółko, z odbijającymi otoczenie okularami i kamerą umieszczoną za jego plecami". Pierwszym etapem rozwiązywania problemu jest znalezienie metod jego rozwiązania: w tym wypadku będą to: podstawy API graficznego, obsługa kamery, materiał wody (odbicie, załamanie światła), mapowanie otoczenia (okulary), ładowanie modelu, wydajny rendering modelu, animacja. W ten sposób wiemy, czego dokładnie chcemy się nauczyć i uczymy się tego.
Takie ćwiczenie pozwala dodatkowo rozwinąć umiejętności związane z pierwszą częścią zadania: znalezieniem możliwych rozwiązań problemu. Tu znajduje się podstawowa siła studiów i jednocześnie podstawowa wada samodzielnej nauki: pięć lat na uczelni daje nam informacje dotyczące potencjalnych rozwiązań różnych problemów. Studia nie uczą rozwiązywania problemów, dają wiedzę na temat różnych metod ich rozwiązania, z których może akurat przypomni się nam ta właściwa. Dlatego ważnym dopełnieniem samodzielnej nauki programowania jest czytanie - jak najwięcej, jak najobszerniej, jak najbardziej ogólnie - ponieważ buduje "bazę rozwiązań", potrzebną przy radzeniu sobie z zadaniami.
Te dwie rzeczy: znajomość rozwiązań i umiejętność ich szukania są mocno połączone i budują dobrego programistę. Nie ma znaczenia, czy znasz 20 algorytmów sortowania, 15 algorytmów kompresji i 80 języków programowania. Nie ma znaczenia, dopóki wśród znanych przez Ciebie znajduje się ten algorytm sortowania, który będzie przydatny w tym konkretnym problemie, ten język programowania, który najlepiej rozwiąże zadany problem, ten algorytm kompresji, który będzie wystarczająco szybki i skuteczny. Oczywiście: jeśli tylko słyszałeś o 20 algorytmach sortowania, a umiesz zaimplementować sortowanie przez wstawianie i quicksort, w razie konieczności przypomnisz sobie, który z tych algorytmów jest najlepszym rozwiązaniem - i szybko go się nauczysz.
Ostatnio pisałem prostego chatbota, interpretującego wypowiedzi i podejmującego odpowiednie akcje w pewnych sytuacjach (bot IRCowy, miał banować za przekleństwa). Zamiast szukać/pytać po forach, jak zaimplementować takiego bota, zacząłem... czytać o przetwarzaniu leksykalnym. Same ogólne teksty, zero kodu implementującego. Po kilku godzinach czytania miałem listę możliwych rozwiązań do zastosowania w pisanym programie - wiedziałem o algorytmach przetwarzania tekstu niewiele, nie umiałbym napisać ich "z palca" - w zamian za to poznałem ich tyle, że mogłem wybierać najbardziej adekwatne do konkretnych problemów rozwiązania, dopiero po wyborze doczytywać szczegóły. Bardzo często praca programisty wygląda w podobny sposób.
Podsumowując: z nauką programowania jest jak z nauką czegokolwiek innego: nie kuj rozwiązań na pamięć, ucz się co i w jaki sposób można rozwiązać.
Brak komentarzy:
Prześlij komentarz