Czy programista potrzebuje matematyki?

Pytanie o matematykę i programowanie jest jednym z najczęstszych pojawiających się na mojej skrzynce e-mailowej. Dlatego postanowiłem napisać artykuł opisujący zależność pomiędzy nimi. Jeżeli wciąż zastanawiasz się, do czego matematyka jest potrzebna programiście, w tym artykule poznasz mój punkt widzenia na ten temat.

Karol Trybulec. Senior Frontend Developer w Andea. W 2012 roku ukończył technikum informatyczne. W 2018 roku uzyskał tytuł magistra inżyniera na Wydziale Mechanicznym Politechniki Krakowskiej, na kierunku informatyka ze specjalizacją inżynieria oprogramowania. Interesuje się informatyką w pojęciu ogólnym, w szczególności programowaniem (C/C++, C#/.NET oraz elementy Assemblera), tworzeniem aplikacji internetowych (XHTML/HTML, CSS/SASS, SQL, JavaScript, JQuery, Angular2+, ASP.NET MVC, .Net CORE, Node.JS) oraz zabezpieczeniami komputerowymi.


Związek pomiędzy matematyką i informatyką

Już na samym początku trzeba wspomnieć, że informatyka jako dziedzina nauki wywodzi się bezpośrednio z matematyki. Dawniej stanowiła jej część, jednak przez jej niesamowicie szybki i daleko idący rozwój została uznana za osobną dziedzinę nauki. Informatyka z roku na rok ewoluuje, a celem tego procesu jest szybsze osiąganie wyników za pomocą narzędzi, jakie udostępnia.

Gdyby pokusić się o narysowanie piramidy informatyki, z całym przekonaniem jej podstawą byłaby właśnie matematyka. Z samej definicji wynika, że jest to dziedzina nauki wysoce abstrakcyjna, opierająca się na świecie cyfrowym.

Nauka programowania jest jak nauka matematyki

Z moich obserwacji i doświadczeń wynika, że nauka programowania niczym nie różni się od nauki matematyki. Obydwie te nauki, jako że ze sobą bardzo związane, są naukami nienamacalnymi.

Ucząc się matematyki, przechodzimy przez wszystkie klasy szkoły podstawowej, średniej i wyższej. Chyba każdy z nas poznał to uczucie, kiedy poznając podstawy matematyki w szkole podstawowej, miał wrażenie, że nigdy nie będzie w stanie być lepszym i rozwiązywać trudniejszych zadań. Zadania ze studiów wyglądają wtedy jak magia, a uczeń czuje się przytłoczony ogromem materiału.

Mimo tego niekomfortowego wrażenia lata edukacji mijają, a ludzie nie wiedząc kiedy, stają się coraz lepsi. Zaczynając naukę od tabliczki mnożenia, docieramy do wielomianów, funkcji, szeregów, granic, całek, różniczek itd. Małymi krokami wszystko zaczyna się układać.

Tak samo przytłaczająca wydaje się nauka programowania. Zaczynając jego naukę od podstaw, a więc podstawowych konstrukcji programistycznych, całość wydaje się bezsensowna. Programy pobierające i wyświetlające dane na czarnej konsoli wydają się niepotrzebne, a człowiek ma wrażenie, że nigdy nie będzie w stanie napisać skomplikowanego systemu. Tak jak w przypadku matematyki, jest to wrażenie złudne, ponieważ przez te początkowe etapy po prostu trzeba przejść.

Dlatego właśnie warto studiować

Podobieństwo w nauce matematyki i informatyki jest jednym z argumentów, dla których warto iść na studia informatyczne. Na studiach otrzymuje się odpowiednio poukładane porcje materiału, które podawane są w odpowiedniej kolejności. Po 5 latach studiów i wielu pozornie nieprzydatnych przedmiotach znacznie poszerza się nasz horyzont w dziedzinie informatyki. Nie tylko programowanie, nie tylko sieci informatyczne, nie tylko grafika inżynierska, tylko całe fundamenty nauki jaką jest informatyka.

Nie idąc na studia, nauka programowania może być przytłaczająca i ciężka. Nie mówię, że nie da się go nauczyć samemu, jednak przypomina to sytuację chęci nauczenia się matematyki ze studiów, nie umiejąc tabliczki mnożenia ani ułamków. Człowiek pozostawiony sam sobie może mieć problemy z odpowiednim przejściem przez wszystkie etapy nauki, poprzez te najbardziej prymitywne (czyli pętle i wyświetlanie cyferek w czarnej konsoli) aż po bardziej złożone (kolorowe okienka, interfejsy użytkowników, wzorce projektowe, metodyki).

Dlatego programowanie jest trudne

Na koniec warto wspomnieć o interesującym fakcie, dlaczego programowanie wydaje się pozornie tak trudne? Odpowiedź jest oczywista: jego nauka jest jak nauka matematyki, a w Polsce jego nauczanie jest bardzo słabe. Jest to względnie nowa dziedzina nauki, a społeczeństwo nie nadąża z jego wprowadzeniem do szkół. Patrząc na wysokie zarobki programistów, globalną cyfryzację i wielki deficyt na rynku pracy oczywistym wydaje się, że programowanie powinno być przedmiotem szkolnym prowadzonym choćby w minimalnym wymiarze godzin – tak, aby zaszczepić podstawy.

Matematyki uczymy się całe życie, pewnie około 15 lat. Programowania nie uczymy się nigdzie. Dlatego stając nagle przed decyzją „zaczynam uczyć się programowania„ człowiek staje przed ogromnym wyzwaniem opanowania potężnej dziedziny nauki, bez jakichkolwiek podstaw wiedzy. Wtedy nie wiadomo czego się łapać, a poznawanie podstaw wydaje się bezsensowne.

Gdzie ta matematyka w informatyce?

O tym, że informatyka jest powiązana z matematyką, można dyskutować długo. Niektórzy się z tym zgadzają, inni stanowczo zaprzeczają. Jako programista skupię się oczywiście na matematyce w programowaniu. Na samym początku trzeba zrozumieć, że matematyka to nie tylko operacje algebraiczne, nie tylko analiza matematyczna. Wiele osób sądzi, że matematyki w programowaniu nie ma i wtedy zastanawiam się, czy oni chcieliby pisać kod całkami, żeby tę matematykę zobaczyć?

Dla mnie bardzo ciekawymi przedmiotami na studiach informatycznych były matematyka dyskretna i metody optymalizacyjne. Gdybym miał zdefiniować matematykę dyskretną, nazwałbym ją pomostem pomiędzy światem matematyki a programowania. Te dwa przedmioty są tak ściśle powiązane, że w zależności od specjalizacji nauczyciela akademickiego mogą bardziej przypominać zajęcia z programowania lub matematyki. Matma dyskretna jest nauką o zbiorach dyskretnych (nieciągłych). Jej przykładowe poddziały to:

  • logika matematyczna – bardzo fajne i przydatne. Poznaliśmy logikę Boolowską i jej prawa, prawa de Morgana, operacje na zdaniach, aksjomaty, tautologie, kwantyfikatory, implikacje, indukcję matematyczną, podstawy teorii mnogości, dopełnienia zbiorów itd. Na kolokwiach musieliśmy np. uprościć skomplikowane zdania, używając praw z logiki Boola. Opiera się na nich cała elektrotechnika, służą między innymi do upraszczania obwodów elektronicznych i znajdują zastosowanie oczywiście w projektowaniu instrukcji warunkowych w programowaniu. Np. zgodnie z prawem zaprzeczenia koniunkcji instrukcję if !(p&&q) można zapisać jako if (!p || !q). Z rachunku logiki Boola korzysta się świadomie lub nieświadomie w całym życiu zawodowym, wykorzystywałem tę wiedzę także podczas programowania mikrokontrolerów AVR.
  • kryptografia – czyli jak działa szyfrowanie, jak działają szyfry jednostronne lub dwustronne. Jak to się dzieje, że asymetrycznego algorytmu RSA nie da się złamać i dlaczego są nim zabezpieczane np. komunikacje w grach MMORPG pomiędzy klientem a serwerem. Jak ważną rolę pełni brak wzoru na liczby pierwsze w algorytmach asymetrycznych i dlaczego cała kryptografia obecnie nam znana zawali się w momencie powstania komputerów kwantowych.
  • teoria gier – czyli jak program ma podejmować właściwe decyzje, dlaczego gra w kółko krzyżyk jest grą o sumie stałej i dlaczego można za pomocą algorytmu minimax napisać robota komputerowego, który nigdy nie przegra. Dlaczego w szachach nie jest to już tak proste. Dylemat więźnia i problem wyboru obarczony stratą lub zyskiem.
  • teoria grafów – w informatyce po prostu magia. Często wykorzystywane tam, gdzie nigdy byś się tego nie spodziewał. M.in. problem znajdowania najkrótszej drogi w grach (algorytm Dijkstry), problem mostów, drzewa, reprezentacja problemów za pomocą grafów, problem najlepszego sąsiada. Nie wiem, czy wszyscy wiedzą, ale dzięki teorii grafów mamy takie portale jak jakDojade.pl.

Czy czytając powyższe punkty jest sens się zastanawiać, czy matematyka jest związana z programowaniem? Opisałem bardzo ogólnie wyłączenie jeden przedmiot, którym jest matematyka dyskretna.

Być może, ktoś czytający ten artykuł chciałby poznać więcej relacji pomiędzy matematyką a programowaniem. Spróbujmy wypisać problemy programistyczne przypisane do działów matematyki:

  • operacje algebraiczne/analiza matematyczna  – pisanie wszelkiego rodzaju algorytmów, zwracanie uwagi na złożoność obliczeniową, raczej są to dedykowane i wyspecjalizowane aplikacje desktopowe. Może to być choćby program do obliczania maksymalnego naprężenia w prętach, który napisałem na drugim roku studiów jako forma zaliczenia mechaniki. Umiejętność odróżnienia algorytmów O(n^2) od O(ln(n)), rozumienie, które warto optymalizować. Umieć zapisać funkcję matematyczną f(x) = x^2 jako funkcję w programie.
  • statystyka – w programowaniu raczej mało, ewentualnie zajmowanie się big data.
  • optymalizacja – gdy pierwszy raz zetknąłem się z tym na studiach, byłem zafascynowany. Związane z programowaniem liniowym i matematyką dyskretną. Przykładowo po poznaniu algorytmu optymalizacji liniowej simplex napisałem swój kalkulator dietetyczny dostępny pod adresem www.kalkulator-diety.pl. Jego zadaniem jest dobranie takich ilości produktów które wybiorę, aby odpowiadały mojej osobie (czyli automatyzuje układanie diety żywieniowej). Jest to też temat mojej pracy magisterskiej.
  • algorytmy genetyczne – stosunkowo nowość, mają tak szerokie zastosowanie, że aż ciężko wszystko wypisać. Służą do zaprogramowania sztucznej inteligencji, przewidują pogodę, umieją grać na giełdzie forex. Mój współlokator używa ich do pisania aplikacji automatycznie układającej plan zajęć.
  • algebra liniowa – dużo tego jest w programowaniu gier komputerowych (nie używając silników graficznych wysokiego poziomu). Trzeba umieć obracać obiekty w przestrzeni, wszystko opiera się na macierzach i przekształceniach trygonometrycznych. Co najważniejsze trzeba robić to optymalnie, a nie metodą prób i błędów. Używane także we wszelkiego rodzaju obróbce grafiki (filtry, rozpoznawanie kształtów, analiza klatek, oprogramowanie do fotoradarów).

W obecnym projekcie używamy maszyny stanów (maszyny Turinga) do definicji stanów dokumentów, też była omawiana na matematyce dyskretnej. Na koniec napiszę krótko: nie chcę mi się więcej wymyślać. Nie ma się co sprzeczać nad tym, że informatyka to matematyka, a w programowaniu też można jej spotkać całkiem sporo. Jeżeli ktoś sądzi, że w programowaniu nie ma matematyki, to zastanówmy się, czego by się spodziewał? Pisania programu ułamkami? Przecież nie tylko na „liczbach” kończy się matematyka.

Jednak rozważmy dalej, czy można programować, nie umiejąc matematyki?

Zapraszamy do dyskusji

Patronujemy

 
 
More Stories
Google Cloud w Polsce. Śniadanie z Programowaniem #42