Po co programiście algorytmika?

Algorytmika to nauka o algorytmach. Magiczne słowo, którego dumni absolwenci Informatyki często używają, żeby odróżnić się od zwykłych klepaczy kodu, którzy nauczyli się jednego języka. Twierdzą, że bez studiów nie jest się prawdziwym programistą, bo nie rozumie się technologii, z którą się pracuje.

I jak zawsze uśmiecham się pobłażliwie na widok facebookowych burz i wywyższania pseudospecjalistów z 2 roku studiów, to jest w tym ziarno prawdy.

Studiowanie informatyki daje zrozumienie podstaw technologii, którą się oprogramowuje. Daje zrozumienie czym komputer jest, czym nie jest i dlaczego zbiór instrukcji wydanych maszynie zwraca nam np. rozliczenie PIT-u czy skręt w prawo w marsjańskim łaziku (o poruszaniu się łazików w wykładzie poniżej – tylko jest trochę długi).

Jednak czy naprawdę musisz rozumieć działanie tajemniczych sumatorów bitowych, aby stworzyć swoją stronę internetową albo hobbistycznie napisać pacmana na komórkę?

Spoiler: nie.

Bez logicznego myślenia nie ma dobrego programisty?

Nikt mnie nie ostrzegał, że przez pierwszy semestr na Wydziale Informatyki częściej niż laptopa powinnam nosić ołówek i linijkę. Moje sumatory, nieszczęsne bramki logiczne zaczynały wyglądać, jakby przedszkolak rysował skrzyżowanie patyczaków ze statkami kosmicznymi, albo porno pająków w dużym przybliżeniu.

sumatory

To był dopiero wstęp do informatyki (i tak też nazywał się przedmiot). Umiejętności rysowania krzywych bramek logicznych nigdy nie udało mi się wykorzystać w praktyce 😉

Przez pierwszy semestr trzeba było przebrnąć przez matematykę dyskretną z logiką matematyczną, kombinatoryką i teorią grafów na czele. Ta wiedza może wydawać się bezużyteczna, dopóki nie utniesz w warunku if/else, zastanawiając się, dlaczego zaprzeczenie lub (logiczne OR) daje i (logiczne AND) i na odwrót.

Królowa nauk na studiach miała czasem przyjemne oblicze. Na przykład, wiecie, że matematyka udowadnia: „wszystkie życzenia kobiet mogą zostać spełnione…” 😉

matematyka dyskretna - twierdzenie haremy Halla

Ten zbiór pozornie nieżyciowych pojęć prowadzi do pewnego sposobu myślenia, algorytmicznego podejścia do problemu. Pozwala rozłożyć każdy problem na podproblemy i szybko znaleźć rozwiązanie.

I tutaj dochodzimy do sporu programista po kursie kontra absolwent informatyki. Nauczenie się samego języka programowania nie uczy rozwiązywania problemów.

Po co programiście algorytmy?

Do dziś pamiętam pierwszy wykład z języka ANSI C, gdzie wykładowca kazał nam zapamiętać na całe życie:

Algorytm – to sposób rozwiązania problemu w skończonej liczbie kroków

Istnieje kanon podstawowych problemów algorytmicznych, które omawia się na studiach i rozwiązuje wykorzystując znane podejścia do problemu. Poznaje się techniki pisania algorytmów, tak by były one jak najszybsze, jak najbardziej opłacalne, słowem zoptymalizowane.

(Poniżej ja po zajęciach z Algorytmów i Struktur Danych, a do tego programowanie dynamiczne na przykładzie problemu plecakowego)

ja i problem plecakowy

Za każdym razem, gdy tworzysz rozwiązanie jakiegokolwiek problemu, za każdym razem, gdy zapisujesz swój sposób myślenia lub metodę dochodzenia do jakiegoś wniosku, używasz algorytmów. Zależy Ci, by liczba kroków była jak najmniejsza.

Jesteście tu, bo interesuje was programowanie. Więc po co piszę o tych algorytmach?

Na pewno znacie takie zadania jak:

  • wyświetlenie w konsoli tabliczki mnożenia w formie sformatowanej tabeli 10×10
  • znalezienie w dużej tablicy wszystkich liczb nieparzystych i zsumowanie ich wartości
  • rysowanie choinki w konsoli

Wiele osób, które uczą się programowania, ma problemy z takimi zadaniami. I nie dlatego, że nie znają języka programowania, bo często są po wielu kursach, w tym tych za tysiące złotych, ale problem w tym, że mimo znajomości języka nie umieją w nim myśleć.

Programiści piszą algorytmy

Piszą je programiści dobrzy i też tacy sobie – różnica kryje się w jakości dostarczanych rozwiązań.

W większości przypadków programiści tworzą algorytmy dla konkretnego problemu, który próbują rozwiązać, bądź wykorzystują znane rozwiązania.

Mówisz, że uczysz się programowania?
Już to robisz – aby rozwiązać problem, tworzysz algorytm (instrukcje w krokach), który wykonuje komputer. W skrócie programowanie to zapisywanie algorytmów. Kiedy piszesz kod, przedstawiasz swojej maszynie algorytm w wybranym języku programowania.

Skoro programista po studiach i bez studiów pisze kod, to na czym polega różnica?

Powiedzmy, że w tym wypadku w moim odczuciu różnica między przeciętym programistą (tym „klepaczem kodu”) a dobrym programistą, inżynierem oprogramowania (który nie musi z dumą podkreślać swojego wykształcenia) polega na tym, że inżynier potrafi wyjaśnić, dlaczego algorytm działa i jak do niego dochodził, w jakim stopniu ten algorytm jest lepszy od innego.

Jest jeszcze wiele dziedzin, z którymi można się zapoznać na Informatyce (bo na pewno nie nauczyć „na raz”) i są przydatne, ale nie ma rzeczy, których nie można poznać też samodzielnie. Każdy może uzupełnić swoją wiedzę w zakresie logiki, kombinatoryki czy opanować podstawy algorytmów i struktur danych. Pojęcia dotyczące optymalizacji, złożoności obliczeniowej czy pamięciowej to nie jest czarna magia.

Bzdurą jest twierdzenie, że nie można nauczyć się logicznego myślenia. Można, ale nauka wymaga ćwiczeń, rozwiązywania problemów i testowania tych rozwiązań.

Co możesz zrobić, by nauczyć się logicznego myślenia?

1. Wróć do starej dobrej matematyki

Wytarcie kurzu ze swojego starego podręcznika od matmy i przeproszenie się z liczbami, może brzmieć jak jakiś koszmar dla wielu osób. Nie trzeba od razu studiować całego podręcznika od początku, ale na pewno warto zajrzeć do logiki matematycznej czy kombinatoryki. Przypuszczam, że kombinatoryka może bardziej się spodobać na start.
matematyka w programowaniu

2. Spójrz co robią na studiach

Jak się nauczyć logicznego myślenia? Jak się nauczyć algorytmów? Czy algorytmika jest trudna? Dlaczego studiowanie informatyki jest lepsze od samego programowania?

Te i inne pytania widzę w kółko na grupach i jeśli chcesz, to naprawdę nauczenie podstaw algorytmiki nie jest takie trudne, jak się wydaje. Jeśli ciekawi Cię co robią studenci informatyki, to sylabusy na studiach są publiczne. Większość wykładowców udostępnia plan swoich zajęć, a wielu publikuje też swoje slajdy w materiałach dla studentów. Wygooglowanie hasła: „Algorytmy i struktury danych” może Ci pomóc przebrnąć przez jeden z absolutnie podstawowych tematów. Niedługo też na blogu pojawią się podstawy takie jak grafy czy sortowania.

3. Aplikacje i gry logiczne

Istnieje sporo gier logicznych, które rozruszają szare komórki. Jeśli chcesz skupić się konkretnie na algorytmach, to sprawdź darmową aplikację Brilliant. Można w niej poczytać i porozwiązywać zadania matematyczne, algorytmiczne. Dostępna jest wersja bezpośrednio w przeglądarce, jak i aplikacja mobilna (Android/iOs).

4. Rozwiązuj zadania i pisz kod

Wracając do punktu 1 – czy nie byłoby o wiele łatwiej, gdyby to komputer rozwiązał za ciebie zadania z twojego podręcznika od liceum? Czy jesteś wstanie zadania z kombinatoryki przekazać jako zbiór instrukcji w twoim kodzie? Spróbuj – tak wykorzystasz swoje umiejętności i logiczne myślenie w praktyce. Ponadto dzięki praktyce nabierzesz wprawy w pisaniu coraz lepszego, lepiej przemyślanego kodu. Przykładowe zadania wrzuciłam w ogromnej paczce ponad 1000 zadań w Pythonie i nie tylko.

Jestem ciekawa, czy przetrwaliście cały wpis? 😀
Już w najbliższym tygodniu pojawi się wpis o reprezentacji maszynowej grafów. Chcę, by algorytmika pojawiła się tutaj na stałe i była uzupełnieniem darmowego kursu Pythona na blogu.