niedziela, 30 kwietnia 2017

Tagi, Umbraco Tag Service

Tagi w Umbraco Tag Service




W poprzednim poście opisałem jak zaimplementować do Umbraco możliwość dodawania tagów. Dziś będzie o tym, jak wykorzystać to w kodzie i umożliwić filtracje po tagach.
Aby mieć możliwość pobrania dokumentów z Tagiem o określonej nazwie, potrzebujemy UmbracoHelper’a. Ja stworzyłem klasę, którą wstrzykuję w miejsca gdzie potrzebuję pobrania czegokolwiek dodatkowego z Umbraco, a tak wygląda jej kluczowy element:

    public class UmbracoEventHandler : ApplicationEventHandler
        private static UmbracoHelper _umbracoHelper;

        public UmbracoHelper Umbraco => _umbracoHelper ?? (_umbracoHelper = new UmbracoHelper(UmbracoContext.Current));

Na potrzeby wyświetlania tej listy, utworzyłem nowy kontroler, który jest odpowiedzialny tylko i wyłącznie za to.
    public class UmbracoEventHandler : ApplicationEventHandler
[DonutOutputCache(CacheProfile = "Page.Cache")]
        public override ActionResult Index(RenderModel model)
        {
            var pageViewModel = new PageViewModel();
            var extendedModel = _pageModelExtender.ApplyLayoutToModel(pageViewModel, model.Content);
            var tagName = Request.QueryString["tag"];
            var articles = new List();
            var articlesWithTag = _nodeHelper.Umbraco.TagQuery.GetContentByTag(tagName).ToList();
            var header = $"Posty otagowane {tagName}";
            articlesWithTag.ForEach(article =>
            {
                articles.Add(new ArticleCardViewModel
                {
                    Title = article.GetPropertyValue("title"),
                    ShortDescription = article.GetPropertyValue("shortDescription"),
                    Tags = article.GetPropertyValue("tags").Split(','),
                    CardImage = article.GetImage("cardImage", _nodeHelper).WithQuality(80).WithHeight(160).WithWidth(330).WithCrop(),
                    Url = article.Url
                });
            });
            var modelForArticles = new ArticleListViewModel
            {
                Title = header,
                Articles = articles
            };
            var viewModel = new ArticleByTagViewModel
            {
                Id = extendedModel.Id,
                Title = header,
                Footer = extendedModel.Footer,
                Header = extendedModel.Header,
                Description = "Lista wszystkich postów które zostały otagowane " + tagName,
                ArticlesListModel = modelForArticles
            };
            return View("Tag", viewModel);
        }
Kod odpowiedzialny za pobranie wszystkich dokumentów z określonym tagiem to zmienna „articlesWithTag”. Po drodze tworzę także dodatkowe modele i pakuję w odpowiadającą mi strukturę tak, by widok mógł pozostać czysty.
Nazwę taga, który ma być brany pod uwagę, pobieram z parametru w linku (patrz zmienna „tagName”). Jeżeli chodzi o razora, to reużyłem istniejący widok kart postów, skorzystałem z Section buildera i efekt końcowy jest zadowalający:



Dziś krótko, ale używanie tag service jest dość proste i stwierdziłem, że nie ma co nadmiernie się rozpisywaćJ
Udanej Majówki!

sobota, 29 kwietnia 2017

Tagi w Umbraco Back Office

Tagi w Umbraco Back Office


Jedną z bazowych funkcji, które posiada większość blogów, jest możliwość wyświetlania postów po tagach. W tym poście będzie o tym, jak skorzystać z serwisu tagowego w umbraco, aby pobrać i wyświetlić cały content, który został oznaczony określonym Tagiem.

Pierwsza rzecz, którą będziemy potrzebować to możliwość nadania tagów dla określonego typu dokumentów w Umbraco.

Przechodzimy, zatem do Settings -> Document Types i wybieramy interesujący nas DocType, w moim przypadku będzie to „Article”.  Dodajemy nową property i jako typ wybieramy Umbraco.Tags

Przechodzimy teraz do elementu w drzewie contentu. Jak widać, jest teraz możliwość dodawania tagów. Aby dodać nowy, wystarczy wpisać nazwę i kliknąć enter. Jeżeli chcemy dorzucić istniejący, to piszemy początek jego nazwy i możemy dodać go z listy, która się wyświetli:



Sporym ułatwieniem w zarządzaniu tagami na naszej stronie jest rozszerzenie do Umbraco o nazwie „Tag Manager” https://our.umbraco.org/projects/backoffice-extensions/tag-manager/ .
Najprostszym sposobem, aby je zainstalować, będzie pójście do sekcji Developer -> Packages w Back Office Umbraco. Wpisujemy „Tag Manager” i wybieramy ten, który właśnie tak się nazywa ;) Następnie klikamy „Install package”. Po zakończonym procesie instalacji będziemy mieli kolejny tab dostępny w CMS’ie.

Po przejściu do niego, naszym oczom ukaże się drzewo ze wszystkimi tagami, które utworzyliśmy w naszym systemie wraz z informacją ile dokumentów posiada dany tag:



Klikając na konkretny Tag mamy możliwość edycji. Możliwa jest zmiana nazwy oraz przeniesienie otagowanych dokumentów do innego taga, co znacząco ułatwia wszelkiego rodzaju migracje.



Kolejną bardzo przydatną rzeczą jest możliwość przejrzenia wszystkich dokumentów z contentu i mediów. W jednym miejscu widzimy nazwy tych dokumentów i możemy upewnić się czy wszystko jest w porządku. Po kliknięciu w nazwę, przenoszeni jesteśmy bezpośrednio do tego dokumentu i mamy możliwość jego edycji.  To już tyle, jeżeli chodzi o część w back Office Umbraco. Tag Service działa bardzo szybko i wszelkie informacje na ich temat są cachowane. Dzięki temu, wyszukiwanie po tagach działa dobrze i nie trzeba pisać implementacji samodzielnie. W następnym poście pokażę, jak używać Tag Service w kodzie oraz w jaki sposób zaimplementowałem wyświetlanie listy postów po tagach.


Pozdrawiam, Kamil.

niedziela, 23 kwietnia 2017

PluralSight, Sonmez i Szafrański


Można robić wszystko po swojemu, uczyć się na swoich błędach (albo, co gorsza nie), przecierać własne szlaki. Dzięki temu wytyczymy sobie naszą ścieżkę, która w miarę postępów zamieni się już w drogę prowadzącą do finalnego celu. Można także skorzystać z wiedzy i doświadczeń innych. Zastosować sprawdzone trasy i dostosować je do własnych potrzeb. Wskoczyć na chwilę na autostradę, która znacząco przyspieszy dotarcie na miejsce, a w razie trudności zmienić pas na inny, bądź zjechać z niej, gdy widzimy, że już nie prowadzi tam gdzie chcemy jechać. Tak właśnie widzę wzorowanie się na innych i adaptację ich wiedzy oraz doświadczeń na naszej ścieżce. Takie podejście może nas uchronić od niepotrzebnych ślepych zaułków, ułatwić i przyspieszyć dotarcie do celu.
Post ten będzie o ludziach i zasobach, które mi znacząco pomogły (i nadal pomagają) w mojej szeroko pojętej karierze zawodowej.

PluralSight

Nie mam wykształcenia stricte informatycznego. Na pierwszym stopniu studiów byłem na wydziale ekonomii, a finalnie uzyskałem dyplom magistra fizyki. Jako, że specjalizacje były luźno związane z informatyką, miałem kilkakrotnie „podstawy programowania” w programie nauczania. Podstawy (pętle, deklaracja zmiennych, metod itp.) w większości języków są bardzo zbliżone i naprawdę wystarczyłoby raz pokazać jak się robi pętle for. W związku z takim akademickim „background’em” moja wiedza była niewielka. Idąc na moją pierwszą rozmowę kwalifikacyjną podkreśliłem, że niewiele umiem, ale bardzo szybko się uczę. Z takim kredytem zaufania zatrudnił mnie mój pierwszy pracodawca. Po rozpoczęciu pracy, okazało się, że firma, która mnie zaangażowała ma konto na Pluralsight. Dostałem więc login i hasło i mogłem korzystać z niego zarówno w pracy, jak i w domu. Serwis jest ogromną skarbnicą wiedzy o programowaniu. Chłonąłem kursy jeden za drugim. Uczyłem się częściowo w pracy, ale głównie w domu, by nadrobić wszelkie braki oraz uzupełnić wiedzę, która była mi potrzebna do sprawnej pracy przy projekcie. Polecam serdecznie, jako źródło wiedzy, można znaleźć tam kursy na różnym poziomie zaawansowania (a o dobre kursy dla zaawansowanych przecież tak trudno).

Do dzisiaj, zanim zagłębię się w jakąś nową bibliotekę, sprawdzam czy jest dostępny kurs na jej temat na tej właśnie platformie. Najbardziej utknęły mi w procesie nauki kodowania dwa nazwiska autorów.

Scott Allen (http://odetocode.com/about/scott-allen), który stworzył świetne kursy na temat programowania w C#, pisania aplikacji MVC czy WebApi oraz na temat frameworków JavaScript-owych. Ostatnio mocno zaangażował się w projekt Aurelia JS (http://aurelia.io).
Drugim autorem, któremu chciałbym poświęcić nieco więcej uwagi jest John Sonmez


Pierwszy raz miałem styczność z Sonmezem właśnie na platformie Pluralsight, gdzie oglądałem kursy na temat programowania na urządzenia mobilne i szeroko pojętego programowania w .NET. Jest to człowiek, na którym się wzoruje. Przetarł on ścieżkę w wielu miejscach i czerpię od niego mnóstwo wiedzy. Ma swój kanał na Youtube, na którym często wrzuca materiały o interesującej mnie tematyce np. jak zbudować własny „Brand”, jak poprowadzić swoją karierę tak, aby przynosiła jak najwięcej satysfakcji i pieniędzy. To i wiele innych rzeczy można znaleźć u Sonmeza. Zastosowałem u siebie wiele z jego rad i zauważyłem jedynie pozytywne efekty. Z czystym sumieniem polecam.
Ostatnim świetnym „zasobem”, z którego wiele wyciągnąłem i z powodzeniem zastosowałem jest Michał Szafrański, jego blog http://jakoszczedzacpieniadze.pl oraz książka „Finansowy Ninja” .



W miarę jak rozwijała się moja kariera, rosły także zarobki. Jednak nie umiałem (i nadal mam z tym czasem problem) utrzymać swoich finansów w „ryzach”. Zarabiałem coraz więcej, a i tak starczało „na styk”. Podjąłem kilka głupich z finansowego punktu widzenia decyzji, których konsekwencji nie udało mi się jeszcze w pełni opanować. Blog, a zwłaszcza książka Michała, pomogły mi ogarnąć swoje finanse, przeskanować wydatki i dowiedzieć się gdzie leży problem. Dowiedziałem się, jak mogę im zaradzić i wytyczyć sobie ścieżkę do wyjścia na prostą. Nadal się jeszcze za mną pewne smrodki ciągną, ale sukcesywnie udaje mi się je redukować, budując przy tym kapitał na przyszłość. Materiały Michała pozwoliły mi spojrzeć na wiele rzeczy z zupełnie innej perspektywy oraz zobaczyć, że to co robią „wszyscy” niekoniecznie jest dobre dla mnie.

Osób, od których czerpię wiedzę, czy zasobów, z których się uczę jest oczywiście więcej, jednak nie chcę, aby ten post był zbyt długi. W moim dorosłym życiu (po studiach) to są osoby/zasoby, które były mi najbardziej pomocne.
To już wszystko na dziś.

Pozdrawiam, Kamil.

     

Proste Cachowanie w .NET MVC


Umbraco ma w sobie system cachowania contentu. Co jednak, gdybyśmy chcieli pójść o krok dalej i zrobili cachowanie jeszcze wcześniej? Po co w ogóle się tym przejmować? O tym w dzisiejszym poście.

Sprawdźmy więc definicję. Czym właściwie jest Cache?

„Pamięć podręczna (ang. cache) – mechanizm, w którym część spośród danych zgromadzonych w źródłach o długim czasie dostępu i niższej przepustowości jest dodatkowo przechowywana w pamięci o lepszych parametrach. Ma to na celu poprawę szybkości dostępu do tych informacji, które przypuszczalnie będą potrzebne w najbliższej przyszłości.”

Źródło Wikipedia

W stronach takich jak WebDotNet, czy innych, w których content nie zmienia się dynamicznie, warto zastanowić się nad cachowaniem wyników, całych requestów.  Zdecydowałem się na zastosowanie „Donut Output Cache”, który jest inspirowany standardowym w MVC Output Cachem. Oto krótki poradnik jak możesz zastosować go w swoim projekcie MVC/Umbraco.
Instalujemy nuget package „MvcDonutCaching”. Cachowanie za pomocą tej biblioteki polega na zapisywaniu w pamięci całych zwrotów z metod Controllerów.  W aplikacji WebDotNet mam jak na razie dwa Controllery. Pierwszy odpowiedzialny za requesty o posty, a drugi o „normalne” strony z sekcjami. Aby dodać akcję do cachowania, należy dodać atrybut do metody. Przy zwykłym projekcie MVC możemy pokusić się o coś bardzo prostego jak np.:
    [DonutOutputCache(Duration = "300")]
Wartość zwracana zostanie w tym przypadku zapisana w pamięci na 300 sekund. Jeżeli w przeciągu tego czasu ktoś ponownie odpyta tę metodę, zwrócona zostanie wartość z pamięci, a kod z metody zostanie pominięty. W ten sposób możemy zaoszczędzić sporo czasu gdy np. nasza metoda odpytuje dodatkowo bazę danych i wykorzystuje jakiś algorytm do wyliczenia danych, które zwraca.
W moim przypadku musiałem pójść o krok dalej, jako że metoda Index jest wykonywana przy renderowaniu każdej strony na platformie. Musiałem więc wykorzystać dostosowany do moich potrzeb profil cachowania. Atrybut przy takim podejściu wygląda tak:
    [DonutOutputCache(CacheProfile = "Page.Cache")]
Profil jest zdefiniowany w Web.configu aplikacji:
    
      
        
          
        
      
    
Definiujemy tu nasz profil, czas przechowywania w pamięci oraz opcjonalną (a w moim przypadku wymaganą) dedykowaną klasę, która zajmie się kreacją kluczy do cacha. Zdecydowałem się, że kluczem dla moich elementów w pamięci będzie URL strony, gdyż jest to wartość unikalna.
    public class WebdotnetApplication : UmbracoApplication
    {
        public override string GetVaryByCustomString(HttpContext context, string custom)
        {
            if (custom.Equals("Page.Cache")) 
            {
                return context.Request.Url.AbsoluteUri;
            }
            return base.GetVaryByCustomString(context, custom);
        }
    }
Aby dedykowany kreator kluczy działał, musimy zrobić jeszcze jedną rzecz. Sprawić, by dziedziczył po naszej startowej klasie, która jest zdefiniowana w Global.asax. Przeciążyć metodę  „GetVaryByCustomString” i w pliku Global zmienić bieżącą klasę na naszą klasę dziedziczącą po poprzedniej, aby zachować ówczesną funkcjonalność. 
    <%@ Application Inherits="Webdotnet.Custom.Core.WebdotnetApplication" Language="C#" %>
To by było na tyle, jeżeli chodzi o dodawanie elementów. Używając Umbraco chcemy jednak, by przy wszelkich zmianach w contencie pamięć podręczna została wyczyszczona (a przynajmniej pozycja pod zmienianym kluczem została usunięta). Pozostało nam jeszcze podpięcie się pod Eventy umbraco. Aby to zrobić, należy stworzyć klasę, która dziedziczy po „ApplicationEventHandler” i nadpisać metodę „ApplicationStarted”. W ciele tej metody należy podpiąć się pod eventy zmiany/dodawania/usuwania itp. i dodać metody modyfikujące zawartość cacha, w moim przypadku usuwające jego zawartość.
    public class UmbracoEventHandler : ApplicationEventHandler
    {
        protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
        {
            ContentService.Published += UmbracoContentChangeHandler.OnPublished;
            ContentService.Created += UmbracoContentChangeHandler.OnCreated;
            ContentService.Saved += UmbracoContentChangeHandler.OnSaved;
            ContentService.Published += UmbracoContentChangeHandler.OnPublished;
            ContentService.UnPublished += UmbracoContentChangeHandler.OnUnpublished;
            ContentService.Moved += UmbracoContentChangeHandler.OnMoved;
            ContentService.Trashed += UmbracoContentChangeHandler.OnTrashed;
            ContentService.Deleted += UmbracoContentChangeHandler.OnDeleted;
        }
    }
W każdej z tych metod wywołuję usuwanie elementów z cacha, kod tej metody wygląda następująco:
    private static void RemoveItemsFromCache()
        {
            var cacheManager = new OutputCacheManager();
            cacheManager.RemoveItems();
        }

I to by było wszystko. W tym momencie będziemy już mieli działającego cacha wraz z usuwaniem jego elementów przy zmianach w contencie aplikacji.
To już wszystko na dziś, pozdrawiam Kamil.

czwartek, 13 kwietnia 2017

Komentarze poprzez Disqus


Dziś podjąłem się implementacji komentarzy. Zdecydowałem, że nie chcę się bawić w implementowanie ich samemu, gdyż wiązałoby się to również z implementacją użytkowników. Obecnie nie widzę potrzeby by mieć użytkowników poza możliwością komentowania, więc postanowiłem się rozejrzeć za czymś gotowym.
Moją uwagę przykuł Disqus, którego widziałem na wielu stronach. Ma multum opcji logowania się i wygląda bardzo ładnie :). W dzisiejszym poście będzie zatem o tym jak skonfigurować Disqus i zamieścić go na dowolnej stronie. Sama instrukcja jest na stronie producenta, jednak chciałbym pokazać jak proste i bardzo intuicyjne jest to rozwiązanie, by rozwiać wątpliwości czy warto.


Pierwszą rzeczą, którą musimy zrobić jest… Założenie konta na Disqus :). Logujemy się więc na https://disqus.com/ i przechodzimy do zakładki „Get Started”.
Logujemy się za pomocą jednego z kont na social mediach bądź zakładamy nowe konto, jeśli nie posiadamy nawet „fejkowych” kont. Ja zalogowałem się poprzez Google.
Klikamy na „I want to install Disqus on my site”



Wpisujemy nazwę strony, kategorię oraz język, następnie klikamy „Create Site”



Następnym etapem jest wybór subskrypcji. Przeczytaj i zdecyduj, która Ci odpowiada najbardziej.
Nadszedł czas na wybór sposobu implementacji samych komentarzy na stronie. Możesz wybrać jeden z wielu gotowych pluginów, bądź skorzystać z „Universal Code”. Jako, że tworzę własnego bloga, wybrałem ten ostatni, który umożliwia implementację komentarzy na dowolnej stronie.



Naszym oczom ukaże się ten oto blok kodu, który z drobnymi zmianami musimy wkleić na stronę, która ma posiadać sekcję komentarzy:

    

Tak jak jest napisane interesują nas dwie rzeczy:
this.page.url = PAGE_URL;  // Replace PAGE_URL with your page's canonical URL variable
this.page.identifier = PAGE_IDENTIFIER; // Replace PAGE_IDENTIFIER with your page's unique identifier variable
URL możemy uzyskać np. poprzez JavaScript wykorzystując „window.location.href” natomiast identifier musimy ustalić na bazie czegoś unikalnego, w moim przypadku jest to Id Noda z umbraco będącego wyświetlanym artykułem. I to tyle… Tak, to było tak proste.
Czas na test, sprawdzam czy wyświetla mi się sekcja komentarzy i dodaję testowy komentarz:


Wygląda całkiem niesamowicie, sprawdźmy jeszcze czy widzę komentarze w panelu administracyjnym w disqus


Wygląda na to, że wszystko jest w porządku. Tym oto sposobem zaoszczędziliśmy sobie mnóstwo czasu, który byłby potrzebny na wdrożenie czegoś podobnego samodzielnie i ostylowanie, by wyglądało równie ładnie.
To już wszystko na dziś, pozdrawiam! :)

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