„Algorytmy, programowanie” – dwa często sparowane słowa. 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.
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…” 😉
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)
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.
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.
Przygotowałam dla was ZBIÓR MATERIAŁÓW DO NAUKI ALGORYTMÓW – ALGORYTMIKA OD PODSTAW
Jestem ciekawa, czy przetrwaliście cały wpis? 😀
Już w najbliższym tygodniu pojawi się wpis o reprezentacji maszynowej grafów „Czym jest graf?”. Chcę, by algorytmika pojawiła się tutaj na stałe i była uzupełnieniem darmowego kursu Pythona na blogu.
Przekonałaś mnie, czekam na więcej 🙂
Jak zwykle świetny wpis Chyba uzależnie się od Twojego bloga A tak poważnie to dla takiego laika w tym temacie jak ja to jest wart 1 000 000 $. Tłumaczy co i jak, skąd zdobywać wiedze, no i przede wszystkim mówi o tym, że trzeba umieć algorytmy aby programować, a nie każdy o tym wie 😉
A mnie wcale…wszystko jest kwestią podejścia. Klepacz kodu po prostu się nie uczy, natomiast ten kto poświęci 2h dziennie solennie TYLKO na naukę i sam sobie podzieli np 30 min matmy, 30 min nowy framework itd, to będzie tak samo „mądry” jak ten po studiach. To nie jest kwiestia tego, że tylko na studiach można zdobyć jakąś konkretną wiedzę, guzik przepraszam prawda 😉 To tak jak z nauką gry na instrumencie – możesz nawet spędzić 20 minut dziennie BYLE to było prawdziwe ćwiczenie i robione regularnie!
akurat na studiach „na studiach można zdobyć jakąś konkretną wiedzę” – można, ale nie każdy student (zresztą dowolnego kierunku) z tej możliwości skorzysta 😉
Natomiast na pewno wiedzę, którą dostaje się gotową, zaserwowaną i opracowaną na studiach można też zdobyć samodzielnie – przez własne poszukiwania i praktykę. Ba! Bardzo do tego pogłębiania wiedzy zachęcam!
Znasz jeszcze jakieś inne strony do 'ćwiczenia’ logicznego myślenia oprócz Brilliant? Ja znam jeszcze tylko Eulerproject i SPOJa, ale zadania z tego drugiego wydają mi się odstraszające dla początkujących 🙁
późno bo późno ale pojawił się wpis z materiałami do nauki algorytmów – mam nadzieję, materiałów starczy na długo: https://www.flynerd.pl/2018/11/jak-sie-uczyc-algorytmow-i-myslenia-algorytmicznego.html
Przetrwałem cały wpis 😛 Trzeba dalej szukać inspiracji i pomocy na Twym blogi 😀
Świetny wpis!
Super język i przede wszystkim duża dawka merytorycznej wiedzy dostosowana na start. Rzadko można trafić na coś tak treściwego i przyjemnego jednocześnie. 😉
Zagadka. Jak napisać algorytm rozpoznający czy artykuł był pisany przez Ritę, czy Flynerdpl?
chyba nie rozumiem zadania? xD
I te algorytmy sa potrzebne w pracy? pytam jako programista z 20 letnim doświadczeniem który algorytmy musi znać tylko na rozmowie rekrutacyjnej albo gdy rozwiązuje zadanie ze Spoja. Jak to jest u was?
Dziękuję, bardzo ciekawy tekst 🙂
Ja z matematyki najlepiej wspominam właśnie te dwa działy- kombinatorykę i logikę. Tej pierwszej nauczylam się z ciekawości w wieku 13 lat, żeby zrozumieć wzór, który wymyśliłam będąc w przedszkolu – serio! Cieszę się, że po latach to procentuje 🙂
Wow, jaki super wpis. Cieszę się, że trafiłam do Ciebie. Zwięźle, zrozumiale. Tak lubię, dzięki