Clojure w Fablo

2010-07-05

Jak się robi firmę typu start-up, to nie można robić „średnio”. Żeby przeskoczyć konkurencję, trzeba robić coś nowego, inaczej tylko dorówna się do innych. Między innymi dlatego większość oprogramowania w Fablo piszemy w Clojure. Ma to kilka plusów:

  • Mamy niezmiernie krótki kod. Każda linia kodu to koszt: może w niej być błąd, ktoś musi ją dostosowywać gdy rozwija się kod i środowisko, ktoś musi ją czytać i rozumieć, zaczynając pracę nad kodem, ktoś musi zadbać o testy do niej. Dlatego im mniej kodu tym lepiej. Clojure jest pod tym względem imponującym językiem, szczególnie uzbrojony w biblioteki zewnętrzne. Naszego kodu jest mało (jak na tę funkcjonalność), co pozwala znacznie szybciej go rozwijać i zmieniać.
  • Uruchamiamy kod na JVM (Java Virtual Machine). Łatwo nie docenić znaczenia jakości VM dla produktu. Pythoniści wielokrotnie już boleśnie się przekonywali, że liczenie odnośników (reference counting) to nie najlepsza metoda odśmiecania (GC). Implementacje Common Lisp na ogół miały sensowne GC, ale nie były one równoległe. W JVM zrobiony przez Suna poszły lata ciężkiej pracy, zaś algorytmów odśmiecania jest kilka. Ostatnio np. nasze serwery API zaczęły używać algorytmu Concurrent Mark-Sweep, który co prawda zużywa więcej procesora, ale za to daje krótsze pauzy, co jest ważne przy obsłudze zapytań. Mało które środowisko pozwala na takie wybory. Imponujący jest też optymalizator kodu (HotSpot).
  • Dzięki JVM mamy łatwy dostęp do wszystkich bibliotek w Javie. Wystarczy dodać jedną linijkę do konfiguracji projektu, a biblioteka z Maven repo ląduje u nas i można jej używać w kodzie.
  • Piszemy poprawny kod równoległy. Wszystko u nas jest równoległe i potrafi wykorzystywać dowolną liczbę procesorów. Uruchamiamy wiele wątków do różnych zadań, a operacje typu map/reduce skalują się automatycznie. Utrzymanie takiego kodu w języku innym niż Clojure byłoby niezmiernie trudne. Budowanie takich rozwiązań równoległych, które przetwarzają zapytania dla wielu klientów i potrafią zmieniać wersje bazy bez przerw w pracy, byłoby naprawdę trudne bez wsparcia, jakie daje Clojure. Tu radzimy sobie bez problemu.
  • Produkcyjne uruchamianie kodu jest bardzo proste — kompilacja daje w wyniku jeden plik .jar. Wystarczy go skopiować na serwer i uruchomić.
  • Incanter załatwia nam dużą część matematyki i statystyki, jakiej potrzebujemy.
  • Clojuratica pozwala łatwo prototypować nowe rozwiązania używając największej na świecie biblioteki matematycznej — oprogramowania Mathematica

Są oczywiście minusy:

  • Pythoniści i Rubyści wspięli się ostatnio na wysoki stołek „języków popularnych", zapominając gdzie kiedyś byli. Straszą nas, że nie znajdziemy programistów Clojure do zatrudnienia w Fablo. Pewnie faktycznie będzie trudniej, ale też dzięki Clojure potrzebujemy tych programistów mniej.
  • Niektóre biblioteki do Clojure są jeszcze niedojrzałe (przykładem może być redis-clojure).
  • Clojure ma wybitnie nieczytelne komunikaty błędów i często trzeba się domyślać dlaczego kod się nie kompiluje.

Jak widać, listę minusów mam niewielką. Jak dotąd jesteśmy bardzo zadowoleni z wyboru. W żadnym innym środowisku nie przeszlibyśmy tak szybko od pierwszych eksperymentów do skalowalnego oprogramowania produkcyjnego.


Komentarze

Równoległe dosyć śmiesznie brzmi, trochę jak różne słowa po czesku, po prostu język nauki nie jest językiem polskim, ale proponuję "współbieżnie". ;)

Kuczek2010-07-05

Ponadto, skąd informacja, ze Mathematica jest największa na świecie?

Jest w ten sam sposób największa jak Word jest edytorem tekstu. Nie znam chyba nikogo kto opublikowałby kod machine learnign w mathematice, wszyscy to robią w Matlabie, który ma kosmiczna przewagę w toolboxach.

Kuczek2010-07-05

Kuczek: co do równolegle — racja. Postaram się pamiętać i używać słowa „współbieżnie”.

Co do Mathematica — myślę, że waga stwierdzenia „Mathematica jest największa na świecie” jest porównywalne z „kosmiczną przewagą Matlaba w toolboxach” :-)

A tak bardziej serio — ja akurat nie potrzebuję specjalistycznych „toolboxów”. A Mathematica robi to co trzeba, robi to dobrze (np. ma bardzo dobry i szybki algorytm rozkładu SVD rzadkich macierzy), ma świetne narzędzia wizualizacyjne, ma Manipulate (które jest niezastąpione przy prototypowaniu) i doskonale integruje się z Clojure.

Jan Rychter2010-07-05

Racja :D

Mam słabość do Mathematici po prostu po kilku niepoprawnych wynikach, i ni moge zapanować, ze mi sie włącza domyślne ustawienie troll_mode=on po usłyszeniu sygnału ;)

Kuczek2010-07-05

Mathematica ma swoje wady i zalety. Uważam jednak, że nie można stawiać jej na równi z Matlabem. Owszem, mają wiele wspólnego, ale Matlab jest sensowny wtedy, kiedy problem daje się upakować w macierz. Mathematica jest bardziej ogólna.

W każdym razie my kupiliśmy Mathematica, więc już przy tym pozostaniemy :-)

Jan Rychter2010-07-05

Och, od razu pythoniści... Dużo ludzi poza mną Cię straszyło? :) Akurat dla nas znalezienie kogoś nowego do zespołu to spory problem (chociaż pula programistów Pythona jest o co najmniej rząd wielkości większa niż pula programistów Clojure). Inna sprawa, że od pewnego poziomu wymagań język prawdopodobnie nie robi zbyt dużej różnicy (odpowiedni kandydat jest w stanie się nauczyć dowolnego języka, co najwyżej zwiększa to koszty wdrożenia nowego członka zespołu). Poza tym, Clojure wydaje się dawać spore możliwości wykorzystania wiedzy o Javie.

Poza tym, bardzo cieszę się widząc, że programowanie w Clojure staje się coraz wygodniejsze.

Ryszard Szopa2010-07-05

Ryszard: to stały motyw w różnych rozmowach. A używam sobie na pythonistach i rubystach, bo bawi mnie nieco, jak nagle stały się „językami mainstream”, podczas gdy jeszcze niedawno trzeba było się mocno napocić, żeby klientowi wytłumaczyć dlaczego się mu pisze oprogramowanie w tym dziwnym języku co się jak wąż nazywa. :-)

A co do kandydatów to nie do końca się zgadzam — znajomość języków świadczy o kandydacie. Jeśli ktoś nigdy nie programował w żadnym języku funkcyjnym na przykład, to pewnych rzeczy po prostu nie wie.

Jan Rychter2010-07-06

Równoległość a współbieżność to dwie rożne rzeczy

th reader2010-07-06

Jest ciekawszy aspekt Clojure vs. coś innego, a jest nim przejęcie. Na razie rynek sklepów spożywczych jest, hmm, brakuje mu pańskiego oka. Tak pozostanie dopóki sprawą nie zainteresuje sie jeden z hurtowników spożywczych. Eldorado (chyba teraz się inaczej nazywa), własciciel Groszka, Żabki, Stokrotki i chyba Delimy powstało w latach 90 jako porgram komputerowy. To był pomysł jego założyciela na biznes: zinformatyzować dystrybucję. Jeśli ci państwo chcieliby wejść w internet, to na pewno nie na zasadzie kupowania dostępu do wyszukiwarki.

Z programistami Clojure nie wydaje mi się żeby był jakikolwiek specyficzny problem rozróżnialny od problemu dobrych programistów jako takich.

Kuczek2010-07-06

To tylko moja opinia, więc nie bić za kwalifikator "na pewno" ;)

A napisałem pod wpływem sklepu spożywczego a.pl, na który zabłądziłem w poszukiwaniu gazeta.pl, a który jest zaprojektowany nakładem jakiegoś starania, ale jednak tak sobie.

Kuczek2010-07-06

Kuczek: każdy, kto robi biznes, definiuje co jest dla niego „rdzeniem działalności”, a co koniecznym kłopotem. Jeśli ktoś handluje artykułami spożywczymi w internecie, to algorytmy statystyczne wyszukiwarki w żaden sposób nie są dla niego celem działalności. Co więcej, bardzo wygodne może być zlecenie całego problemu na zewnątrz, wraz z utrzymaniem serwerów, indeksowaniem, nowymi wersjami oprogramowania, nowymi algorytmami, itp.

My taką usługę dostarczamy — i wierzymy, że jest na to rynek.

Jan Rychter2010-07-06

No wiem, mylę pojęcia. Tak mi się tylko pomyślało. ;)

Kuczek2010-07-07

Trochę spóźniony komentarz, ale co tam... Współbieżność to pozór równegłego działania. Równolegle mogą działać procesy na więcej niż jednym rdzeniu:
en.wikipedia.org/wiki/Parallel_computing
en.wikipedia.org/wiki/Concurrent_computing
Dobrze Pan mówił - proszę się nie słuchać :D

Łukasz2012-02-28