niedziela, 9 kwietnia 2017

Software Craftsman. Profesjonalizm, czysty kod i techniczna perfekcja

Software Craftsman. Profesjonalizm, czysty kod i techniczna perfekcja 

Idąc za ciosem postów o dobrych praktykach przy pisaniu kodu, dziś o kolejnej bardzo ciekawej pozycji na ten temat.



Autor książki porównuje prac ę programisty, jako rzemieślnika i bardzo dobrze podsumowuje ją Robert Martin, którego książkę opisywałem tydzień temu:

„Jest to książka o profesjonalizmie programowania. Nie tylko o profesjonalizmie programisty, ale również o całej organizacji tworzenia oprogramowania. Jest to książka o mistrzostwie w programowaniu. Na jej stronach autor przedstawia plan, strategię, podejścia i reguły, które mogą pomóc każdemu programiście, każdemu zespołowi programistów i każdej organizacji wytwarzającej oprogramowanie w wyrwaniu się z grzęzawiska mierności i we wkroczeniu na ścieżkę profesjonalizmu, jak również w zapewnieniu większej wydajności oraz poczucia dumy z tego, co się robi.”


Moim zdaniem, jedną z najważniejszych rzeczy zamieszczonych w książce jest rozwinięcie koncepcji „agile”, która jest obecnie najpopularniejszą metodologią prowadzenia projektów i często postrzegana jest jako złoty środek na wszelkie problemy.  Autor objaśnia, na czym powinien polegać agile i dlaczego to, co mamy w wielu firmach to agile tylko z nazwy. Bo przecież to coś o wiele więcej niż wpakowanie pracy w sprinty i codzienne raportowanie. Często firmy adaptują agile, ale tylko te części, które im pasują, bo inne są „stratą pieniędzy”. W książce znajdziemy także opis ruchu „Software Craftsmanship”, który jest rozwinięciem metodyk programowania ekstremalnego oraz podejście do pracy jako programista-profesjonalista. Jest to bardzo ciekawa pozycja, która naświetla wiele spraw, z których  na co dzień możemy nie zdawać sobie sprawy, a są nieodłączną częścią naszej pracy.

Polecam ją serdecznie.

Plan Tygodniowy

Plan Tygodniowy


Jako, że byłem prawie cały tydzień poza granicami naszego kraju z mocno napiętym grafikiem, nie byłem w stanie zrobić nic w projekcie. W zamian, dziś chciałbym zaprezentować plan na bieżący tydzień.

Pierwszą rzeczą, którą muszę się zająć jest skończenie strony postu. Zbudowałem już bazowe sekcje, jednak jeszcze nie jest to to, co chciałem osiągnąć.  Kolejnym ważnym elementem strony postu, jest sekcja rzeczy powiązanych z wyświetlanym postem.
W następnej kolejności będę musiał podpiąć cały projekt pod Google analitycs, aby umożliwić mi gromadzenie statystyk wyświetleń.  Chcę także umożliwić mailową subskrypcję bloga oraz udostępnić RRS feed. 

Rzeczy wymienione wyżej są takim moim minimum, które chcę w tym tygodniu zrealizować. Z rzeczy „nice to have” byłoby także skończenie strony głównej i po wszystkim stworzenie spójnego design całej platformy.  W produkcji jest również logo, także prace trwają. Będę miał teraz więcej czasu na ten projekt, więc możesz oczekiwać obszerniejszych postów na temat pracy w nim wykonanych. Postaram się także nieco bardziej zagłębić w rzeczy realizowane na bieżąco.

Pozdrawiam i miłego dnia! 

niedziela, 2 kwietnia 2017

Retrospektywa

Retrospektywa

Dokładnie miesiąc temu rozpocząłem bloga i udział w „Daj się poznać 2017”. Czas na małe podsumowanie J



Blogowanie i upublicznianie rzeczy które robię, jest dla mnie czymś zupełnie nowym.  Jednak nie jest to aż tak trudne jak myślałem, że będzie. Mimo bardzo krótkiego stażu bloga i projektu, udało mi się już nawiązać bardzo cenne kontakty.  Aby potrenować umiejętności miękkie oraz uczynić publiczne wystąpienia bardziej naturalnymi, rozpocząłem także współpracę ze szkołą programowania dla dzieci i młodzieży.  Nie jestem do końca zadowolony z progresu projektu, jednak biorąc pod uwagę, że jest to coś, co robię po godzinach, w wolnym czasie nie ma też tragedii.  Udało się dopracować nieco kod generujący sekcje na stronie, zbudować od zera frontend na bazie bootstrapa. Skonfigurować kompilator do stylów, skryptów i fontów oraz zbudować bazowe sekcje. Zbudowałem także prototyp wyglądu strony. Nie jestem jeszcze pewny czy finalnie będzie wyglądać tak jak teraz, ale obecny efekt nie jest najgorszy.  Zostało mi jeszcze sporo rzeczy do zrobienia, zarówno po stronie serwera jak i frontendu, zakładam jednak, że pierwszą wersję uda mi się opublikować jeszcze w tym miesiącu. Najważniejsze jest to, że udało mi się utrzymać 2 posty tygodniowo, co niekiedy było trudne i wypuszczałem 2 posty jednego dnia…

Aby nieco ułatwić sobie życie, chcę w najbliższym luźniejszym czasie napisać jeden lub dwa posty na zapas. W przypadku cięższego tygodnia będę miał już co publikować.  Przydałoby się także nieco bardziej usystematyzować pracę na projektem i blogiem, choć jeszcze nie wiem, w jaki sposób chciałbym to zrealizować. Jest to jednak coś, nad czym na pewno będę myślał w najbliższym czasie.

Podsumowując, co poszło dobrze:
  •  Dwa posty w tygodniu, mimo że czasem było ciężko
  • Progres w projekcie, pierwszy prototyp
  • Kontakty nawiązane poprzez inicjatywę
  • Ciągła nauka nowych rzeczy.

Co planuję by było lepiej?
  • Bardziej konsekwentny development
  • Usystematyzowanie prac nad blogiem i projektem
  • Posty na zapas, na cięższe tygodnie

Reasumując, jestem zadowolony z efektów pracy w poprzednim miesiącu choć wiem, że mogło być lepiej. Dwa posty w tygodniu to wbrew pozorom całkiem sporo.  Plan na najbliższy czas to ukończyć prototyp i wypuścić pierwszą wersję live. Będzie się to także wiązało z przepisaniem postów z obecnej platformy na nową.

Na dziś to już wszystko do następnego razu! J



Czysty kod. Podręcznik dobrego programisty

Czysty kod. Podręcznik dobrego programisty



Kontynuując temat z zeszłego tygodnia, dziś o świetnej książce „Czysty kod. Podręcznik dobrego programisty”.  Robert Martin opisuje, co jego zdaniem znaczy dobry jakościowy kod. Osobiście natrafiłem na nią mając już około roczny staż jako programista i jest to jedna z ważniejszych publikacji odnośnie programowania.
Uważam, że każdy kto programuje obiektowo, powinien zapoznać się z tą książką. „Uncle Bob” opisuje, w jaki sposób pisać kod tak, by był łatwy do zrozumienia przez innych oraz łatwy w rozszerzaniu.  Tematy poruszane w książce to między innymi:
  • Nazwy klas i metod
  • Funkcje i listy argumentów
  • Rozdzielanie poleceń i zapytań
  • Stosowanie wyjątków
  • Komentarze
  • Formatowanie
  • Obiekty i struktury danych
  • Obsługa błędów
  • Testy jednostkowe
  • Klasy i systemy
  • Współbieżność
  • Oczyszczanie kodu


Wystarczy podstawowa wiedza z dowolnego obiektowego języka programowania, by zrozumieć treści zamieszczone w książce. Często podejście, o którym pisze Martin jest bardzo „idealistyczne” i bardzo ciężkie do zrealizowania w „prawdziwych projektach”, ale jest to dobry punkt, do którego powinniśmy dążyć w naszym kodzie.  Z własnego doświadczenia mogę też powiedzieć, ze im więcej piszemy w zgodzie z zasadami z książki, tym prostsze i bardziej naturalne się to dla nas staje. Gdy wracam do swojego kodu napisanego rok czy dwa lata temu (poza tym, że rozwiązałbym dany problem inaczej), jest on dla mnie nadal zrozumiały i łatwo wywnioskować, co robi. Dzięki wiedzy zdobytej z tej książki, stworzyłem swoją własną definicję czystego kodu.




Równie ważną publikację tego samego autora jest „Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania oprogramowania w C#”. Możemy w niej znaleźć choćby definicję słynnego SOLID, ale to już materiał na innego posta J  

niedziela, 26 marca 2017

Clean Code, dlaczego to takie ważne?


Pewnie nie raz słyszeliście, że istotne jest, by zachować dobre praktyki i wzorce projektowe. Dlaczego jednak jest aż tak ważne, po co „marnować” dodatkowo czas po to, by stosować się do tych reguł?

Zdobywałem doświadczenie przy bardzo dużym projekcie, który jest rozwijany już lata i z tego co wiem, wciąż się trzyma i nadal się rozrasta. Dzięki temu, że właśnie tam stawiałem swoje pierwsze kroki jako programista, mogłem od razu uczyć się programowania na całkiem dobrze napisanym projekcie. Zanim jednak opowiem o tym dlaczego „Clean Code” miał znaczenie tam, zacznę od spraw ogólnych.

Każda branża specjalistów ma specyficzny dla siebie język, którego używa, by opisać swoją pracę bądź napotykane problemy. Weźmy na przykład  budowanie domu. Dom składa się z wielu elementów instalacji i elementów, które trzeba stworzyć, by ktoś mógł w nim zamieszkać i by sprostał oczekiwaniom właścicieli. W budynku możemy wyznaczyć różne komponenty, jednak większość z nich zbudowana jest na bazie już funkcjonujących schematów, bo wymyślanie wszystkiego od podstaw jest znacznie droższe. Istnieją gotowe rozwiązania problemów, które budowniczy mogą napotkać, schematy są sformułowane w taki sposób, że nawet gdy inny specjalista spojrzy na to, co zrobił jego poprzednik, będzie potrafił dość szybko się odnaleźć w danej konstrukcji. Są jednak ludzie, którzy wykonują swoją pracę niechlujnie i niedbale. Tworzą elementy domu „na skróty”, chcąc w teorii zaoszczędzić. Np. elektryk kładący instalację elektryczną, podpiął pod jeden bezpiecznik zbyt dużo kabli lub (lekka skrajność, aczkolwiek sam widziałem tego typu „oszczędność”) przewody po ścianach nie były kładzione pod kątem prostym tak jak każdy inny elektryk by się spodziewał, tylko tak, by zużyć jak najmniej kabla… Brzmi absurdalnie prawa?
Odnieśmy to teraz do naszej branży. Gdy stosujemy się do dobrych praktyk, to tak, jakbyśmy pisali kod zgodnie ze znanymi schematami. Jeżeli możemy, korzystajmy z gotowych rozwiązań problemów nazwanych wzorcami projektowymi. Dzięki temu, gdy ktoś inny spojrzy na to rozwiązanie, zobaczy, że został użyty wzorzec fabryki i od razu będzie wiedział czego może oczekiwać. A jeśli nie wie co to właściwie jest ta fabryka, bardzo łatwo może znaleźć opis wzorca w sieci. Pisząc kod nietypowy, w którym trzeba tworzyć wszystko od zera i idąc na skróty sprawiamy, że całego modułu robiącego daną rzecz będzie nam bardzo trudno ponownie użyć w innym miejscu. Gdyby cały kod został napisany zgodnie z dobrymi praktykami, łatwo moglibyśmy wydzielić go z aplikacji i re-użyć gdzie indziej. Złudna korzyść w postaci zaoszczędzenia czasu na początku, okazuje się dwukrotnie bardziej czasochłonna podczas późniejszego pisania. Kod, który jest pisany na szybko i niechlujnie, bywa też niezrozumiały dla kogoś innego, a przecież przeważnie nad projektem pracuje cały zespół. Tak jak żaden elektryk nie spodziewa się, że kable mogą iść pod różnymi kątami, tak programiści nie spodziewają się, że zmiana logiki „dziwnego kodu” spowoduje wybuch w innej części aplikacji. A to bardzo częste w podejrzanej czystości kodzie. Dobrze napisany kod ma jeszcze jedną, bardzo ważną zaletę. Jest łatwy w testowaniu. Możemy wydzielić moduły z kodu i testować je w izolacji. Możemy też spiąć je w jeden komponent i sprawdzić jak one działają razem. Nazywamy to testami jednostkowymi i integracyjnymi.


Projekt, o którym pisałem na początku nie jest oczywiście ideałem. Miał bardzo wiele swoich problemów i nie wszystkie jego części były dobrze napisane. Jednak jego podstawy i fundamenty były naprawdę solidne. Dzięki zastosowaniu wzorców projektowych i pisaniu „czystego kodu” projekt był rozwijany przez lata bez większych problemów. Te konkretne podstawy umożliwiły ciągły rozwój aplikacji przez lata. Na temat dobrych praktyk programowania można napisać znacznie więcej (polecam książkę „Clean Code” Roberta Martina), jednak cel mojego postu to bardziej zainteresowanie tematem niż szczegółowe opisanie problemu. A Ty jakie masz doświadczenie jeśli chodzi o czysty kod i dobre praktyki? 

Progres Prac

Progres Prac

Jako, że ostatnio brakuje mi nieco czasu, to post będzie jedynie o postępach prac nad projektem i planach na najbliższy czas.

Większość czasu spędzam nad stylowaniem i budowaniem kolejnych komponentów aplikacji. Tu np. prototyp takiej „karty postu” do bloga.




Powstała także już strona „O mnie”



Sporo czasu zajęło mi także poszukanie w sieci portali z zdjęciami, które będę mógł legalnie użyć na blogu. Obecnie w produkcji jest widok posta oraz modułów mu towarzyszących. Kolejnym elementem będzie sprawienie, by strona była bardziej „SEO friendly”. Po tym wszystkim będę mógł już dostosować homepage, puścić wszystko na „produkcję” i tym samym ustawić nową platformę dla mojego bloga. Oczywiście będzie jeszcze sporo rzeczy do zrobienia. Jednak będzie już na tyle dobrze, że obecny blog będzie wyglądał dużo lepiej niż obecnie. Stąd też decyzja o dość szybkim przeniesieniu.


Do zobaczenia wkrótce! 

sobota, 18 marca 2017

Sass, Bootstrap i Font Awesome

Frontend ciąg dalszy

W ostatnim poście na temat Frontendu opisałem używany przeze mnie kompilator do stylów i skryptów. Dziś opiszę nieco szerzej strukturę i użyte frameworki do stylów.


Zastanawiałem się na kilkoma różnymi gotowymi komponentami do frontendu. Ostatecznie wyłoniłem dwóch finalistów: Bootstrap oraz  Semantic UI. Semantic jest znacznie bardziej rozbudowany i zawiera dużo więcej gotowych modułów.  Wiąże się to jednak z tym, że „waży” znacznie więcej niż bootstrap. Oba frameworki mają to, na czym zależało mi najbardziej. Jest to grid do budowy strony oraz podstawowo zdefiniowane najbardziej potrzebne rzeczy jak buttony, checkbox-y, radio buttony itp. Finalnie wygrał Bootstrap, ponieważ jest lżejszy od semantic oraz jest gotowa wersja Sass bootstrapa (Semantic-UI jest w Less-ie, tak wiem, że można znaleźć wersję Sass zrobioną przez kogoś innego, ale chodzi mi o to, co Framework ma w standardzie). Nie zależało mi na tym by wszystko wyglądało pięknie już w samym frameworku, bo nadpisuję wygląd tak, by była to bardziej „moja” strona. Nie chciałbym też, by po wejściu na bloga było znajome uczucie „ale chamski bootstrap”.
Linki do obu frameworków:

Modyfikacja Bootstrapa

Dzięki temu, że bootstrap można ściągnąć w Sass-ie, mam możliwość modyfikacji poprzez nadpisywanie zmiennych, które później są używane w stylach (jeśli nie wiesz co to zmienne i jak pisze się style w Sass-ie, post na ten temat będzie w przyszłości J).

//== Colors
//
//## Gray and brand colors for use across Bootstrap.

$gray-base:              #000 !default;
$gray-darker:            lighten($gray-base, 13.5%) !default; // #222
$gray-dark:              lighten($gray-base, 20%) !default;   // #333
$gray:                   lighten($gray-base, 33.5%) !default; // #555
$gray-light:             lighten($gray-base, 46.7%) !default; // #777
$gray-lighter:           lighten($gray-base, 93.5%) !default; // #eee

$brand-primary:         darken(#428bca, 6.5%) !default; // #337ab7
$brand-success:         #5cb85c !default;
$brand-info:            #5bc0de !default;
$brand-warning:         #f0ad4e !default;
$brand-danger:          #d9534f !default;

Dzięki temu, w bardzo prosty sposób pozbyłem się standardowo zaokrąglonych krawędzi w komponentach bootstrapa oraz gradienty w guzikach (obie z tych rzeczy nie wyglądają dla mnie zbyt atrakcyjnie) w kilku liniach kodu. Dodatkowo, stworzyłem kilka własnych plików, które implementują nowe style lub nadpisują istniejące. Dzięki temu, tworzę stronę, która wygląda tak jak chcę, a zarazem mam dobrą bazę, która rozwiązuje za mnie wiele problemów.    


Kolejnym istotnym komponentem mojego projektu jest otwarta biblioteka z ikonami Font Awesome. Ikon jest mnóstwo i bardzo łatwo się ich używa. Wystarczy jedynie dodać odpowiednią klasę, której nazwę możemy otrzymać po kliknięciu na interesującą nas ikonę.



Po dodaniu plików font awesome do naszego projektu, wszystkie te ikony stają się dla nas dostępne.
Link do Font Awesome: http://fontawesome.io/

Konfiguracja w Gulpie:

Aby wszystko wyżej opisane zadziałało, stworzyłem cztery taski w gulpie. Dwa z nich są odpowiedzialne za skopiowanie fontów z moich folderów z kodem roboczym do docelowego.
gulp.task('fonts',['fonts-bootsrap'], function () {
    return gulp
        .src(fonts.in)
        .pipe(gulp.dest(fonts.out));
});
gulp.task('fonts-bootsrap', function () {
    return gulp
        .src(fonts.inBootstrap)
        .pipe(gulp.dest(fonts.out + 'bootstrap/'));
});
Task z fontami bootstrapowymi zostanie prawdopodobnie wyrzucony z finalnej wersji. Jest tam, ponieważ bootstrap bazuje na ikonach w nich zawartych i rzuca mi błędy do konsoli, a nie lubię tam czerwonych barw J.  Więc gdy tylko pozbędę się zależności w bootstrapie, wyrzucę taska i fonty z projektu.

Pozostałe dwa taski dotyczą kompilacji Sass-ów do plików css.
gulp.task('sass', function () {
    return gulp.src(scss.in)
        .pipe(sass(scss.sassOpts))
        .pipe(gulp.dest(scss.out));
});

gulp.task('sassprod', function () {
    return gulp.src(scss.in)
        .pipe(sass(scss.sassOpts))
        .pipe(cssnano())
        .pipe(gulp.dest(scss.out));
});
Różnią się od siebie tylko jedną rzeczą: style produkcyjne są dodatkowo minifikowane. Task Sass jest używany, gdy kompiluję frontend na potrzeby developmnetu, dla łatwiejszej nawigacji w stylach i debugowaniu problemów. Sassprod natomiast wykorzystywany jest, gdy kompiluję style, które mają pójść na „produkcję”.

Tak wygląda organizacja stylów w moim projekcie. Jak do tej pory, pisze się mi go bardzo przyjemnie, choć nie mam zbyt wiele czasu. Zachęcam do komentarzy i sprawdzenia źródeł na GitHubie. Polecam również frameworki, które dziś opisałem, choć są na tyle znane, że pewnie nie muszę tego robić.

Do następnego razu J