Wersjonowanie węzełków

node

Node.js & io.js

Ostatnio pojawiła się 3 wersja alternatywnej implementacji node. Mam tu na myśli projekt io.js, który jest dostępny pod adresem http://iojs.org

Io.js korzysta z nowszych wersji silnika java script V8, a tym samym szybciej są implementowane nowe wersje JS i można już poeksperymentować z ECMAscript6 – https://iojs.org/en/es6.html.

Zarządzanie wersjami Node

Aby ułatwić sobie zarządzanie różnymi wersjami zainstalowałem skrypt nvm, który jest do pobrania z https://github.com/creationix/nvm

Pobranie i instalacja skryptu wykonujemy poleceniem

wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.26.1/install.sh | bash

Po tej operacji mamy dostęp do polecenia nvm zarządzającego procesem podglądu i instalacji różnych wersji środowiska nodejs i iojs. Wywołując samo polecenie nvm otrzymujemy pełną listę różnych możliwych opcji. Poniżej podaję tylko niektóre podstawowe z nich.

Jakie wersje są zainstalowane?

nvm ls
system
node -> stable (-> N/A) (default)
iojs -> iojs- (-> N/A) (default)

Zdalne wersje możliwe do instalacji

nvm ls-remote
 v0.1.14
 ...
 v0.12.5
 v0.12.6
 v0.12.7
 iojs-v1.0.0
 ...
 iojs-v3.1.0
 iojs-v3.2.0

Instalacja wybranej wersji nodejs

nvm install v0.12.7
######################################################################## 100,0%
Now using node v0.12.7 (npm v2.11.3)

Instalacja ostatniej (stabilnej) wersji iojs

nvm install iojs
######################################################################## 100,0%
WARNING: checksums are currently disabled for io.js
Now using io.js v3.2.0 (npm v2.13.3)

Teraz w łatwy sposób można sprawdzić zainstalowaną wersję biblioteki.

node --version
v3.2.0

Przełączanie wersji

nvm use v0.12.7
Now using node v0.12.7 (npm v2.11.3)

Pliki w zainstalowanymi różnymi wersjami mode i ios można magazynowane są w katalogu użytkownika ~/.nvm/versions

Dodatkowo warto ustawić domyślnie ustawianą wersję node dla nowo otwieranych okien terminali

nvm alias default stable

Podsumowanie

Świat nodejs rozwija się coraz dynamiczniej. Jest to już dawno w pełni produkcyjne narzędzie z bardzo dużym repozytorium npm – https://www.npmjs.com oraz coraz większą społecznością.

Cieszy także współpraca twórców nodejs i iojs – https://nodejs.org/foundation.

Java script? Zaczynam coraz bardziej postrzegać ten język jako swego rodzaju esperanto programistów. Na jednej konferencji spotykają się ludzie z takich firm jak Google, czy Microsoft, programiści z ruby, .net czy java. To oczywiście wpływ używania java script w przeglądarkach po stronie klienta, ale JS to już nie tylko to, czego przykładem jest właśnie iojs i nodejs.

Konteneryzacja


docker

W otaczającym nas świecie ciągle używamy różnego rodzaju pojemników, opakowań, konserw, czy też kontenerów. Nawet nad tym wszystkim za bardzo się nie zastanawiamy. Różne firmy chwalą się, że potrafią coś inaczej zapakować, a nawet zaprojektować sam opakowywany przedmiot tak, aby zajmował mniej miejsca przy przewożeniu.

Standaryzacja

Aktualnie wszystko po trochu się standaryzuje. To już nie czasy, gdy zakup jakiegoś towary wymagał opakowania w tzw. gazetę. Często wyrób otrzymujemy dobrze zapakowany i nie koniecznie w kolorowym opakowaniu, bo ekologia też ma coraz większe znaczenie.

Konteneryzacja dzięki zastosowaniu znormalizowanych wymiarów przewożonych towarów optymalizuje proces załadunku i rozładunku towarów oraz zmniejsza zajmowaną powierzchnię. Dlaczego to jest potrzebne? Ponieważ wszystkiego jest coraz więcej i gdyby nie optymalizacja to proces mógłby się zatkać na tzw. wąskich gardłach. Statek wpływa do portu, następuje rozładunek i musi zaraz odpływać, bo ktoś inny już czeka w kolejce. Opóźnianie się kosztuje i nie ma czasu na ręczny wyładunek drobnicy. Trzeba używać kontenerów.

A jak jest w świecie oprogramowania?

Systemy operacyjne są kontenerami dla naszych programów, które uruchamiamy w innych kontenerach: wirtualne maszyny, czy też przeglądarkach internetowych. Powstały też pomysły wirtualizacji całych środowisk. Wszędzie mamy kontenery. Kiedyś wielkie firmy uzależniały użytkowników od swoich produktów, teraz trzymanie się standardów zaczyna być postrzegane jako dobre rozwiązanie.

Problemy współczesnego developera

Oprogramowanie staje się coraz bardziej złożone dla projektanta, ale paradoksalnie w pewien sposób coraz prostsze i sprawniejsze w obsłudze dla jego użytkownika. Głównym problemem jest jednak to, że mamy do czynienia z dużą zmiennością i ciągle trzeba poświęcać sporo czas, aby coś skonfigurować, czy zaktualizować. Problemy się jeszcze bardziej mnożą, gdy mamy zespół ludzi pracujący nad oprogramowaniem oraz kilka środowisk testowych i produkcyjnych,a do tego wszystko w różnych wersjach.

Jak to wszystko konfigurować i być pewnym, że to co przetestowaliśmy na środowisku testowym będzie tak samo działać na środowisku produkcyjnym? Istnieje potrzeba, aby to wszystko sprawnie klonować, aktualizować i automatyzować.

Pudełkowanie – eksperyment z Dockerem

Doker to oprogramowanie do: tworzenia, wdrażania i uruchamiania aplikacji rozproszonych. Projekt jest dość młody i został upubliczniony około 2 lata temu, więc jeszcze dużo się w nim dzieje, ale to co teraz umożliwia to skonteneryzowanie programu wraz z jego wymaganymi zależnościami.

Teraz będzie trochę technicznie.

Instalacja

Używając konsoli w Ubuntu wpisujemy

sudo apt-get install docker.io

O szczegółach dla innych systemów, więcej można poczytać na www.docker.com, a na stronie www.docker.com/tryit/# znajduje się bardzo prosty interaktywny tutorial.

Aby sprawdzić, czy już mamy wszystko zainstalowane wystarczy podać polecenie

sudo docker

Pojawi się lista poleceń, których można będzie używać do zarządzania naszym środowiskiem kontenerów.

Wyszukiwanie gotowych obrazów

Polecenie search umożliwia nam wyszukanie gotowych obrazów związanych np. z linuxem ubuntu.

sudo docker search ubuntu

Pobieranie obrazu do lokalnego repozytorium

sudo docker pull ubuntu:14.10

Robimy to wtedy, gdy chcemy mieć podstawę na której będziemy doinstalowywać swoje rzeczy. Obraz zostanie pobrany na lokalny dysk, a listę obrazów wyświetlamy poleceniem images.

 sudo docker images

Uruchamianie kontenera

Teraz możemy poleceniem run uruchomić nasz program w kontenerze np. wyświetlenie daty.

sudo docker run ubuntu:14.10 /bin/date
Fri Apr 10 19:02:52 UTC 2015

Mamy też możliwość uruchomienia kontenera w trybie z terminalem i interaktywnego wywoływania różnych poleceń.

sudo docker run -t -i ubuntu:14.10 /bin/bash  
root@262b7cc08edc:/#

Poleceniem exit zamykającego konsolę naszego kontener.

Konfigurowanie czegoś własnego (nodejs, npm i expressjs)

Teraz możemy coś pokonfigurować. Jeszcze raz otwieramy kontener, ale z dodatkową konfiguracją mapującą port naszego serwera.

sudo docker run -t -i -p 8080:3000 ubuntu:14.10 /bin/bash  
root@3bf28723fc87:/#

Uwaga! Za każdym razem generuje się nowy numer id kontenera i to robilismy wcześniej nie jest już dostępne. Wszelkie zmian są tylko w pamięci i zawsze zaczynamy z tzw. czystym stanem obrazu. W czasie naszych instalacji na innej konsoli naszego systemu możemy sprawdzać jakie procesy działają w środowisku kontenerów: sudo docker ps.

sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3bf28723fc87 ubuntu:14.10 /bin/bash 13 minutes ago Up 13 minutes 0.0.0.0:8080->3000/tcp jovial_pasteur

Teraz zainstalujemy testowy serwer www. Musimy zainstalować nodejs – silnik java script, npm do zarządzania paczkami  i generator aplikacji serwera expressjs.

#instalacja bibliotek
apt-get update
apt-get install nodejs 
apt-get install nodejs-legacy
apt-get install npm
npm install -g express-generator

#generacja aplikacji serwera www
express gedeonix

#pobranie bibliotek i uruchomienie aplikacji serwera
cd gedeonix
npm install
npm start

Teraz po wystartowaniu serwer express domyślnie nasłuchuje w kontenerze na po HTTP na porcie 3000. Ponieważ nasz cały kontener uruchomiliśmy z mapowaniem portów -p 8080:3000 to zewnętrznie aplikacja będzie widoczna poprzez nowy port 8080.

express

Co robić, aby za każdym razem nie wprowadzać tego wszystkiego ponownie?

W tym celu mamy dwa mechanizmy. Jednym z nich jest tworzenie specjalnego pliku konfiguracyjnego Dockerfile, a drugi to proces budowania własnych obrazów na podstawie tego pliku.

Przygotowujemy plik o nazwie Dockerfile

FROM ubuntu:14.10
MAINTAINER Przemysław Sołtan
WORKDIR /home

#instalacja bibliotek
RUN apt-get update
RUN apt-get install -y nodejs 
RUN apt-get install -y nodejs-legacy
RUN apt-get install -y npm
RUN npm install -g express-generator

#pobranie bibliotek i uruchomienie aplikacji serwera
RUN express gedeonix; 
RUN cd gedeonix && npm install

#polecenie uruchamiające serwer wywoływane przy run
CMD [ "/bin/bash", "-c", "cd gedeonix; npm start" ]

Teraz wystarczy tak przygotowany plik wywołać i zbudować własny obraz. Kropka na końcu oznacza katalog bieżący w którym umieściłem plik Dockerfile.

sudo docker build -t="gedeonix" .

Od teraz w docker images mamy własny obraz o nazwie gedeonix, który możemy wielokrotnie uruchamiać poleceniem run.

sudo docker run -p 8080:3000 gedeonix

Podczas uruchamiania, tak jak wcześniej,  następuje mapowanie portów oraz dodatkowo wywołanie polecenia CMD zdefiniowanego w pliku Dockerfile. Wynik działania serwera expressjs tak jak poprzednio możemy sprawdzić w przeglądarce localhost:8080.

Podsumowanie

Uzyskujemy automatyzację procesu budowania środowiska, a do tego prosty mechanizm klonowania, bo na podstawie danego obrazu możemy uruchamiać kilka niezależnych kontenerów jako osobne procesy.

To co jest istotne, to można tworzyć całą infrastrukturę własnego rozwiązania i je łatwo dystrybuować na inne maszyny –  do testów, jako dedykowane dla wybranych klientów, czy też do instalacji w chmurze.

Kolejna tajna broń

Już za chwilę, już za momencik…. CoreOS. Ale o tym innym razem :)

Proces wytwórczy

ci

Kolejny wpis techniczny. Poza pracą nad blogiem równolegle prowadzę różnego rodzaj eksperymenty związane z technologią nodejs. Z tego względu dzisiaj trochę o ciągłej integracji oprogramowania w oparciu o mechanizmy wspierające ten proces.

Przepis na smakołyk

Projektując oprogramowanie dochodzimy do momentu, gdy chcemy je udostępnić użytkownikowi. Być może nie jest ono jeszcze do końca gotowe, być może nawet nie spełni jego oczekiwań. Chcemy mimo tego mieć pewien mechanizm, który nam ułatwi proces wdrażania w ten sposób, aby go w pełni automatyzować. Alternatywa?! Robić to wszystko ręcznie. Tylko po co?

Cel? Udostępnienie prostej aplikacji webowej. To będzie nasz smakołyk, który dostarczymy końcowemu klientowi.

Palnik i patelnia

Zaczynamy od kuchni. Tak więc wybrałem technologię nodejs. Jest to silnik V8 java script z przeglądarki Chrome umożliwiający wywoływanie kodu po stronie serwera. Opis instalacji i konfiguracji można znaleźć pod adresem nodejs.org.

Do tego wszystkiego dokładamy system pakietów npm. Można tam odnaleźć bardzo dużo różnych bibliotek i rozszerzeń. W tym przypadku wyszukałem słowo express.

npm

Generator potrawy

Skorzystałem z bardzo popularnego serwera expressjs i wygenerowałem przykładowy projekt wraz z jego kompletną strukturą. To mi uprościło ten wpis, bo na razie nie chciałem skupiać się na samym nodejs i jego mechanizmach. Opis biblioteki i generator znajdują się pod adresem  expressjs.com.

Domowa lodówka

Ponieważ będę chciał dokonywać zmian wzorcowego kod i śledzić te zmiany to do projektu dodałem obsługę systemu kontroli wersji – GIT.

Za pomocą tego systemu mogę rejestrować wszelkie zmiany na plikach mojego projektu. Wiem co i kiedy modyfikowałem i to bez robienia jakichś dodatkowych kopi. Co więcej bardzo łatwo można w takim systemie wrócić do starszych wersji projektu. Więcej o systemie GIT można poczytać pod adresem git-scm.com.

Magazyn jest ważny

Git na lokalnym komputerze mi nie wystarcza. Chciałbym mieć to w sieci w konkretnym repozytorium. Dzięki temu można to współdzielić z innymi programistami, a do tego mamy dodatkową kopię bezpieczeństwa. Do moich projektów używam serwisu bitbucket.org. Serwis jest bardzo funkcjonalny, a do tego z pewnymi ograniczeniami darmowy nawet do zastosowań komercyjnych i zapewniający prywatne repozytorium.

bitbucket

Tworząc w serwisie nowe repozytorium otrzymujemy dokładne informacje jak podpiąć nasz lokalny projekt GIT do zdalnego repozytorium na bitbucket.

Kelner. W czym mogę służyć?

Mamy więc gotowy kod źródłowy, który będziemy chcieli zaserwować na naszym serwerze.

W moim przypadku mam własny serwer VPS z systemem Linux na pokładzie. Na nim to zainstalowałem mój blog, który czytasz, ale także doinstalowałem nodejs oraz coś, co będzie zarządzało procesem wdrażania mojej testowej aplikacji – projekt Jenkins. Tak więc po zainstalowaniu środowiska – jenkins-ci.org dodałem także trochę wtyczek ułatwiających pracę (GIT Plugin, AnsiColor, Bitbucket Plugin).

Następny krok to założenie nowego projektu i jego właściwa konfiguracja.

jenkins

Podajemy namiary na repozytorium na bitbucket i konfigurujemy tak oba systemy, aby Jenkins mógł pobierać kod źródłowy (odpowiednie klucze rsa) i umieścić w odpowiednim katalogu na serwerze docelowym, tzw produkcji.

Drugi element to konfiguracja bitbucket – ustawienie tzw haka, aby bitbucket informował Jenkinsa, że nastąpiły zmiany w kodzie i Jenkins powinien ponownie rozpocząć proces wdrażania nowego kodu na serwer produkcyjny.

Sposób konfiguracji dokładnie został opisany pod adresem wiki.jenkins-ci.org/display/JENKINS/BitBucket+Plugin

W tym momencie otrzymałem automatyczny mechanizm, który zapewnia, że gdy zmienię kod źródłowy mojej aplikacji, to trafi to do odpowiedniego katalogu na maszynie docelowej.

Ale jak to teraz wszystko uruchomić? Demonizacja

Gotowy kod na serwerze należy uruchomić. W przypadku nodejs sam kod już jest serwerem i nie ma potrzeby instalacji dodatkowego oprogramowania.

Mimo tego powinniśmy mieć jakiś mechanizm (demona), aby uruchomić dany proces i się wylogować z systemu w ten sposób, aby dany proces (w tym przypadku nasz serwer express) mógł dalej pracować w tle.

W tym celu użyłem projektu pm2 znajdującego się pod adresem github.com/Unitech/pm2. W bardzo prosty sposób możemy kod nodejs uruchamiać, restartować i wyłączać wraz z pełnym listowaniem bieżącego stanu poszczególnych procesów. Bardzo przyjemna biblioteka i łatwa w obsłudze.

Mając demona w tym momencie wzbogaciłem konfigurację Jenkinsa o dodatkowe działania:
npm install – automatyczna instalacja wymaganych bibliotek nodejs;
npm update – aktualizacja bibliotek nodejs;
pm2 stop www – zatrzymanie procesu www (o ile był uruchomiony);
pm2 start ./bin/www – uruchomienie procesu www mojej aplikacji

Danie gotowe i ekspresowo podane

Od tego momentu Jenkins automatycznie uruchamia serwis i jest on dostępny na domyślnym porcie 3000 w przeglądarce internetowej.

express

Sanepid, czyli monitoring kontrolowany

Do całego naszego zestawu możemy dodać monitoring demona pm2. Jest to aplikacja w tzw. chmurze, ale z pewnymi ograniczeniami dostępna za darmo. Do naszych testów bardzo przydatne narzędzie z przyjemnym interfejsem.

Odwiedzamy stronę keymetrics.io na której znajduje się prosty opis, jak nasz system pm2 spiąć z aplikacją Keymetrics.

keymetrics

Ufff. Koniec, ale teraz trzeba coś zmienić w kodzie.

Używając inteligentnego oprogramowania (InteliiJ IDEA) lub zwykłego notatnika możemy dokonać modyfikacji naszego kodu, a zmiany posłać GIT-em na serwer Bitbucket.

idea

Serwer Bitbucket da znać do Jenkinsa, aby ten pobrał nowy kod i go wdrożył poprzez instalację i aktualizację bibliotek nodejs oraz zatrzymaniem i uruchomieniem naszej aplikacji jako nowy proces.

Minutę później na PRODUKCJI

express-new

W kodzie zmieniłem tekst i kolor strony. Nastąpiła szybka podmiana zawartości aplikacji. Stworzyłem automat, który czuły jest na zmiany w kodzie, a właśnie to najbardziej lubię, programować, a nie ciągle marnować czas na powtarzalne rzeczy.

Podsumowanie

Opis nie zawiera szczegółów, to nie było nawet moim celem. Bardziej chodziło mi o prezentację mechanizmów jakich możemy użyć, aby usprawnić pracę przy procesie wdrażania oprogramowania. Nie zawarłem też ważnego aspektu jakim jest testowanie kodu, ale to nie na tym na razie się skupiałem. Punktem wejścia do tego typu działań jest metodyka DevOps. To kierunek w jakim się rozwijam i poszerzam swoją wiedzę.

Kanciasta technologia

ekosystem

Dzisiaj wpis technologiczny, więc może nie zainteresuje każdego. W każdym razie jest to cześć tego co mnie interesuje i ciągle w tym się rozwijam.

Moje odkrycia: Nieodłącznym działaniem w rozwoju programisty jest odkrywanie. Staram się poznawać rzeczy na których się nie znam. To pozwala poszerzyć horyzonty i patrzeć na swoją pracę z pewnego dystansu. Poza tym to bardzo odświeża umysł i zmusza go do ciągłego ćwiczenia. Tak więc szukam, badam i poznaję nowe rzeczy.

Retrospekcja: Od wielu lat jestem programistą JAVA/JEE i w większości czasu spędzam projektując warstwę widokową aplikacji internetowych. Technologie przez które przeszedłem to głownie JSP, GWT z ExtJS, Qooxdoo, RAP z Eclipse, czy też JSF z Primefaces. Bardzo różne technologie i mechanizmy działania. W większości abstrakcja, zapudełkowanie kodu, oddzielała mnie od tak nielubianego, można by nazwać nawet dziecinnego kodu JAVA SCRIPT.

Nie lubiłem JAVA SCRIPT, języka którego tak naprawdę nie znałem. Wydawał mi się bardzo dziwny, zagmartwany, wręcz z błędami. Patrzyłem na to oczami programowania obiektowego. Cieszyło mnie to, że mogłem to wszystko zapakować jakąś technologią w czarne pudełko i do niego nie zaglądać.

Sieć: Ostatnie dziesięć lat to dynamiczny rozwój serwisów Web 2.0. W końcu zamiast statycznych stron, zyskały one sporo dynamizmu. Mimo tego proces wytwórczy z poziomu JAVA był ciągle bardzo ciężki, uciążliwy i pracochłonny. Ale w końcu JAVA SCRIPT dorósł, a w raz z nim różne technologie webowe: HTML i CSS.

W pewien sposób obecnie JAVA SCRIPT interesuje mnie bardziej niż sama JAVA. Ale jak to się stało?

Bindownica: Zaczęło się od zainteresowania Angularem – angularjs.org. Jakieś dwa lata temu zerknąłem na ten projekt i jego przykład z mechanizmem wiązania – bindowaniem.

Sam mechanizm jest o tyle fajny, że zapewnia wiązanie danych modelu z jego widokami. Takim prostym przykładem są dwie kontrolki tekstowe powiązane z jakimś modelem. Programowe wpisanie wartości (do modelu) automatycznie aktualizuje kontrolki (widok). To w zasadzie nic wielkiego, ale to co jest ciekawe to kolejny test – wpisując wartość do jednej z kontrolek (widok) aktualizuje się automatycznie model, ale też druga kontrolka powiązana z tym modelem. Czyżby to jakaś magia?

Implementacji tego mechanizmu poraziła mnie prostotą tak bardzo, że dała dużo do myślenia. Zacząłem angulara postrzegać już nie jako zabawka, kolejny fajny framework, ale jako rozszerzenie nielubianego java script. To wciągnęło mnie jeszcze bardziej w chęć poznawania java scriptu i odkrywania jego prawdziwego oblicza, jego mocnych stron jako języka funkcyjnego.

Nagle stało się dla mnie możliwe projektowanie w prosty i bardzo efektywny sposób. Zrozumienie mechanizmów, inne podejście do kodu, ale też i do niesamowitego ekosystem.

Ekosystem: Poznawanie angulara doprowadziło do poznawania wielu fascynujących technologii o których nie maiłem zielonego pojęcia. To było jak jakiś świat równoległy o którym nie maiłem pojęcia.

Dynamizm zmian jaki zaobserwowałem i powstawania nowych rzeczy związanych z java script jest niesamowity.

Tak więc poza samym językiem w pakiecie otrzymujemy szereg przyjaznych technologii:

  • nodejs – java script nie tylko dla przeglądarki;
  • npm, bower – zarządzanie pakietami;
  • yo – generatory umożliwiające wystartowanie projektu z gotową strukturą;
  • grunt i gulp – automatyzacja budowania aplikacji;
  • jasmine, karma i protractor – testy jednostkowe i integracyjne.

Moje myślenie: Angular i Java Script zmienił moje myślenie. Myślałem że w moim rzemiośle za dużo rzeczy mnie nie zaskoczy. Co ciekawe to nie sam język się zmienił, ale sposób jego zastosowania. W moich kolejnych technicznych wpisach będę przybliżał niektóre z tych technologii.

Kaizen i narty

narty

I stało się. W końcu nauczyłem się jeździć na nartach. Nigdy w życiu tego wcześniej nie próbowałem, ale małymi kroczkami udało mi się tego dokonać.

Ostatni tydzień to wypoczynek w górach w Wiśle i do tego bardzo piękna, wręcz wymarzona pogoda na narty. Przypomina mi się pewna filozofia – Kaizen dochodzenia do różnych celów małymi kroczkami. W przypadku nart to mi się udało i zadziałało.

Nastawienie: Na początku miałem bardzo pozytywne nastawienie do tego, aby spróbować. Spróbować czegoś nowego, nabrać chęci i pokonać w pewien sposób strach. Samo moje myślenie polegało nie na zadawaniu sobie pytań, czy mi się uda, ale bardziej na stwierdzeniu, że dzisiaj jeszcze nie umiem jeździć, a zobaczymy co będzie jutro. Tak więc spróbowałem „przygotować” się trochę poznając podstawy nauki jazdy na nartach przeglądając krótki filmik w internecie.

Małe kroki: Tak więc będąc już na stoku znalazłem się na oślej łączce. W zasadzie wtedy miałem pierwszy i ostatni kontakt z instruktorem, którego zapytałem gdzie znajduje się takie miejsce. Postanowiłem popróbować tego dnia bez instruktora. Tak więc narty na nogach i chodzenie z nimi po niewielkim stoku. W zasadzie to były moje małe kroki.

Tak naprawdę miałem jednak blisko Ewę, moją żonę, która mnie wspierała. Ona była moim instruktorem pokazując jak sobie radzić z nartami.

Wbiłem swoje kijki kilkanaście metrów powyżej miejsca w którym się znajdowałem na początku i przemieszczałem do nich, a potem próbowałem delikatnie zjechać z powrotem pługiem. Potem kolejne dodatkowe metry i tak dalej. Małe kroki i ciągłe odkrywanie nowych możliwości i oczywiście frajda i dobra zabawa.

W końcu zacząłem czuć narty, czuć że nimi steruję i że mnie słuchają. Nawet się nie spodziewałem takiego efektu. To bardzo mnie podbudowało i dało wiarę we własne siły. W końcu dnia udało mi się już zjechać z początku niewielkiego stoku i byłem gotowy na próby wjazdu na stok orczykiem. To już zostawiłem jednak na kolejny dzień.

Nowy dzień, to kilka upadków, większy stok i wjazdy na orczyku. To też nabywanie umiejętności zjazdów w większym tłumie i przy większej szybkości. Ciekawym doświadczeniem było nie tylko skupianie się na samych nartach, ale balansowania ciałem, frajdy z obserwacji otoczenia, omijania innych. Dużo frajdy ale też i adrenaliny.

Bilans strat: Nie obyło się też bez problemów. Naciągnięte wiązanie boczne w kolanie i nawet wizyta u chirurga. Ale nie zraziło mnie to i nie zniechęciło. W każdym razie moja ekscytacja musiała być dość duża, bo trochę nawet zagadałem lekarza co nie często mi się zdarza. Mimo tego warto było spróbować.

Jak zjeść słonia? Kaizen przypomniał mi właśnie sposób jak się do tego zabrać. Czyli po kawałku, kęs za kęsem. W końcu połknąłem bakcyla i już myślę o kolejnej zimowej wyprawie – wyprawie na narty i kolejnych małych krokach.

Piękny kod i czerwone kabelki

cable

Programowanie jako takie to w większości bardziej rzemiosło niż sztuka. W większości to mrówcza praca niż geniusz. Tak jest w moim przypadku. Takie zlepianie bitów do bitów, bajtów do bajtów. Czasami w tym wszystkim pomagają krasnoludki, albo książki.

Bardzo często, a wręcz zawsze, trzeba coś wykonać na konkretny czas kosztem przejrzystości kodu. A co potem?  A potem… zapomnieć o tym i nigdy tam nie zaglądać zajmując się kolejnymi protezami, łatami, fix-ami. Niech później ktoś inny się o to martwi.

Nie, nie lubię takiego programowania. To kłóci się z moim poczuciem estetyki, estetyki programisty.

Nie zawsze można wszystko naprawić, ale to co daje mi pewną wewnętrzną motywację to troska o to, aby kod zostawiać trochę lepszy. Takie ulepszanie choćby małymi kroczkami. Małymi ale systematycznymi krokami można zdziałać naprawdę bardzo dużo.

Na mojej półce z książkami (tej w realu, poza e-półką z e-bookami) mam trochę książek dla mnie ważnych, istotnych. Takich do których sięgam częściej.

Są to książki o wzorcach projektowych, refaktoryzacji, testowaniu, czy też o pięknym i czystym kodzie. W pewien sposób są to elementarze programisty. Narzędzia pomocne w doskonaleniu swojego czeladniczego warsztatu.

Od kiedy po raz pierwszy zetknąłem się z refaktoryzacją utknąłem w niej na dobre.  Zafascynowałem się możliwościami ugniatania kodu. Dla niektórych zmiany w kodzie bez wprowadzania nowych funkcjonalności to jakieś marnotrawstwo. Nacisk jest kładziony na efekt, na działania wynikłe z arkuszowych słupków. Oczywiście można też przegiąć w drugą stronę i rozmarzyć się zapominając tak naprawdę o właściwym celu.

Ale co, gdy trzeba działać szybko, niczym chirurg podczas ratowania pacjenta? Wtedy używam swoich czerwonych kabelków.  W książce „Piękny kod” jeden z autorów wspominał o systemach (chyba central telefonicznych) gdzie wszystkie łączące kable były żółte. Gdy działo się coś awaryjnego używano czerwonych kabelków. Potem było wiadomo, co wprowadzono nagle i co trzeba będzie dokładniej sprawdzić po nagłych zmianach.

Moje czerwone kabelki… Bardzo lubię to określenie.

Tworzę kod, który ma działać tak, aby zapewnić użytkownikowi systemu prawidłową pracę niezależnie od tego czy jest to piękne.  To użytkownik w tym momencie jest ważny. Sytuacja awaryjna. Potem czerwone kabelki trzeba wymienić na inne, standardowe, dobrze przetestowane.

Problemem jest jednak to, aby nie dopuszczać do przeciążenia zarówno klienta, jak i programisty. Aby ten stan nie trwał permanentnie i nie stał się standardowym trybem pracy. Takie coś doprowadzi do wypalenia i zaciągania coraz większych długów projektowych. Nasz system będzie stawał się ociężały, aż do stanu bezruchu i agonii. A potem? Potem możemy pisać nowy system i tak dalej. Pracy nie zabraknie. Ale czy tak naprawdę o to chodzi?

Moje wirtualne kabelki to komentarze w kodzie, zapiski w systemie zarządzania projektem, czy papierowym notesie. To coś, czego nie muszę pamiętać, ale coś co mi przypomni się w odpowiednim czasie, gdy będę chciał działać dalej. Coś co powie, abym posprzątał nim zacznę kolejną robotę.

Tym razem idę zakładać kolejne czerwone kabelki.

Moje miejsce w kosmosie

kosmos

Uwielbiam muzykę elektroniczną, a szczególnie klimaty związane z tzw. szkołą berlińską. Klasyka gatunku to Klaus Schulze, Kraftwerk, a szczególnie Tangerine Dream.

Tangerine Dream to muzyka kosmiczna, fascynująca, dająca naszemu mózgowi oderwać się od rzeczywistości.  Jeśli nie słyszało się muzyki Tangerine Dream, to trochę tak jakby nigdy nie słuchało się muzyki. Dorobek zespołu jest niesamowity. Ja na pewno sięgnę jeszcze nie raz do albumów Ricochet, czy Poland.

Ostatnio zmarł Edgar Froese, założyciel i lider zespołu Tangerine Dream.

W pewien sposób świat muzyki elektronicznej stracił kogoś wyjątkowego. To co mnie jednak zastanowiło, to jego słowa odnośnie śmierci – Nie ma śmierci, po prostu zmieniamy swój kosmiczny adres.

Dla mnie mój nowy kosmiczny adres to nie tyle nowe miejsce, które możemy odnaleźć, ale relacja bliskości z Kimś dla kogo jesteśmy ważni. Nie będę sam w tym kosmicznym miejscu, gdziekolwiek ono będzie. To już aspekty wiary, wiary w Boga, który chce bliskości z człowiekiem. Boga który za tą bliskość drogo zapłacił. Boga, który ma plan i go realizuje. Boga, któremu mogę zaufać.

Muzyka jest jedną z tych rzecz, które mnie w pewien sposób fascynuje. Gdyby nie istniała czułbym chyba jakiś brak, bycia niekompletnym, wybrakowanym. To trochę jak zaprogramowana tęsknota człowieka, którą może wypełnić wyłącznie Bóg. Dla mnie muzyka to trochę taki dar od Niego. Ale to tylko Jemu należy się pełnia chwały – Soli Deo Gloria.

Lean programmer

code

W życiu człowieka mają miejsca etapy fascynacji różnymi rzeczami. Do niektórych dorastamy dopiero po pewnym czasie, a w innych tematach ciągle jesteśmy dziecinni.  Od ponad 20 lat stykam się z programowaniem, czymś co mnie nieustannie fascynuje. Po prostu lubię to, choć większość czasu to tak naprawdę mrówcza praca, a geniusz to zaledwie klika procent z tego.

A zaczęło się to od fascynacji grami i moim pierwszym komputerem – Commodore 64. W pewnym momencie zacząłem się zastanawiać nad tym – Jak to działa i jak to jest zrobione? Mój pierwszy większy program pisałem w BASICu i zanim się obejrzałem już mi zabrakło pamięci w komputerze – (C64 miał 64kB). Musiałem to zrobić inaczej, używając asemblera.

Dziś mamy Internet. Dostęp do wielu rzeczy i to raczej brakuje nam czasu na to wszystko oraz umiejętności wybierania to co dla nas istotne. Od moich programistycznych początków przeszedłem przez różne języki programowania począwszy do Pascala, C++, Perla czy też VHDL i Verilog do zadań specjalnych 😉

W końcu dokonała się moja specjalizacja – język Java. Ale czy na pewno to wystarczy? Wydaje się, że podział programistów na Frontend (od widoku aplikacji) i Backend (od biznesowych reguł i komunikacji z bazami danych) coraz bardziej się zaciera.

Od jakichś 2 lat staram się być developerem FULL STACK. Sięgam więc po JavaScript (angular, nodejs), CSS (less), czy też SQL lub NoSQL.

Robisz to co potrzeba, a tak naprawdę nabierasz zdolności do wszechstronności, do zmiany i przystosowania swoich umiejętności do nowych wyzwań. To trochę jak z Lean Toyoty, której udało się być konkurencyjną firmą z lepszą organizacją metod pracy, zarządzania zasobami, a także patrzeniem na potrzeby klientów.

W pracy programisty to coś jak bycie – Lean programmer.

To wymaga samo uczenia i pasji odkrywania rzeczy na których się nie znamy.

Czy to jest ciężkie i trudne? Jeśli to staje się Twoją pasją, to staje się też fajne i przyjemne. To jak paliwo do samochodu, które tankujesz, aby jechać dalej.

Co dzisiaj zatankowałeś do swojego zbiornika wiedzy?

Na początku było słowo

slowo

Witam serdecznie na moim autorskim blogu, na którym będę umieszczał różne przemyślenia odnośnie tego co mnie napędza. Traktuję blog trochę jako eksperyment, ale zobaczymy co z tego wyjdzie. Wszystko jest niedopracowane, wręcz ascetyczne i wyjdzie w praniu. Tak więc zaczynamy.