Czy kompetentni programiści powinni mieć "skłonności matematyczne"?

Oryginalny post: Should Competent Programmers be "Mathematically Inclined"?

Autor: Jeff Atwood

Jeden z bardziej znanych cytatów Edsgera Dijkstry pochodzi z jego wykładu wygłoszonego podczas przyznania mu nagrody Turinga w 1972 roku, How do we tell truths that might hurt?

Oprócz zapału do matematyki, wyjątkowo dobre opanowanie języka ojczystego jest niezbędnym atutem kompetentnego programisty.

Zauważ, że w odróżnieniu od innych powiedział "języka ojczystego", nie angielskiego. W takim razie zastanawiam się, dlaczego większość najważniejszej twórczości Dijkstry powstała w języku angielskim, a nie w jego ojczystym -- holenderskim.

Ale zboczyłem z tematu. Rozważmy pierwszą część cytatu Dijkstry. Czy kompetentni programiści powinni mieć "skłonności matematyczne"? Myślenie o programowaniu jako formie matematyki może być pouczające chociażby z jednego względu: odporność na lokalizację. Chociaż były już próby stworzenia zlokalizowanych języków programowania, to z tego co mi wiadomo nikt nigdy nie starał się zlokalizować π, albo liczby 3. Te symbole są uniwersalne. W tym sensie języki programowania są poniekąd podobne do matematyki. Naucz się symboli raz i używaj ich gdziekolwiek na świecie, niezależnie od tego, jaki jest Twój język ojczysty.

Z drugiej strony, nie doszukałem się w praktyce tego, że programiści muszą mieć skłonności matematyczne, aby zostać doskonałymi programistami. W rzeczywistości jest całkiem na odwrót. Zależy to mocno od rodzaju kodu jaki piszesz, ale znaczna większość kodu, który widziałem, zawiera głównie rodzaj matematyki typu "bilansowanie książeczki czekowej". Nie uświadczysz tam niczego nawet choć trochę podobnego do tego, co można znaleźć w typowym podręczniku do analizy matematycznej.

{ i = j++ / (x + v); }

To nie do końca to, czym operują matematycy.

Nigdy nie rozumiałem chęci formalnego zrównania umiejętności matematycznych z umiejętnościami programistycznymi. O ile bycie kujonem z matmy nie zaszkodzi Ci jako programiście, o tyle trudno jest mi narysować linię pomiędzy "dobrym z matmy" a "dobrym z programowania". Tak jak Rory, uważam, że programowanie wymaga wyraźnej wrażliwości prawej półkuli mózgowej.

Gdy dorastałem, pamiętam jak ludzie mówili: "jeśli lubisz programowanie, to z pewnością pokochasz matmę". Zawsze myślałem, że ci ludzie byli całkowicie stuknięci. O ile jest coś wewnętrznie podobnego w pewnych rodzajach matematyki i programowania, o tyle obie dziedziny różnią się w dużo większej mierze niż są do siebie podobne.

Dzięki matmie, i nie mówię tu o szalonej filozofii teorii liczb typu "Czy liczby w ogóle istnieją?", ale o praktycznych zastosowaniach, otrzymujemy konkretne odpowiedzi. Dostajesz albo poprawny wynik albo nie.

Jeśli chodzi o kodowanie, najlepsze na co możesz mieć nadzieję, to zrobić coś dobrze. Z tak wieloma możliwościami osiągnięcia tego samego efektu określenie, czy osiągnałeś cel, zależy bardzo od wrażliwości prawej półkuli mózgowej, ponieważ nie ma nikogo (poza [kolejnym bardziej doświadczonym programistą]), kto mógłby Ci powiedzieć, czy zrobiłeś coś dobrze czy nie.

Jeśli zignorujesz swoją prawą półkulę mózgową, i mówię tu tylko ogólnie o abstrakcji i estetyce, to możesz naklepać jakiś kod, który może działać, ale piekłem może okazać się jego utrzymanie. Jeśli skupisz się tylko na prawej półkuli, możesz mieć coś, co działa, ale jest całkowicie nieefektywne i specyficzne, i jesteś jedyną osobą na Ziemii, która rozumie ten kod i potrafi go utrzymać.

Odstawiając wszystkie te zastrzeżenia na bok, ludzie nadal popierają ideę, że sama matematyka ma moc zrobienia z Ciebie lepszego programisty. Steve Yegge opracował najlepszą rozprawę, jaką przeczytałem, dla programisty-matematyka, z następującymi pięcioma punktami:

  1. Matematyka jest dużo łatwiejsza do zrozumienia, kiedy wiesz już, jak programować. W rzeczywistości, jeśli choć w połowie jesteś porządnym programistą, będzie to dla Ciebie proste.
  2. W szkole uczą nas matmy źle. Całkiem, CAŁKIEM źle. Jeśli sam nauczysz się jej w dobry sposób, będziesz uczył się szybciej, pamiętał dłużej i będzie ona cenniejsza dla Ciebie jako programisty.
  3. Poznanie choćby małej części odpowiedniego rodzaju matmy, pozwoli pisać Ci całkiem interesujące programy, które w przeciwnym wypadku byłyby za trudne. Innymi słowy, matma jest czymś, czego możesz się uczyć małymi porcjami, gdy tylko masz trochę wolnego czasu.
  4. Nikt nie zna całej matematyki, nawet najlepsi matematycy. Ten obszar nauki cały czas się rozwija, ponieważ ludzie wynajdują nowe formalizmy, aby rozwiązać swoje problemy. Dla dowolnego matematycznego problemu, jak w programowaniu, istnieje więcej niż jeden sposób, w który można go rozwiązać. Możesz wybrać swój ulubiony.
  5. Matma jest... hmmm, proszę nie mów nikomu, że to powiedziałem; już chyba nigdy w życiu nie zostanę zaproszony na żadną imprezę. Ale matma, cóż... lepiej to wyszepczę, więc słuchaj uważnie: (jest całkiem niezłą zabawą.)

Jak dla mnie brzmi to jak obszerna recepta na stanie się intelektualnie ciekawskim i na budowanie umiejętności rozwiązywania abstrakcyjnych problemów. Umiejętności niewątpliwie ważnych w programowaniu, ale do zdobycia nie tylko poprzez studiowanie matematyki. Jeśli matma jest Twoim preferowanym sposobem ostrzenia piły, to tego się trzymaj - ale nie jest to jedyny sposób.

Ostatnio otrzymałem taki e-mail:

Prowadzę małą (cztroosobową) firmę i zauważam, że młodsi programiści nie mieli przyjemności pisania w asemblerze albo bez wykorzystania funkcji bibliotecznych. Zawsze uważałem, że mocne umiejętności matematyczne są jednymi z bardziej użytecznych podczas kodowania. Natomiast jeśli ktoś ma Google i olbrzymią liczbę bibliotek, to nie musi być dobry z matmy, żeby sprawić, by coś działało, dopóki się nie zepsuje, ma warunki brzegowe, albo uwydatnia błędy systemu operacyjnego bądź biblioteki.

Parę prostych przykładów: upraszczanie nietrywialnych równań w celu określenia indeksów w tabeli albo adresowania pamięci; trygonometria w przypadku obliczeń fizycznych; konwersja hex/bin/dec w pamięci; równania logiczne takie jak prawa DeMorgan'a.

Ma rację; jeśli już mamy rozmawiać o matmie, przejdźmy od abstrakcji do szczegółów. Porozmawiajmy o detalach. Przykładach. Co mogłoby być bardziej matematycznego niż to?

Jaki kod osobiście napisałeś, w którym dokładna znajomość matematyki ułatwiła Ci pracę? Przychodzą mi na myśl pewne kategorie. Pisanie gry 3D. Albo symulacja fizyki. Albo niskopoziomowe filtry obrazów. Albo algorytmy kompresji. Lista jest długa. Ale jeśli jesteś w takiej sytuacji, to już to znasz.

Może jestem beznadziejnym optymistą, ale myślę, że większość programistów jest na tyle bystra, żeby nauczyć się jakiejkolwiek matematyki w momencie, gdy taka potrzeba pojawi się podczas rozwiązywania jakiegoś problemu.

7 komentarze:

Anonimowy pisze...

Nie rozumiem tylko, dlaczego znajomość logiki jest utożsamiana z byciem matematykiem. Logika to narzędzie stosowane w każdej nauce, w niektórych (ścisłych, jak matematyka i filozofia) bardziej.
Ja zawsze miałem w szkole z algebry między 2 a 3, natomiast 5-6 z trygonometrii. Teraz pracuję jako programista...no developer Symfony :)

Anonimowy pisze...

Matematyka uczy... algorytmiki. A raczej formalizuje pewien tok myślowy kodera.
Miałem przykład - na studiach informatycznych mój znajomy "ciągnął" dwa kierunki - informatykę i matematykę. Był doskonały w algorytmach. Matematyka jest jak najbardziej potrzebna programiście. Uczy sposobu ścisłego myślenia.

Anonimowy pisze...

A co, gdy programista zechce pisać w takim Haskellu?! Bez solidnych podstaw matematycznych nie zrozumie nawet systemu typów. Jeżeli ktoś nie zna rachunku lambda, nigdy nie definiował funkcji rekurencyjnych przy pomocy tzw. banana, to taki (co raz popularniejszy) Haskell będzie dla niego czarną magią. Programowanie to nie tylko Java i Ruby lub serwisy www w ASP.NET...

Anonimowy pisze...

Jednak obecnie www to jeden z największych rynków i ilość programistów (pseudo programistów również) jest jedną z największych w tym sektorze. Haskell nie jest przydatny w programowaniu małych i średnich aplikacji biznesowych. Dużych też nie :) Skoro nie jest przydatny, to nie muszę go znać, nie muszę też mieć solidnych podstaw matematycznych. W mojej pracy wystarcza logika, a jak trzeba coś policzyć, co jest bardziej skomplikowane, to się siada, czyta, analizuje i pisze. Proste :) Dokładnie to mówi te artykuł

Btw. Czy Wam też nie działają klawisze strzałek w polu do wpisywanie komentarza na tej stronie? (FF)

Anonimowy pisze...

Dijkstra nie był Duńczykiem.
Dutch -> Holenderski.
Pozdrawiam.

rafek pisze...

@Anonimowy - dziękuję za wyłapanie błędu. Proponuję na przyszłość posty z "uwagami" zamieszczać w sugesterze - http://devblogi.sugester.pl/. Pozdrawiam.

Anonimowy pisze...

Chyba autor postu skończył swoją edukację matematyczną na poziomie LO.

Prześlij komentarz

Related Posts with Thumbnails