Sunday, June 22, 2008

Ruby i Python w jednym żyli domu ...

Kolega, z którym przez ostatni rok miszkałem, zaczął pisać swoje projekty w Pythonie. Mnie natomiast, choć i ja w pythonie coś pisałem, wzięło na Rubego. Miałem więc w różny sposób styczność z obydwoma języka programowania. Chciałem napisać dwa zdania o moich przemyśleniach.

Chciałbym zacząć od tego, że kiedy zabierałem się za którykolwiek z tych języków czułem się dziwnie. Wcześniej programowałem w Java, PHP, C, C++ ... i w każdym z nich mogłem szukać jakiś analogii do poprzedniego. Korzystać ze zdobytej wcześniej wiedzy czy też patrzeć na nowe rozwiązania (przykładowo foreach w PHP) jak na załatanie "dziur" niewygody z poprzednich języków (C, C++). Jednak do Pythona i Rubego - po prostu masakra ! Nic nie mogłem z siebie wykrzesać. Nic !  Dla mnie osobiście był to tak "inny świat", że zabierając się za te języki, wciąż miałem jakby umysł na uwięzi. Spętany nawykami sprzed lat obowiązującymi we wszystkich innych języka programowania, które poznałem starałem się przebrnąć, zrozumieć - nie mogłem. Ratunek był tylko jeden: książką lub dobry kurs do języka idący kroczek po kroczku. Musiałem zacząć się uczyć tych języków tak, jakbym nigdy wcześniej nie programował. Potrzebowałem dobrego kursu lub książki oraz społeczności, która pomogłaby w stawianiu pierwszych kroków.

Przygodę z Pythonem zaczęliśmy z kolegą od rozmówek. Pomysł okazał się jednak nie trafiony. Oczywiście rozmów, kiedy już programuje się jakiś czas w pythonie, są świetne - jeżeli zaś chodzi o dobre poznanie języka - okazały się zbyt zwięzłe i ogólnikowe. Potem trafiłem na kurs Jakuba Swacha, który okazał się strzałem w dziesiątkę. Po prostu - z niego nauczyłem się podstaw pythona. Z różnymi zagadnieniami czy problemami pojawiającymi się w trakcie rozwiązywania zadań do kursu zwracałem się do forum polish python coder group, gdzie zawsze mogłem otrzymać wsparcie i pomoc. Później kolega zakupił już sam "Python Podstawy". Książka okazała się rzeczywiście robieniem wszystkiego "krok po kroku". Jednak nawet jako początkujący znaleźliśmy w niej kilka błędów. Omawiająca szeroki zakres zagdanień, od podstaw, do problemów związanych z dystrybucją komercyjnych programów pisanych w pythonie.

Python jest prosty. Nie łatwy (choć może też), ale prosty. Jeżeli w Pythonie coś robi się "tak" to tak się to robi i nie powinno stosować się żadnego innego sposobu aby to wykonać. Programy wyglądają przejrzyście, są logiczne i zrozumiałem. Osobiście przeszkadza mi tylko fakt iż ogólnikowo nie wszystko jest obiektowe. Pojawiające się tu i ówdzie funkcje czasem utrudniają - bo wydają się "nie pasować". Często, wiele funkcji, które sprawdzają czegoś długość, ilość elementów itd ... mogłyby być po prostu metodami obiektu - jednak tak nie jest i często zapędzając się w "obiktówkę"... zastanawiamy się "czemu nie działa ?" a dlatego, że takiej metody nie ma - trzeba użyć funkcji.

Jeżeli o Rubego chodzi na start kupiłem Ruby On Rails. Próba przebranięcia przez tą książkę bez znajomości języka to była porażka. Na urodziny od rodziców dostałem "Ruby. Tao programowania w 400 przykładach". Jestem osobą, kra czyta wstępy do książek. Przeczytałem i tutaj. Na starcie dowiedziałem się, że "książka ta nie nadaje się dla osób, które chciałyby nauczyć się języka Ruby" - bomba ... a po to ją kupiłem. Spróbuję ! Przecież jestem zdolny ... Po siedmiu rozdziałach się poddałem: "Co to za syf ? Ile tu składni ?! Za dużo ! Po co tyle możliwości. O co chodzi !?" ... Zbawieniem okazała się dla mnie książeczka "Ruby. Wprowadzenie". Tutaj autor bardzo powoli zaczął omawiać język - książka okazała się dla mnie idealna... Naprawdę solidnie pozwoliła mi pojąć nie tylko sam język ale również jego "filozofię" i dostrzec w tym całym "bałaganie" pewien sens. Dodatkowo moje wątpliwości szybko rozwiewała społeczność na forum RubyOnRails.pl.

Ruby nie jest językiem prostym. Jest jak system operacyjny. Możesz administrować systemem od 10 lat, spotkać kolegę po fachu i dowiedzieć się, że wykonuje te same czynności w zupełnie inny sposób. Z Rubym jest jeszcze ciekawiej. Posiada on nazwałbym to bardzo rozbudowaną składnię. Twórcy języka jakby dopieścili każdy jego najdrobniejszy element. Nie wystarczyło im że stworzyli już coś co działa, ale z pietyzmem starali się zrobić tego tyle wariantów... na tyle sposobów - ilu programistów na świecie tak, aby każdy znalazł sposób na wykonania swojego zadania tak jak lubi. Nie nazwałbym Rubego językiem programowania - bo języki programowania to język stworzony po to aby maszyna nas rozumiała. Ruby został stworzony nie dla maszyny, ale dla człowieka, aby mógł ekspresywnie, twórczo, kreatywnie oraz precyzyjnie wyrażać swoje myśli i intencje pisząc kod programu. Czytając kod Rubego możesz spojrzeć na niego i zobaczyć coś więcej poza samymi instrukacji - możesz zobaczyć styl, osobę, która pisała ten kod oraz Jej finzję w wyrażaniu myśli.

Wiele osób uważa, że duża ilość możliwości jaką daje Ruby powoduje problemy ze zrozumieniem kodu. Teoretycznie możemy czytać właśnie kod, który czyta plik kompletnie go nie rozumiejąc, bo przez całe życie robiliśmy to inaczej - i nie znamy "tej metody". Jednak moim zdaniem Ruby jest tak skonstruowany, że dzięki samym nazwom metod oraz operatorów - nawet takich, które widzimy pierwszy raz na oczy - będziemy w stanie zrozumieć co wykonuje dany program.

Oczywiście wiele zależy również do programisty. Jakiego zapisu użyje w tej sytuacji, jak ponazywa zmienne, czy to co zrobi będzie miało sens. Święte wojny o to czy klasy w Ruby powinny byc otwarte - czy nie przypominają mi dyskusje związane z bezsensownym przeładowywaniem opratorów różnych obiektów w C++. Moje zdanie jest takie: Dobry programista będzie umiał wykorzystać nawet potencjalnie "niebezpieczne" mechnizmy na rzecz czytelności i zrozumiałości kodu - nie mądry, nawet ograniczony składnią języka może natłóc kod z którego nic nie wynika. Tak więc nie winiłbym języka za to iż przy otwrtych klasach w Ruby można "nieźle nagmatwać", ale raczej składałby odpowiedzialność na barki programistów. Dynamit też był wynaleziony by służyć dobru - tylko od ludzi zależy czemu tak naprawdę będzie służył, sam w sobie - nie jest zły.

1 comment:

Secator said...

Python jest jak surowe spaghetti, wszystko długie, twarde i proste. Ruby jest jak spaghetti po ugotowaniu... pokrecone i polane pysznym sosem. ;]