środa, 5 września 2018

Matematyka potrzebna programistom IT

Matematyka potrzebna programistom IT 


Pytanie o matematykę i programowanie jest jednym z najczęstszych jakie się pojawia u zainteresowanych programowaniem czy informatyką. Ważnym jest poznać zależność pomiędzy matematyką a programowaniem, a szczególnie to, jakich działów matematyki należy się poduczyć z powodu ich przydatności w informatyce i programowaniu. Najprościej rzecz ujmując, programowanie to instruowanie komputera, co ma robić. Komputery to z natury niezbyt mądre urządzenia, gdyż nie mają zielonego pojęcia, jak wykonać jakiekolwiek zadanie. Musisz im wszystko wytłumaczyć, i to ze szczegółami. Jeśli wydasz komputerom odpowiednie instrukcje, potrafią dokonać wielu wspaniałych i zadziwiających rzeczy. 

Programowanie - kod binarny

Informatyka jako dziedzina nauki wywodzi się bezpośrednio z matematyki. Dawniej, jeszcze w końcu XX wieku, 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. 

Profesor Dijkstra, znany miłośnikom informatyki zapewne dzięki algorytmowi znajdowania najkrótszych ścieżek w grafie, powiedział kiedyś, że „informatyka ma tyle samo wspólnego z komputerami, co astronomia ma z teleskopami.” Za tymi słowami stoi jego ogromna wiedza informatyka-teoretyka. Mówi nam on po prostu, że obcujemy z dziedziną wiedzy ważną i poważną. Analizując dowód jego słynnego algorytmu grafowego pomyślimy jednak sobie, że to już jest jednak matematyka. Jasne jest, że żeby złożyć komputer z kilku części, skonfigurować sprzęt, zainstalować oprogramowanie, włączyć ulubioną grę czy wejść i zaistnieć na portalach społecznościowych, wielkiej matematycznej wiedzy nie trzeba. Twardej matematyki, przez co rozumiemy jej część, której nie opanujemy w miesiąc tylko raczej w perspektywie kilku lat studiów pod okiem uznanych fachowców, trzeba by się nauczyć jeśli myślimy o tej części informatyki, która ma do czynienia z teorią procesów, robotyką, projektowaniem systemów lub elektroniką. Wiele osób po studiach które pracują przy komputerach dumnie twierdzą, że do wykonywania swojej pracy potrzebują wiedzy matematycznej z gimnazjum czy podstawówki, a ostatnią całkę to już nie pamiętają kiedy liczyli. Pytanie, na ile to, co robią jest innowacyjne i twórcze, bo wygląda na odtwórcze (do czyszczenia komputera najbardziej wszak potrzeba umiejętności używania śrubokręta i odkurzacza). 

Program komputerowy składa się z wielu instrukcji. Instrukcja to proste polecenie, które możesz wydać komputerowi, a zazwyczaj jest to jedno bardzo konkretne zadanie. Wszystkie cudowne rzeczy wykonywane obecnie przez komputery zawdzięczamy mądrym programistom, którzy napisali oprogramowanie; dzięki oprogramowaniu komputery wiedzą, co mają robić. Oprogramowanie (ang. software) to program lub grupa programów uruchamianych na Twoim komputerze bądź na innym komputerze, z którym się łączysz, jak np. serwer WWW. Komputery myślą, używając do tego celu ogromnej ilości układów elektronicznych. W najprostszej postaci, układy elektroniczne to przełączniki, które mogą zostać włączone albo wyłączone. Inżynierowie oraz naukowcy nazywają takie stany odpowiednio cyframi 1 albo 0. Jedynki i zera tworzą swoisty kod nazywany kodem binarnym. Słowo "binarny" oznacza "posiadający dwa stany". Stany te to "włączony" lub "wyłączony", jeden lub zero. Cyfra binarna to "bit". Komputery wykorzystują system binarny. Większość ludzi jednak nie ma pojęcia, jak posługiwać się systemem binarnym. Musi być więc jakiś prostszy sposób, aby przekazać komputerowi, co mamy zamiar zrobić. W tym celu ludzie stworzyli języki programowania. Pozwalają one zapisywać rzeczy, które my, ludzie, potrafiły zrozumieć, a następnie tłumaczą je na język binarny, który potraf zrozumieć komputer. 


Nauka programowania niczym nie różni się od nauki matematyki, a obydwie te nauki, jako że ze sobą bardzo związane, są naukami nienamacalnymi. Ucząc się matematyki i jej działów, przechodzimy przez wszystkie klasy szkoły podstawowej, średniej i wyższej. Kiedy ucząc się podstaw matematyki w szkole podstawowej można mieć wrażenie, że nigdy nie będzie w stanie być lepszym i rozwiązywać trudniejszych zadań. Zadania ze studiów wyglądają przecież 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 z matematyki. W nauce matematyki jak i informatyki ważne jest ćwiczenie, rozwiązywanie zadań i problemów. 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, jednak 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ść, aby opanować poszczególne bardzo potem potrzebne narzędzia i metody. 

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 tak, aby poznać wszystko to, co na pewno będzie przydatne, a także to, co może być przydatne. 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 z dobrą metodyką nauczania, nauka programowania może być przytłaczająca i ciężka. Nie można powiedzieć, że nie da się nauczyć programowania samodzielnie, gdyż jest wielu pasjonatów samouków o wysokich kompetencjach, 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). 

Programowanie wydaje się wielu tak trudne, gdyż w Polsce jego nauczanie jest ciągle generalnie bardzo słabe. Programowanie to względnie nowa dziedzina nauki, a społeczeństwo czy raczej niedouczeni politycy od kształtowania edukacji nie nadąża z jego wprowadzeniem do szkół podstawowych i średnich. 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, chociażby poćwiczyć troszkę pracę na konsoli UNIX, Linux czy DOS. Matematyki uczymy się całe życie, pewnie około 15 lat, nie zawsze wszystko się przydaje, ale nauka w szkole ma za zadanie wyćwiczyć umysł tak, aby człowiek mógł dalej rozwijać się na bezie tego, co się uczył. Programowania na koniec pierwszego dwudziestolecia XXI wieku niestety, 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 w tej dziedzinie wiedzy wyniesionych ze szkoły. Wtedy nie wiadomo czego się łapać, a poznawanie podstaw wydaje się bezsensowne. 

Matematyki w informatyce jest mnóstwo i nie jest celowym wypisywanie litanii zagadnień przydatnych, co może być odstraszające. Jeśli uczymy się czegokolwiek z domeny wiedzy ścisłej czy technicznej ważne jest, aby dobrze rozumieć to, czego się uczymy. Uczymy się = Rozumiemy to czego się uczymy. Zawody drużynowe, które wymagają podejścia interdyscyplinarnego wymuszają to „dobre rozumienie”, i tu się pojawia matematyka, która porządkuje nasze dobre pomysły, odrzuca w procesie logicznego rozumowania pomysły złe. Podeprę się tu autorytetem Alberta Einsteina, który może trafnie (nie daj Boże) powiedział: „Gdyby ludzie rozmawiali tylko o tym, co rozumieją, nad światem zapadłaby wielka cisza”. W matematyce jest bardzo dużo sztuki dla sztuki, dużo abstrakcji, która osiąga nieosiągalne poziomy nie tylko dla zwykłych zjadaczy chleba, ale również samych matematyków, lecz to już inna bajka. Natomiast wiele jej krain jest do zdobycia, nie dla samej satysfakcji, choć to ważna motywacja, ale dla skuteczności działań, czy to w życiu, chociażby żeby nas kasa w sklepie nie oszukała, czy to na zawodach szkolnych, żeby problemy rozwiązywać sprawniej, szybciej, pewniej. 

Matematycy są na rynku towarem poszukiwanym, a proszę sobie na przykład poszukać i poczytać w internecie o tajemniczych aktuariuszach, których w Polsce jest około dwustu. Zahaczamy tu trochę o statystykę ubezpieczeniową, gdzie również ważne są talenty związane z programowaniem, albowiem nie ma tak dobrze, że komputer zrobi za człowieka wszystko. Taki aktuariusz to ogólnie człowiek orkiestra. Interesującym przykładem, gdzie matematycy i informatycy idą w parze, a nie łeb w łeb jest utworzenie na jednym z uniwersytetów w Polsce kierunku o specjalności kryptologia – nauka o szyfrach. Program tych studiów oprócz przedmiotów typowo informatycznych kładzie duży nacisk na teorię liczb. Ta gałąź matematyki jest bowiem mocno eksploatowana przy konstruowaniu zabezpieczeń transmisji danych pod kątem zagrożeń w cyberprzestrzeni, których jak wiadomo nie brakuje. Istnieje więc potrzeba szkolenia specjalistów z tego zakresu, wynikająca chociażby z polityki integracyjnej z Unią Europejską w końcu pierwszego dwudziestolecia XX wieku. W kontekście rozważań o szyfrach warto też przypomnieć Enigmę i sukcesy polskich kryptologów przed wojną. 

Matematyka jest najważniejsza jako dobra podstawa,a wpierw się dobrze nauczyć warto układów równań, macierzy, zbiorów, prawdopodobieństwa i kombinatoryki, pochodnych, całek zanim się zabierze profesjonalnie za informatykę. Skąd miałoby się takie coś wziąć niby jak int a[2,2];? Ta tablica dwumiarowa jest odpowiednikiem macierzy kwadratowej, a taki zapis - int a[2][2]; - to jest odpowiednik tego zapisu [1 2][1 2] w matematyce. Skąd miało by się wziąć pseudolosowanie w C++? A właśnie z prawdopodobieństwa i kombinatoryki. Fizyka, matematyka i informatyka to są nierozłączne działy, ale w informatyce matematyka i fizyka są sprofilowane i dopasowane do potrzeb przy programowaniu. Można jednakże napisać aplikację czy grę nie znając macierzy/ całek/ grafów. W przypadku bardziej zaawansowanych aplikacji owszem, ale na początek, gdy tak trochę chcemy się pobawić programowaniem, nie potrzeba lecieć kilka lat w przód z matematyką skoro można nauczyć się programować, a później douczyć się matematyki i algorytmów na miarę swoich potrzeb. Nawet praktycznie całą standardową algorytmikę można dobrze rozumieć bez teorii pochodnych i całek, gdzie niewiele ich występuje. 

Matematyka i fizyka jest konieczna w programowaniu dla pionierów, którzy tworzą coś zupełnie innowacyjnego. Do podstaw  programowania i prostych projektów wystarczy znajomość operacji modulo, konwersji systemów liczbowych i znaku sumowania. Do napisania gry komputerowej wystarczy w zupełności znajomość operacji modulo, konwersji systemów liczbowych, wektorów, współrzędnych, pędu, siły dośrodkowej itp. Jak się chce stworzyć porządną grę to wypadałoby wiedzieć co to jest ruch, pęd, siła, energia, praca, moc, grawitacja itp. bo inaczej wyjdzie nam takie coś jak Minecraft, który jest generalnie nierealny i nie ma w nim praw fizyki. Przynajmniej na poziomie Newtona trzeba znać fizykę klasyczną jeżeli chce się być grafikiem komputerowym. Jeżeli chce się być informatykiem-elektronikiem to warto znać fizykę na poziomie elektromagnetyzmu i mechaniki klasycznej oraz rachunek całkowy, różniczkowy i liczby zespolone. Poza tym elektronika jest działem elektromagnetyzmu, tak jak i elektryka oraz magnetyzm a z kolei elektromagnetyzm jest działem fizyki. 

Najpierw zanim powstała fizyka była matematyka znana w czasach starożytnych. Potem powstała fizyka rozwinięta przez Isaaca Newtona w 1687 roku i dzięki niemu do dziś mamy sprawdzoną mechanikę klasyczną, która się opiera na matematyce i nie jest skomplikowana. Potem Albert Einstein zapoczątkował mechanikę relatywistyczną w 1905 roku, w której jest dokładny opis tego, co się dzieje w świecie kosmicznym i atomowym. Następnie Max Planck w 1918 roku zapoczątkował istnienie mechaniki kwantowej, która świetnie opisuje to, co się dzieje w skali subatomowej (być może w skali wszechświata też). Potem w 1967 roku rozpoczęły się prace nad siecią ARPA-NET i tak powstała cała informatyka z programowaniem. W sumie jednak wypadałoby wiedzieć coś o całce oznaczonej Riemanna jeżeli chce się tworzyć systemy bezpieczeństwa, sieci komputerowe lub sztuczną inteligencję, znać definicję całki oraz wiedzieć coś o liczbach zespolonych. Animowane gify się poruszają ruchem jednostajnym prostoliniowym czy w HTML4 animacje tekstu <marquee>, więc wypadałoby znać do HTML-a fizykę na poziomie Newtona. Popularna definicja programowania określa je jako "proces projektowania, tworzenia, testowania i utrzymywania kodu źródłowego programów komputerowych lub urządzeń mikroprocesorowych". Wspomniany kod źródłowy może być napisany w różnych językach programowania, z użyciem określonych reguł. Każdy z języków pozwala na wykorzystanie odpowiednich stylów programowania, a wybór konkretnego języka może zależeć od indywidualnych upodobań, polityki firmy lub funkcji, jakie końcowa aplikacja ma realizować. W zasadzie nie istnieje odpowiedź na pytanie, który z języków jest najlepszy. 

przeliczanie bajtów

Programowanie to jest język, dzięki któremu możemy opowiedzieć pewną historię i jakiegoś języka programowania trzeba się nauczyć aby móc zacząć przygody z programowaniem. Język programowania to specyficzne zwroty i zdania, za pomocą których komunikujemy się z maszyną, z komputerem. W rzeczywistości, programowanie to snucie bardzo dokładnych i bardzo szczegółowych opowieści, przez co mogących się wydawać nużącymi i nudnymi, chociaż opowiadanie baśni, legend i bajek wcale nie musi być nudne, jeśli je lubimy. Pamiętać trzeba, że programowanie to język, a jak Wittgenstein mówił: “Granice naszego języka są granicami naszego poznania”. 

Matematyczne minimum: 

* Dodawanie, odejmowanie, mnożenie i dzielenie - wystarczy do 10 - resztę można sobie policzyć, w końcu siedzimy przed jednym wielkim kalkulatorem. 

* Znać koncepcję kolejności wykonywania działań - nawiasy, mnożenie / dzielenie, dodawanie / odejmowanie. Języki programowania też mają swoje "działania" (operatory) i one też mają swoją kolejność wykonywania, na co warto zwracać uwagę podczas ich nauki. 

* Logika w zakresie podstawowym, czyli spójniki logiczne “i” (koniunkcja) i “lub” (alternatywa) oraz albo (alternatywa wykluczająca). 

* Dzielenie z resztą - Pojęcie funkcji, jako przyporządkowania czemuś, co wkładamy do funkcji, czegoś innego. Nie będziemy wgłębiać się w matematyczne teorie, ważne by wiedzieć że jak mamy f(x) = 2x, to f(4) da nam 8. W programowaniu argumentem funkcji (czyli to co wkładamy do funkcji) nie musi być wyłącznie liczba, może to być na przykład ciąg znaków. I tak samo z wynikiem - też nie musi być to liczba. 

O tym, że informatyka jest powiązana z matematyką można dyskutować długo, a także pomyśleć o zreformowaniu edukacji matematycznej pod kątem dodawania podstaw wiedzy informatycznej potrzebnej przyszłym programistom. Doświadczony programista skupi się na matematyce w programowaniu czy ściślej na działach matematyki przydatnych w programowaniu. Na samym początku trzeba zrozumieć, że matematyka to nie tylko operacje arytmetyczne i algebraiczne, nie tylko analiza matematyczna czy planimetria. Ciekawymi przedmiotami na studiach informatycznych są matematyka dyskretna i metody optymalizacyjne. Gdyby zdefiniować matematykę dyskretną nazwać ją można 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. Matematyka dyskretna jest nauką o zbiorach dyskretnych (nieciągłych). Jej przykładowe poddziały to: 

1. Logika matematyczna – bardzo fajne i przydatne. Poznaje się logikę Boolowską i jej prawa, prawa de Morgana, operacje na zdaniach, aksjomaty, tautologie, kwantyfikatory, implikacje, indukcje matematyczną, podstawy teorii mnogości, dopełnienia zbiorów itd. Na kolokwiach trzeba np. uprościć jakieś 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. Przykładowo, 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, wykorzystując tę wiedzę chociażby podczas programowania mikrokontrolerów AVR.  

2. 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ła się w momencie powstania komputerów kwantowych, w tym chińskich, można już poczytać w Internecie. 

3. Teoria gier – czyli jak program ma podejmować właściwe decyzje, dlaczego gra w kółko krzyży 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. 

4. Teoria grafów – w informatyce po prostu magia techniki komputerowej. Często wykorzystywana tam, gdzie nigdy by się człowiek tego nie spodziewał. Przykładowo problem znajdowania najkrótszej drogi w grach (algorytm Dijkstry), problem mostów, drzewa, reprezentacja problemów za pomocą grafów, problem najlepszego sąsiada. Pewnie nie wszyscy wiedzą, ale dzięki teorii grafów mamy takie portale jak jakDojade.pl. 

Matematyka dyskretna to tylko jeden przedmiot matematyczny przydatny informatykom programistom. Istnieje 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 przydaje się do zastosowań 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 stykamy się z tym na studiach możemy być zafascynowani. Związane z programowaniem liniowym i matematyką dyskretną. 

* 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. 

* 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).

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. Powstają one 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 zatem powstać języki wysokiego poziomu czyli Java i C#. Programowanie stało się nieco bardziej ultra szybkie. 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 AngularJS, React, Backbone, Knockout.js. Wszystko po to aby było szybciej! Stworzony został serwer Node wraz z setkami tysięcy gotowych modułów dla programistów (sławny node_modules, który często ważą 50 GB, 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 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.

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ć znajomość wielu technologii, umiejętność wykorzystania gotowych rozwiązań i bibliotek dostarczonych przez programistów. Programista opracowuje skomplikowane biblioteki, które mają działać najszybciej jak to możliwe, a deweloper ma umieć z tych bibliotek korzystać. I tak przykładowo 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ą.

W naszym kraju, w Polsce, nie jest podział na programistów i deweloperów 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. 

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. Matematyka abstrakcyjna niezbędna programiście (deweloperowi) nie jest, ale pewne jej elementy na pewno tak, w tym zdolność logicznego myślenia czy optymalizacji. Można naprawdę dużo zarabiać i nie używać matematyki w sposób wyrafinowany, abstrakcyjny. Nie postrzegajmy jednak matematyki jako wyłącznie obliczeń algebraicznych, całek i różniczek, bo ich jest stosunkowo mało w informatyce i programowaniu. Patrzmy na matematykę bardziej jako zdolność analitycznego i abstrakcyjnego myślenia, które zawsze może przydać się projektując skomplikowane fragmenty systemu. Błyskotliwość, szybkość znajdywania rozwiązań są cechami pożądanymi w zawodzie informatycznym. Oto kilka ważnych wniosków: 

* w informatyce i programowaniu jest bardzo dużo matematyki – jest to po prostu dziedzina związana z matematyką i bazująca na matematyce, jeżeli sądzisz inaczej to jesteś ignorantem lub ignorantką; 

* matematyka to nie tylko ułamki i całki – szczególnie w kontekście programowania. Doskonałym przykładem jest matematyka dyskretna, która wprowadza w świat pomiędzy matematyką a programowaniem, uczy logicznego myślenia, ukazuje mechanizmy które warto znać i umieć z nich korzystać; 

* można być dobrym matematykiem i nie umieć programować – no wiadomo, tak się zdarza, znamy realne przypadki, które po prostu zajmują się czystą abstrakcją matematyczną; 

* można być dobrym deweloperem i nie umieć matematyki – można zajmować się np. aplikacjami internetowymi, nie pakować się w problemy, których nie umiemy rozwiązać (czyli dedykowane aplikacje bazujące na skomplikowanych obliczeniach); 

* nie można być dobrym programistą i nie umieć matematyki – ale chyba wszystko zależy od kontekstu, jak rozumiemy różnicę pomiędzy programistą a deweloperem i czy taką granicę w ogóle uznajemy. No nie oszukujemy się, będąc matematycznym zerem silnika do gry nie napiszemy, symulacji fizycznej nie napiszemy, biblioteki do obliczeń metodą MES nie napiszemy, biblioteki rozwiązującej całki metodą Newtona-Cotesa nie napiszemy. Możemy co najwyżej, jako deweloper, wykorzystać istniejące; 

* wielu sławnych programistów, którzy są nieprzeciętnie dobrzy, są z wykształcenia matematykami; 

* bardziej potrzebni są deweloperzy niż programiści – jest mało projektów, które wymagają wysokich zdolności matematycznych. Nikt nie zatrudni matematycznego zera do pisania takiej aplikacji jak MatLab, jednak powiedzmy sobie szczerze takich stanowisk jest mniej. IT stoi mocno na aplikacjach bankowych, systemach z rodziny ERP służących do zarządzania firmami itp. Tam matematyki nie ma. Jeżeli ktoś mądry napisał bibliotekę do obsługi formatu Mp3 (dźwięk w formacie mp3 czy ogg zapisany jest w postaci szeregu furiera), to każdy inny program będzie z niej korzystał. Nikt nie wprowadza swoich kodowań audio, tylko korzysta z istniejących i sprawdzonych. 

Umiejętności matematyczne mogą nam się przydać podczas szukania pracy. Wierzcie lub nie, jednak na polskim 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. Logiczny i ścisły sposób rozwiązywania zadań jednakże jest potrzebny w informatyce, nawet jak zadania są proste. 

Przykładowe zadanie: zapisz liczbę 108 w systemie binarnym. Zapiszesz i masz pracę, nie zapiszesz, szukasz pracy dalej. 

Reasumując: „po co matematyka?” – niech zabierze głos Hugo Steinhaus: „Kraj bez matematyki nie wytrzyma współzawodnictwa z tymi, którzy uprawiają matematykę”. 

Podręcznik matematyki do programowania kupisz w wydawnictwie Helion.pl


Dlaczego warto nauczyć się programowania? 

Nawet jeśli nie zostaniesz zawodowym programistą (większość ludzi nie zostaje), za nauką programowania przemawia wiele rzeczy: 

Najważniejsza jest chęć nauki! Programowanie może być bardzo interesujące — zarówno jako hobby, jak i zajęcie zawodowe. Jeśli interesujesz się komputerami i chcesz dowiedzieć się więcej na temat ich działania oraz możliwości wykorzystania ich do swoich celów, jest to dobry powód do tego, aby nauczyć się programowania. A może chcesz stworzyć swoją własną grę lub nie możesz znaleźć programu, który spełniałby Twoje oczekiwania, i chcesz napisać go sobie samodzielnie? Obecnie możesz natknąć się na komputery w każdym miejscu. Istnieje bardzo duże prawdopodobieństwo, że będziesz ich używać w pracy, szkole lub w domu — zazwyczaj we wszystkich tych miejscach. Nauka programowania pozwoli Ci lepiej zrozumieć komputery. 

LINKI: 


Operatory wyszukiwania w Google: 


Podstawy obslugi konsoli UNUX - Linux 


Wydawnictwo Helion - książki informatyczne 



1 komentarz:

  1. Mega ciekawy wpis. Ogólnie informatyka jest dla mnie interesującą dziedziną, dlatego poszedłem na takie studia :) W przyszłości chciałbym zajmować się tworzeniem specjalistycznego oprogramowania :)

    OdpowiedzUsuń