08 kwietnia 2013

Radość programowania == progfun - programowanie funkcyjne w Scali i Clojure

Tak mnie jakoś dzisiaj naszło. Pewnie to pogoda, bo słońce praży na zewnątrz, że aż trudno znaleźć zajęcie, które mogłoby przytrzymać człowieka na dłużej przy komputerze. Śmiem twierdzić, że człowiek to taka bestia, która zwykle dąży do poszukiwania zajęć, które łączą w sobie cechy bycia użytecznymi, a przy tym jeszcze niosą ze sobą ładunek pozytywnego myślenia i energii. Takie motywatory.

Po przydługiej zimie potrzeba rozruszać członki!

Nauka nowego języka programowania może być użyteczna i ucząca (pozytywnego) myślenia. Może jednak stracić swój blask, kiedy wokoło tyle równie ciekawych rzeczy. I jeszcze to słońce!

Podczas szkolenia na coursera.org - Functional Programming Principles in Scala - które polecam każdemu, zwróciłem uwagę na jego skrót - progfun. I wtedy przypomniałem sobie o owej radości programowania, o której tyle się czyta. Skoro już tworzymy oprogramowanie, to niech to będzie maksymalnie energetyczne zajęcie. I niech dostarcza radości!

Jeśli pracujesz z Javą, a brakuje Ci trochę fun w pracy, pochyl się nad programowaniem funkcyjnym, które chociażby z nazwy pozwala sądzić, że będzie zabawne, zajmujące, a nawet może i pożyteczne (może i w karierze!).

Kiedykolwiek pojawi się wątpliwość, czy nauka Scali czy Clojure to dobra inwestycja w przyszłość, pomyśl o polskim skrótowcu dla PROGramowania FUNkcyjnego - progfun. Kiedy zaaplikuje się angielskie znaczenie do tego, zrobi się od razu przyjemniej. Pojawi się FUN!

Niektórzy mogliby również przetłumaczyć "functional" na funkcjonalne (!)

Czy trzeba więcej powodu poznania języka funkcyjnego niż ów "FUN" oraz użyteczność tworzenia aplikacji funkcjonalnych?! Pozwól sobie na chwilę z Clojure lub Scala, a z pewnością nie będziesz żałował(a).

I ciekawostka z pola poznawania Scali - różnica między def a val jest znacząca. Pierwszy - def - opóźnia wyliczenie wartości aż do miejsca faktycznego użycia (wywołania). Drugi - val - wymusza wyliczenie wartości w miejscu definicji, aby już od tego momentu nazwa wskazywała na wartość wyrażenia.

Może to i niuans, ale to właśnie takie sztuczki i kruczki pozwalają mi na znalezienie owego FUNu w programowaniu i nakręcają na poszukiwanie kolejnych.

Z tą wiedzą powinno być już łatwo określić czas działania poniższego kawałka kodu w Scali.
scala> import java.util.concurrent.TimeUnit.SECONDS
import java.util.concurrent.TimeUnit.SECONDS

scala> def trwa5sekundDef = { SECONDS.sleep(5); 5 }
trwa5sekundDef: Int

scala> trwa5sekundDef
res2: Int = 5

scala> val trwa5sekundVal = { SECONDS.sleep(5); 5 }
trwa5sekundVal: Int = 5