pprogramowanie;

// blog o programowaniu i branży IT

rss

Czy matematyka jest potrzebna programiście?

25 sierpnia 2017, kategoria: Studia i praca
matematyka-programista

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

Związek pomiędzy matematyką i informatyką

Zaczynając ten artykuł należy 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 własnych 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 ucząc się podstaw 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 totalnych 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 wstanie 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ą 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 ogromne 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, wcale. 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ą. Ja 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 dyskretnametody 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:

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:

W obecnym projekcie używamy maszyny stanów (maszyny turinga) do definicji stanów dokumentów, też była omawiana na matematyce dysrketnej. 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?

Trzeba programować szybciej

Aby dopełnić ten artykuł i rozwiać wszystkim wszelkie wątpliwości trzeba przeanalizować jeszcze jeden ważny aspekt. Trzeba odpowiedzieć sobie na pytanie: dokąd zmierza informatyka a w szczególności programowanie? Programowanie jako ważny podzbiór informatyki rozwija się nieprawdopodobnie szybko. Praktycznie nie da się nadążyć za wszystkimi nowymi językami i platformami programistycznymi. Po co one powstają? Oczywiście po to, aby było szybciej i lepiej.

Przechodząc przez programowanie od najniższej warstwy (tzw. programowanie embedded), polegało ono na operowaniu instrukcjami procesora (czyli język assembler). Później powstał nieobiektowy język C, później jego starszy brat hybrydowy język C++. Mimo, że bardzo potężny wytwarzanie oprogramowania ciągle było zbyt wolne. Zaczęły powstać języki wysokiego poziomu czyli Java i C#. Programowanie stało się teraz ultra szybkie. Co będzie dalej? W między czasie modny jest JavaScript, ponieważ jest totalnie niezależny od platformy na jakiej się wykonuje. Do JavaScripta powstało wiele platform takich jak AngularJSReactBackboneKnockout.js. Wszystko po to aby było.. szybciej! Stworzony został serwer Node wraz z setkami tysięcy gotowych modułów (sławny node_modules, który często ważą 50GB, czyli 1000 razy więcej niż sam projekt).

Wszystkim zależy na czasie, programowanie rozwija się w stronę szybkiego wytwarzania kodu. Programiści są drodzy, a pisanie systemów informatycznych trwa bardzo długo. Pisanie programów “wolno” nie ma sensu, ponieważ zanim powstaną już stają się przeterminowane. W tym momencie pojawiają się określenia tzw. programisty oraz dewelopera.

Programista a deweloper

Na różnicę pomiędzy programistą a deweloperem nakierował mnie kiedyś wykładowca od mechaniki. Na zajęciach wywiązała się ciekawa dyskusja, na temat różnicy pomiędzy jednym a drugim. Po krótszej chwili doszliśmy do wniosku, że programista to osoba odpowiedzialna typowo za klepanie kodu. Za napisanie algorytmu, który ma działać tak i tak, który ma pobrać jakieś dane i zwrócić wynik. Programista nie zajmuje się niczym więcej. Fajnie gdyby programista miał wysokie umiejętności matematyczne w momencie gdy pisze bibliotekę, która będzie odpowiedzialna np. za przeprowadzanie obliczeń numerycznych.

Z drugiej strony deweloper (ang. software developer) jest osobą, na którą trzeba spojrzeć nieco szerzej. Jest on odpowiedzialny za większą koncepcję, ma wymyślić sposób, umieć połączyć kilka technologii lub kilka rozwiązań. Dla programisty z krwi i z kości ważne mogą okazać się umiejętności matematyczne/fizyczne/mechaniczne lub inne, w zależności w jakim projekcie pracuje. Dla dewelopera ważniejsze może się okazać znanie wielu technologii, umiejętność wykorzystania gotowych rozwiązań i bibliotek dostarczonych przez programistów.

Gdzieś kiedyś usłyszałem, że programista opracowuje skomplikowane biblioteki, które mają działać najszybciej jak to możliwe, a deweloper ma umieć z tych bibliotek korzystać. I tak np. pisząc gry deweloperzy korzystają z gotowych silników graficznych, którą są napisanie idealnie pod względem wydajności, i nie jest im do tego potrzebna matematyka. Z drugiej strony, nad silnikiem graficznym musieli pracować programiści, który na pewno nie mięli problemów z algebrą liniową.

Podział na programistę i dewelopera nie jest moim wymysłem. Choć w naszym kraju nie jest ten podział zbytnio respektowany, to jednak odwrotnie jest w USA. Tam stanowisko programisty (ang. programmer) a stanowisko dewelopera (ang. software developer) jest po prostu inaczej definiowane, te osoby odpowiedzialne są za inne rzeczy.

programista-developer

Czy można programować nie umiejąc matematyki

Każdy medal ma dwie strony. Mimo, że matematyka jest przydatna oczywiście można programować bez niej. Przede wszystkim matematyka nie jest potrzebna front-endowcom (ang. front-end developer). Tworzenie szablonów, pisanie HTMLa lub reguł CSS nie wymagają żadnych skomplikowanych obliczeń. Głębszy front-end czyli programowanie w jakimś frameworku JavaScript także nie będzie od nas wymagać matematyki. Tworząc aplikację w Angular, React lub czystym JavaScript potrzebne dane najpewniej zostaną dostarczone przez back-end.

Podsumowując artykuł powiedzmy otwarcie, matematyka niezbędna programiście (deweloperowi) nie jest. Można naprawdę dużo zarabiać i nie używać matematyki. Natomiast nie postrzegajmy matematyki jako tylko i wyłączenie obliczeń algebraicznych, bo ich jest stosunkowo mało. Patrzmy na nią jako zdolność analitycznego i abstrakcyjnego myślenia, która zawsze może przydać się projektując skomplikowane fragmenty systemu. Błyskotliwość, szybkość znajdywania rozwiązań są cechami pożądanymi w naszym zawodzie. Oto kilka ważnych wniosków:

Na sam koniec warto jeszcze wspomnieć, że umiejętności matematyczne mogą nam się przydać podczas szukania pracy. Wierzcie lub nie, jednak na Krakowskim rynku IT są firmy, które na rozmowie rekrutacyjnej dają zadania z czystej matematyki i każą je rozwiązać na kartce. Na szczęście takie firmy to odosobnione przypadki.