Algorytmika to dziedzina nauki, bez której żaden program komputerowy nie mógłby istnieć. Chodzi o rozwiązanie problemu za pomocą ciągu procedur, znaczków lub po prostu zestawu powiązanych ze sobą bloków. Swoją przygodę z programowaniem zaczynałem między innymi ze środowiskiem o nazwie ELI oraz Logo (tak to ten z żółwiem ;):
Przeciągało się kilka bloków, wpisywało magiczne cyferki i tak powstawał algorytm. Zabawa przednia, jednak możliwości były mocno ograniczone…
Pierwsze algorytmy
Nawiązałem do swoich początków, bo wtedy właśnie zaczęła się moja przygoda z algorytmiką. Tworzyliśmy figury geometryczne, ślimaki, znaki drogowe, etc. Zahaczyliśmy nawet o coś takiego jak fraktale (zbiory powiązanych ze sobą obiektów, różniących się od siebie np. wielkością w zależności od iteracji). Do czego takie fraktale mogą być przydatne? Przede wszystkim do odwzorowywania otaczającej nas przyrody oraz zjawisk atmosferycznych. Powiedzmy, że chcesz zamodelować rozrost aloesu (kiedyś była taka gra z rozrostem podobnej zielonej roślinki, ale na potrzeby tego artykułu zostańmy przy aloesie ;). Gdy popatrzysz na jego listki można zauważyć pewną prawidłowość: liście zaczynają rosnąć od środka, układając się w spiralę i za każdym krokiem są coraz większe. To idealny przykład fraktali w przyrodzie.
Więcej przykładów? Nie ma sprawy:
- kształty chmur
- formacje skalne
- kalafior rzymski
- i wiele, wiele innych
Do rzeczy, dlaczego pokazuje Ci te przykłady i opowiadam o fraktalach? Z doświadczenia wiem, jak ciężko uczyć się algorytmiki „na sucho”, nie znając problematyki, zagadnienia a co więcej efektów jakie chcemy osiągnąć. Starałem się zainteresować Ciebie czytelniku, czymś całkowicie niezwiązanym ze świata IT, czymś co spotykamy na co dzień, ale często nie zdajemy sobie z tego sprawy. Następnie powiedziałem Ci jak nazywa się dziedzina rozwiązań tego problemu i jak można do niej podejść. Jeśli projektujesz grę komputerową i chcesz jej nadać więcej realizmu, może zainteresujesz się fraktalami.
Co jest najważniejsze w nauce algorytmiki?
Według mnie, głównym aspektem, o którym zapominamy przy nauce algorytmów jest pytanie po co? Pamiętam na uczelni, kazali mi się nauczyć kilku algorytmów sortujących i pisać z nich kolokwia. Nie wyszliśmy od genezy problemu, po prostu stwierdziliśmy, że trzeba się ich nauczyć na pamięć, zdać i… oczywiście zapomnieć. Bo to wszystko jest już gdzieś zaimplementowane w bibliotekach i nikt z nas ręcznie tego pisać nie będzie.
Jak myślisz co można utracić podchodząc do tego tematu w taki sposób? Uczysz się jedynie konkretnego przepisu, bez podstawowego problemu. Zadaj sobie teraz pytanie, czy wiesz po co są te wszystkie rodzaje sortowań? Czym się one różnią, kiedy co zastosować, a może po prostu zaufać metodzie sort z biblioteki bo zrobi to lepiej? Właśnie to rozróżnia osoby początkujące od doświadczonych programistów. Świadomość, wiedza na temat co i gdzie zastosować, żeby zoptymalizować program.
Analizując i rozumiejąc problematyką, nie tylko znajdujemy odpowiednie rozwiązanie, ale douczamy się również (niejako podprogowo) sposobu rozwiązywania danego zagadnienia. Pomyśl, jeśli zrozumiesz koncept dziel i zwyciężaj możesz zastosować tę regułę wszędzie gdzie napotkasz problem ze zbyt złożoną (na pierwszy rzut oka) logiką.
Na łamach tego bloga, postaram się wstawiać opisy algorytmów, w sposób przystępny dla każdego, z obrazkami, praktycznymi przykładami i przede wszystkim odpowiedzią na pytanie po co? Inwencją zaciągnąłem z poniższej książki. To doskonała pozycja dla osób początkujących, które chcą zrozumieć problem, a dopiero potem podejść do jego rozwiązania na różne sposoby. Link obok przekierowuje do serwisu ceneo, gdzie książkę można nabyć od około 30zł – jeśli chcesz rozwijać się jako programista to zdecydowanie polecam. Dodatkowo, każdy klik pomaga mi w utrzymaniu bloga.
Co warto zapamiętać:
- ucz się sposobu rozwiązywania problemu, a nie tylko konkretnego „przepisu”
- wyjdź od problemu i pamiętaj często istnieje wiele algorytmów rozwiązujących dany przypadek
- im więcej algorytmów poznasz tym lepsza będzie Twoja intuicja, jak rozwiązać dany problem
- zadawaj sobie pytanie dlaczego rozwiązanie (algorytm) wygląda tak, a nie inaczej
- staraj się odnieść do rozwiązania spoza branży IT, nasz mózg lepiej zapamiętuje informację, jeśli jesteśmy w stanie powiązać zagadnienia z kilku dziedzin
- nie bój się eksperymentować, analizuj dany algorytm pod kątem dostępnych zasobów (pamięć, czas – nie zawsze najszybszy algorytm, okaże się najlepszy)
- implementuj własne wersje popularnych algorytmów, nie tkwi w przekonaniu, że wszystko zostało już zakodzone i nie ma sensu robić czegoś „po swojemu”. Być może ta wiedza przyda Ci się już na pierwszej rozmowie rekrutacyjnej? 😉
A Ty jakie masz sposoby na naukę algorytmów, chcesz podzielić swoją techniką? Zapraszam do pozostawienia komentarza i pomocy innym adeptom programowania.
mój sposób na naukę algorytmów to wszystkie puzzle programistyczne, na przykład project euler. Okazuje się często, że brute force to nie najlepszy pomysł i trzeba szukać głębiej. A najlepiej wszystko potem opisać na blogu i w ten sposób uporządkować i zachować wiedzę na przyszłość 😉
Jasne, warto spisywać swoje spostrzeżenia 🙂 Pamiętam, że do nauki niektórych algorytmów potrzebowałem kilka dni – po prostu nie wchodziły do głowy, a dostepne materiały były mało „przyjazne”, po tym czasie byłem w stanie wytłumaczyć komuś jak ma to działać w kilkanaście minut.
Widze, że na blogu opisujesz grę w życie – to jeden z moich pierwszych projektów na studiach, później wykorzystałem automaty komórkowe w swojej inżynierce, jest w tym coś „magicznego” 😉