A co z tatą-programistą? Ani nie ma pistoletu, ani nie jeździ czerwonym wozem na sygnale, nic ciekawego. Idzie taki rano, wraca po południu, czasem w ogóle tylko w domu przy komputerze siedzi. Czym tu się chwalić?
Więc taki tata musi łapać choć malutki punkt gdy tylko nadarzy się taka okazja. No i właśnie mnie się taka przydarzyła 🙂 Otóż na wiosnę (tak, wiem, mam ten refleks, pisząc to pod koniec lata. Lata? :P) Olga, czyli moja starsza córka, poprosiła mnie o pomoc w zadaniu, które polegało aby z zestawu liter ułożyć wyrazy.
Olga w połowie krasy 🙂 |
Oczywiście litery były tak dobrane, by pierwszoklasista poradził sobie z tym bez dużego wysiłku. Szybko podpowiedziałem jej w jaki sposób można sobie radzić z takimi zadaniami i w ramach bonusu powiedziałem, że za kilka minut zobaczymy wszystkie wyrazy, jakie można ułożyć z podanych w zadaniu liter. Oczywiście z pomocą supermocy inżyniera-programisty takie zadanie to pikuś 🙂 No więc szybciutko otworzyłem Visual Studio i wklepałem następujący kod:
Prosta pętla parsująca wyrazy zasysane z dużego słownika zawierającego większość wyrazów używanych w języku polskim wraz z ich odmianami (można pobrać stąd). Zasada działania programu jest prosta: jeżeli wyraz składa się wyłącznie z dozwolonych liter, jest dodawany do listy, potem lista jest sortowana po długości wyrazów i wypisywana na ekran. Priorytetem była tutaj szybkość napisania programu – siedmioletnie dziecko niezbyt dobrze znosi patrzenie na pojawiające się na ekranie wyrazy, których znaczenia nie zna – utrzymanie jej uwagi wymagało ode mnie dużo inicjatywy 🙂
Program uruchomiłem, zobaczyliśmy listę wyników, Olga pobiegła się pochwalić mamie, co fajnego udało nam się stworzyć 🙂 Idylla. Ja zaś zostałem przed monitorem i patrząc na kod zastanawiałem się w jaki sposób można by go usprawnić. Nie w sensie wydajnościowym, bo to bez sensu – dla ww. słownika parsowane trwa ułamek sekundy. Chodziło mi bardziej o wygląd samego kodu – byłem świeżo pod wrażeniem prezentacji Wieśka Kałkusa oraz filmów z Pluralsight. Pomyślałem – a gdyby tak zamienić ten kod na bardziej „funkcyjny”?
Oto co wymodziłem:
Czy to bardziej czytelne? Myślę, że tak. Z doświadczenia wiem też, że trudniejsze do ewentualnego odpluskwiania, tak więc oczywiście pisząc w tym stylu przydałby się zestaw testów pokrywających kod.
Skoro powiedziałem „A” i poszedłem o krok w stronę funkcyjności, to dlaczego nie powiedzieć „B” i przejść na inny, bardziej odpowiedni język? Akurat tak się składa, że VS obsługuje też F# i postanowiłem wykorzystać okazję i sprawdzić co to za dziwo, o którym tak głośno ostatnimi czasy.
Początki nie były łatwe. Tak naprawdę, to na początku cały czas jestem, ale nawet by napisać te parę linijek, naprawdę musiałem się napocić. Składnia mnie odrzuca, a idei, myśli przewodniej programowania funkcyjnego do tej pory nie mogę w pełni ogarnąć. Ale rzeczywiście im dalej w las, tym więcej potencjalnych korzyści z używania F# widzę. Problem w tym, że jak dotąd, widzę niestety cały czas bardzo dużo problemów z tym związanych 🙁
Taki kod udało mi się wyrzeźbić, choć nie bez pomocy kol. Arka, który zgodził się wspomóc mnie swoją wiedzą dot. tego języka:
Jak widzimy, wszystko na opak, pomieszanie z poplątaniem 🙂 Oczywiście takie uroki F# – składnia kłuje w oczy niezaznajomionego programistę, a i sama ideologia stojąca za tym językiem różni się od tej z C#.
Kod wyżej zawiera dwie funkcje robiące to samo – jedna, findFunc, napisana w typowo F#-owym stylu, a druga, findFuncCSharpLike, jest odzwierciedleniem poprzedniego przykładu i korzysta z tych samych bibliotek Linq. Sami oceńcie, która się bardziej podoba i czy w ogóle 🙂
Co mogę powiedzieć na temat tego „doświadczenia”?
Na pewno nie jest to praktyczne, wersja C# zadziałała – mogłem chwycić parę punkcików w oczach córki. Ale w końcu, skoro już do końca życia jestem skazany na tak nieciekawy* zawód, to dlaczego by nie spróbować go choć trochę urozmaicić? Stąd już od dziś rozpoczynam cykl szkoleń ze strony Advent of Code. Nie jestem pewien, czy F# będzie miał zastosowanie w naszych projektach firmowych – szczerze w to wątpię, bo tak naprawdę jeszcze nie widzę przewagi F# nad C# – oczywiście czytałem o jego wyższości przy użyciu wielowątkowości, łatwości w testowaniu itp., ale jak dotąd nie doświadczyłem braków C# pod tym względem, więc sam nie wiem – koszt wejścia w ten język jest dość spory – nowa składnia i przede wszystkim inny sposób myślenia to naprawdę dużo. Co z tego, że ja się tego nauczę, skoro moi koledzy z zespołu nie? Projekt będzie nie do utrzymania, a tym samym żaden manager nie zgodzi się na użycie tego narzędzia. No cóż – najpierw muszę sam do tego przywyknąć, a jak będzie później, zobaczymy.
*oczywiście cały ten wpis powinien być czytany w ten sam sposób jak był pisany – czyli z przymrużeniem oka. Uważam, że praca programisty to jedno z najlepszych zajęć na świecie, razem z byciem drwalem na dalekiej północy (nie mylić z drwalem tego typu 🙂 ).