Praktyka czyni mistrza – katy dla C#

No w końcu znalazłem porządne i wygodne miejsce do codziennych ćwiczeń programistycznych – dostępne on-line i dość sensownie zrobione. Nie wielu programistów korzysta z takich rozwiązań. Nie wiem dlaczego. Jednak ja polecam codzienne ćwiczenia w pisaniu kodu i wymyślaniu algorytmów, bo tylko dzięki temu praktycznie zwiększymy szybkość pisania oraz będziemy elastycznie podchodzić do problemów. Jak to wygląda w praktyce napisze poniżej.

Codzienne ćwiczenia

Z rana mam sporo energii, więc pracuje nad projektami i pracą do wykonania. Później, po obiedzie jestem już zmęczony i wtedy robię sobie przerwę na programistyczne katy.

Zaczynałem od pisania algorytmów. Mój ulubiony do Quicksort. Codziennie pisałem od początku taki algorytm. Tak ten sam codziennie. Gdy poznawałem nowy framework to codzienne go implementowałem i konfigurowałem w przykładowym projekcie. Dzięki temu ćwiczy się wiele rzeczy:

  • Podejście do rozwiązania. Zamiast zacząć od metody do sortowania zaczynam od metody do wyboru PIVOT-a i poruszam się w górę aż do implementacji (gdy znasz samo rozwiązanie, możesz skupić się na architekturze itd.)
  • Ćwiczę TDD. Samo podejście, dyscyplinę – co innego w projekcie a co innego jak się ma czas i można parę rzeczy przećwiczyć, pozwala to na praktykowanie dobrych rozwiązań i unikania chodzenia na skróty.
  • Skróty klawiszowe. Praca w postaci pisania kodu do projektów jest podzielona na etapy. Każdy etap wymaga innych skrótów. Tak naprawdę czasem nie ma czasu na praktykę (bo etap trwa krótko i człowiek szybko idzie na skróty, przez co po 3 latach nadal nie zna skrótu do czegoś tam. Dzięki spokojnej, powtarzalnej pracy wiedza się układa i zostaje na dłużej.
  • Konwencje. Wiele framework-ów potrzebuje pewnej dozy konfiguracji opartej na konwencjach. Wystarczy zapomnieć o jednej konwencji i możemy się na dłuższy czas się zablokować (ASP .NET i dodawanie do nazwy klasy kontrolera słowa Controller). Codzienne praktyki pozwalają zapamiętać takie rzeczy.
  • LINQ-u. Aby sprawnie korzystać z LINQ-u trzeba się sporo na praktykować. Trzeba mieć z tyłu głowy informacje, że ten i ten kod to inaczej zwykła metoda Aggregate. Bez praktyki samo to nie wskoczy. Wiadomo, Resharper podpowiada i zamienia automatycznie wyrażenie na LINQ-u jak może ale to nie do końca o to chodzi.
  • Szybkość. Nic tak nie daje satysfakcji niż 3 godziny bez uruchomienia kodu, potem F5 i… wszystko działa. Takie rzeczy się zdarzają ale tylko gdy dużo ćwiczę.
  • Pomoc. Pomoc innym. To chyba najbardziej widoczny plus ćwiczeń tego typu. Bardzo szybko można znaleźć błędy w czyimś kodzie, bo na 99% my już to przechodziliśmy i wiemy na co zwracać uwagę.

No to tyle jeśli chodzi o plusy codziennych ćwiczeń z tworzenia kodu. Takie ćwiczenia zajmują nie więcej niż 40 minut. Nie trzeba dłużej ich wykonywać ale trzeba to robić codziennie.

Myślenie

Nie napisałem o jeszcze jednym ważnym aspekcie codziennych praktyk. Może się wydawać, że same ćwiczenia to tylko klepanie kodu ale tak nie jest. To też ćwiczenia umysłowe. Dobry programista to taki co tworzy szybko i sprawnie algorytmy do rozwiązań i właśnie to również ćwiczę i polecam.

Na początku korzystałem z takiej strony http://codekata.com/, później znalazłem kilka innych stron, które oferowały zadanie algorytmiczne, możliwość wysłania kodu i sprawdzenia czy jest ok. Jest tego sporo w sumie. Jednak dopiero ostatnio jedno rozwiązanie przypadło mi do gustu –  https://www.codewars.com  dlaczego zapytacie:

  1. Sporo zadań, podzielonych po poziomie trudności.
  2. Możliwość pisania kodu na stronie.
  3. Możliwość wielokrotnego szybkiego sprawdzenia czy kod przechodzi testy.
  4. Wgląd do testów jednostkowych.
  5. Oraz osiągnięcia (do motywacji).

Rejestracje można połączyć z GitHub-em więc bardzo pragmatycznie. Reszta jest prosta wybiera się język na którym chce się praktykować…

I dodam na marginesie, że jest to chyba najlepszy sposób na poznawanie nowego języka lub przypominanie go sobie.

…i do dzieła. Zadania są dość jasne. Kompilacja kodu C# jest na Mono więc całkiem spoko. Większość zadań jest dla kilkunastu języków, więc jak się zrobi w jednym języku zadanie to można zrobić też w innym języku.

Możemy w łatwy sposób dołożyć swoje zadania i udostępnić je innym. Do każdego zadania jest proste forum i można sobie zajrzeć kto ma jakie przemyślenia.

Po pozytywnym przejściu wszystkich testów jednostkowych (i tylko wtedy), możemy podejrzeć inne rozwiązania dla danego jeżyka i zagłosować na najlepsze z nich. Czym bardziej skomplikowany algorytm tym większa różnorodność rozwiązań.

Minusy

Są tylko dwa. Po pierwsze czasem dokumentacja do zadania jest jakaś mglista i czasem trzeba z nią trochę spędzić czasu aby wiedzieć co należy zrobić. Po drugie czasem coś nie działa w testach. Aby zaliczyć zadanie trzeba prawidłowo przejść testy jednostkowe. Czasem, nie które testy nie spełniają założeń dokumentacji. Ale we wspomnianym forum, można założyć BUG-a i autor jak widziałem w większości zadań dość szybko odpowiada na problem.

Podusmowanie

Codzienne ćwiczenia z programowania w formie pisania tego samego kodu przydają się do zwiększania szybkości w tworzonych rozwiązaniach. Pomagają pozbyć się uczucia rezygnacji jak sobie myślimy ile się trzeba napisać kodu aby zrobić taką małą rzecz. Ćwiczenia w tworzeniu algorytmów pozwalają dotrzeć do esencji programowania i nie dać się zjeść przez niezliczone framewrok-i, przyspieszające prace. Mózg to też mięsień i też należny go ćwiczyć : )

Jeśli ktoś by się chciał zarejestrować to polecam zrobić to przez tego linka: www.codewars.com/r/nLuwjg. Dostanę osiągnięcie i będę bardzij zmotywowany : )

 

5 przemyśleń nt. „Praktyka czyni mistrza – katy dla C#

  1. We wszystkim praktyka czyni mistrza. Takie błędy co na początku przygody wydawały się nie do przejścia po czasie stają się banalne na, które nawet się nie zwraca uwagi.

  2. Temat dość kontrowersyjny. Craftsmanship jest różnie postrzegany, mi najbliżej do stwierdzenia, że ćwicząc codziennie chodzenie (każdy z nas to robi) o takiej samej intensywności nie zostajemy dobrymi biegaczami. Dlatego odradzam stosowanie ciągle tych samych kat na rzecz ciągłego zwiększania stopnia trudności. Oczywiście możliwe jest wykonanie kilkakrotnie tego samego zadania zmieniając język, podchodząc inaczej do problemu, lecz trzeba pilnować żeby nie wpaść w pisanie kodu wyłącznie z pamięci. Sceptyczny jestem też do pisania samych algorytmów, które często są wymyślone już przez kogoś innego, a my zostajemy z zaimplementowaniem czyjegoś pomysłu. Ja bym bardziej proponował wykonywanie kat podobnych do tego co robimy w pracy, ma to większy wpływ na szybkość wykonywania przez nas zadań niż zrobienie kolejnego algorytmu z którym więcej styczności mieć nie będziemy. Codewars jest o tyle fajne, że mamy całkiem sporo zadań i możemy wybrać to co nas interesuje, niestety poziom z 8 kyu to najczęściej napisanie 1 LINQ, na 4 kyu można spotkać się z implementacją automatów skończonych o 1 kyu z interpreterami czy kompilatorami nie wspominając. Według mnie w wykonywaniu katy chodzi o to by wykonać w miarę proste zadanie w sensownym czasie i skupić się na dopracowywaniu swoich umiejętności ale może to tylko moje odczucie i ktoś bardziej doświadczony ma wystarczającą wiedzę by pisać tego typu katy w miare sensownym czasie.

    1. Cześć, „przemekwa”. Po prawej stronie na blogu masz mojego „Profile Badges” z codewars. Pozdrawiam

  3. Pingback: dotnetomaniak.pl

Możliwość komentowania jest wyłączona.