Jakiś czas temu, postanowiłem się doszkolić ze znajomości algorytmów. Częściowo było to spowodowane tym, że na studiach miałem dosyć okrojone algorytmy (mieliśmy różne sortowania, różne sposoby podziału, ale do grafów już nie doszliśmy) i o ile przez długi czas ta wiedza była wystarczająca, z czasem jednak codility rosło w popularność. O ile obecnie swój "peak" zapewne ma już za sobą, to podczas przykładowej rozmowy kwalifikacyjnej lub zgłaszania swojego uczestnictwa do darmowego szkolenia lub hakatonu zawsze możemy zostać poproszeni o zakodowanie czegoś "na szybko".
Ten temat miałem w tyle głowy jako "TODO" już od wiosny 2015r, jednak wziąłem się za niego dopiero jesienią 2015. Na pocz. sygnałem był temat z tagiem #zadaniaBartosza na popularnym portalu społecznościowym wykop.pl. Jeden z użytkowników wziął przykładową książkę do algorytów i raz w tyg. publikował zadanie, które nast. pozostali użytkownicy rozwiązywali. Po kilku zadaniach użytkownikowi znudziła się cała zabawa, a i algorytmy jakie rozwiązywaliśmy pozostawiały nieco do życzenia. Ważne jest to, że dała mi impuls do tego, aby wreszcie wziąć się za ten temat.
Nast. postanowiłem wziąć się za algorytmy sam. I wziąć się za nie w dwójnasób, tj. za pomocą strony z algorytmami jaką znałem, tj. projecteuler.net oraz kupując książkę teoretyczną. Przy wyborze książki swój wybór oparłem na tym opisie: książki do nauki algorytmów, a ost. wybór padł na Wprowadzenie do algorytów.
Co mogę napisać o tych dwóch sposobach uczenia?
- project Euler to już jest bardzo stara strona, która posiada multum zagadek (ponad 200), jednak wiele z nich to problemy czysto matematyczne. Zaletą natomiast jest to, że istnieje wiele gotowych rozwiązań, wraz z zwyjaśnieniami zadań, tzn. najpierw możemy sami spróbować, a później znaleźć lepsze rozwiązanie z wytłumaczeniem dlaczego tak, a nie inaczej
- książka wyjaśnia pewne podstawy, wyjaśnia również coraz bardziej zaawansowane rzeczy, jednak jest strasznie duża (gruba) i pisana językiem matematycznym. Widać, że jest to podręcznik akademicki, co ma swoje zalety jak i wady.
Jeżeli ktoś nie chce wydawać pieniędzy aby kupować książkę, to po wykonaniu danego zadania, polecam mu zajrzeć np. na http://www.mathblog.dk/project-euler-solutions/, w którym autor dosyć dobrze opisuje dane zagadnienie, zarówno w kwestii podstaw teoretycznych, jak i dostarcza działający kod. Zazwyczaj dostarcza kilka rozwiązań, tłumaczy czym one się różnią oraz wyjaśnia brakujące podstawy teoretyczne. Polecam do nauki.
Uczyłem się z tego, aż do pewnej rozmowy z Michał Franc, która nieco odświeżyła moją wiedzę. Z tej rozmowy były dwa wnioski:
- algorytmy to tylko jeden z bardzo wielu elementów wymaganych wobec programisty i wcale nie trzeba ich mieć obcykanych na tip top, aby móc powiedzieć o sobie, że jesteśmy "pro"
- pokazał mi, że istnieje lepsza strona z zadaniami od projektu Euler, czyli https://leetcode.com/
Ost. strona, tj. leetcode.com, mimo iż spędziłem przy niej najmniej czasu ze wszystkich wymienionych tutaj projektów, wydaje mi się obecnie najlepsza do nauki. Problemy wydają się bardziej życiowe, choć mogło to być spowodowane tym, że Eulera brałem "od początku", a LeetCode losowo ze środka, a dodatkowo dostajemy do tego masę testów jednostkowych, które podają nam wynik. To właśnie te jawne testy mają największą przewagę ze wszystkich wymienionych tutaj rozwiązań.
Gdybym obecnie ponownie stawał do zadania "naucz się algorytmów" to uczył bym się ich z https://leetcode.com/
Ciekawostki:
- w trakcie pracy nad tym zadaniem, udało mi się też zostać kontrybutorem (współautorem) jednego z zadań w projekcie rosettacode.org, a dokładniej wersji C# problemu sumy największej ścieżki wewnątrz trójkąta Maximum_triangle_path_sum#C.23
- niektóre z rozwiązanych przezemnie zadań umieściłem na githubie. Wyjątkiem jest "leetcode", który posiada własny system pamiętania rozwiązań.
Pokazywanie postów oznaczonych etykietą programowanie. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą programowanie. Pokaż wszystkie posty
sobota, 5 marca 2016
sobota, 30 stycznia 2016
Programowanie funkcyjne z wykorzystaniem języka F#
Pierwszy raz styczność z językiem F# miałem około półtora roku temu, kiedy to Michał Łusiak zaprezentował nam ten język podczas spotkania WG.NET. To był mój pierwszy kontakt z tym językiem. Pewne elementy wydawały się być całkiem fajne, inne nieco dziwne, ale ogólne wrażenie nt. tego języka jakie odniosłem po tej prezentacji było takie, że Microsoft traktuje ten język jako swego rodzaju "piaskownicę" oraz "miejsce treningowe" podczas wprowadzania rozszerzeń do języka C#. Że to jednak C# ma pozostać głównym językiem, bądź co bądź korporacyjnej platformy, natomiast F# to ma być takie laboratorium stworzone dla tzw. "szalonych naukowców" oraz innych eksperymentatorów, którzy będą tworzyć nowe rozszerzenia języka oraz platformy. Jeżeli stworzą coś nowego i uda im się to skompilować do MSIL, a przy okazji nic nie wybuchnie, to wtedy wszelkie nowości będzie można zaadaptować do C#.
W międzyczasie, możliwe że nawet wcześniej, podczas jednego ze szkoleń nt. C# prowadzonego przez Comarch, autor szkolenia wyjawił, że osobiście jest fanem języków funkcyjnych, oraz że obecnie, bardzo dużo, albo niemal wszystko co znamy z języków funkcyjnych da się zrobić w Linq, tyle tylko, że zapis jest wtedy nieco dłuższy i bardziej pokręcony.
Wracając jednak do właściwego F#, kolejnym takim momentem, przemawiającym na jego korzyść był fakt, iż podczas konferencji Wroc# 2015 ten język, obok Angular.JS dostał jedną z sesji prezentacyjnych (wszystkich sesji było 6). To oznaczało, że coś się dzieje.
Prawdziwym przełomem w moim postrzeganiu tego języka, była jednak konferencja devday 2015, podczas której nie tylko były sesje z jezyka F#, a na korytarzach można było osobiście porozmawiać z samym Tomasem Petrickiem, który nomenomen zrobił z jednego z niewielu dostepnych stolików swoisty "F# Corner" ;-) Prawdziwym przełomowym momentem, to był fragment prezentacji Chada Fawlera, która stanowiła keynote tej konferencji:
Chad mówi tam m.in., aby w obecnych czasach zainteresować się 3 tematami:
- linux (z którego aktualnie tworze tego posta)
- mobile development (jesienią tego roku przerobiłem kurs na courserze z programowania na platformę Android)
- programowanie funkcyjne, o którym tutaj właśnie się rozpisuje.
Więc czym tak naprawdę jest język F# i jak się do niego zabrałem?
F# jest to język o funkcyjnym paradygmacie programowania, w odróżnieniu np. od C#, Javy, Pythona lub C++, które są językami o obiektowym paradygmacie programowania. F# jest też integralnym językiem platformy .NET, co oznacza, że jego kod źródłowy kompilowany jest do języka MSIL, a dopiero później przerabiany na kod maszynowy. Język ten ma też kilka innych ciekawostek, które postaram się wylistować:
Funkcyjny paradygmat programowania, to w porównaniu do obiektowego paradygmatu programowania nieco inne spojrzenie na te same problemy.
W przypadku programowania obiektowego, tworzymy klasy, jako definicję obiektów, w oparciu o które tworzymy obiekty. W tych obiektach "zamykamy" pewne dane, a nast. wykonujemy na nich pewne obiczenia. Mamy więc zbiory obiektów, każdy z nich wewnątrz ma swoje specyficzne dane, na których wykonuje obliczenia, często w sposób mniej lub bardziej tajny (tzw. enkapsulacja), a nast. operujemy na danych wynikowych wychodzących z tych obiektów.
W przypadku programowania funkcyjnego mamy do czynienia z innym podejściem. Tutaj nie mamy typowych klas przedstawiających obiekty. Mamy za to funkcje, które przyjmują pewne wartości i które zwracają wyniki. Do tego mamy kilka typów kolekcji i... operujemy na danych z tych kolekcji za pomocą tworzonych funkcji. Jeżeli trzeba, to w naszych funkcjach, wykorzystujemy inne funkcje, w których możemy wykorzystywać kolejne funkcje itd. Oczywiście istnieje kilka typów kolekcji, różniących się od siebie właściwościami (np. sekwencje z definicji obsługują "lazy loading", natomiast Sety bazują na drzewie binarnym), jak i kilka typów kluczowych (np. rec sprawiających, że dana funkcja jest funkcją rekurencyjną).
Skąd czerpałem wiedzę?
Postanowiłem połączyć teorię z praktyką czyli:
Po tym nieco przydługim wstępnie, teraz czas na to, co tygryski lubią najbardziej, czyli konkluzje, czyli wnioski.
Reasumując, temat warty uwagi śledzenia. O ile obecnie jest zauważalny "hype" na konferencjach oraz grupach programistycznych, jednak jak na razie nie przekłada się to na ilość ofert pracy dla ludzi umiejących F#. W sumie najbardziej popularnym obecnie jezykiem funkcyjnym jest w polsce Scala, jednak tak naprawdę, ten język to takie "niewiadomo co", a z całą pewnością nie można go nazwać językiem typowo funkcyjnym. Z drugiej strony, od czasu rozpropagowania modelu aktorów do języków obiektowych, częściowo otwarta została pewna "nisza" wykorzystywana wcześniej jedynie przez języki funkcyjne.
Jak to się wszystko potoczy? Myślę, że bardzo dużo zależy od tego, czy będą się pojawiały ogłoszenia o pracę w tym konkretnym języku, zarówno pod względem ich ilości jak i jakości. W każdym bądź razie zamierzam temat bacznie obserwować, przynajmniej jeszcze przez jakiś czas :-)
W międzyczasie, możliwe że nawet wcześniej, podczas jednego ze szkoleń nt. C# prowadzonego przez Comarch, autor szkolenia wyjawił, że osobiście jest fanem języków funkcyjnych, oraz że obecnie, bardzo dużo, albo niemal wszystko co znamy z języków funkcyjnych da się zrobić w Linq, tyle tylko, że zapis jest wtedy nieco dłuższy i bardziej pokręcony.
Wracając jednak do właściwego F#, kolejnym takim momentem, przemawiającym na jego korzyść był fakt, iż podczas konferencji Wroc# 2015 ten język, obok Angular.JS dostał jedną z sesji prezentacyjnych (wszystkich sesji było 6). To oznaczało, że coś się dzieje.
Prawdziwym przełomem w moim postrzeganiu tego języka, była jednak konferencja devday 2015, podczas której nie tylko były sesje z jezyka F#, a na korytarzach można było osobiście porozmawiać z samym Tomasem Petrickiem, który nomenomen zrobił z jednego z niewielu dostepnych stolików swoisty "F# Corner" ;-) Prawdziwym przełomowym momentem, to był fragment prezentacji Chada Fawlera, która stanowiła keynote tej konferencji:
Chad mówi tam m.in., aby w obecnych czasach zainteresować się 3 tematami:
- linux (z którego aktualnie tworze tego posta)
- mobile development (jesienią tego roku przerobiłem kurs na courserze z programowania na platformę Android)
- programowanie funkcyjne, o którym tutaj właśnie się rozpisuje.
Więc czym tak naprawdę jest język F# i jak się do niego zabrałem?
F# jest to język o funkcyjnym paradygmacie programowania, w odróżnieniu np. od C#, Javy, Pythona lub C++, które są językami o obiektowym paradygmacie programowania. F# jest też integralnym językiem platformy .NET, co oznacza, że jego kod źródłowy kompilowany jest do języka MSIL, a dopiero później przerabiany na kod maszynowy. Język ten ma też kilka innych ciekawostek, które postaram się wylistować:
- język funkcyjny (funkcyjny paradygmat programowania)
- język kodu pośredniego platformy .NET
- dopuszcza mix z kodem źródłowym innego języka .NET (przez co dopuszczalne jest korzystanie z bibliotek standardowych platformy .NET lub tworzenie projketów będących swoistymi mieszańcami C# oraz F#).
- brak dynamicznego mapowania typów, co czasami bywa irytujące
- wszystkie zmienne z definicji są stałe i niezmienne, ale możliwe jest tworzenie klasycznych zmiennych (poprzed dodanie słowa kluczowego "mutable"). Ma to na celu tworzenie ułatwienie rozwiązań pracujących w trybie zrównoleglonym (wielowątkowym)
- "model aktorów", zwany tutaj "mailbox agent", znany m.in. z biblioteki "Akka" oraz "Akka.net" jest tutaj wbudowany jako naturalny element składowy jezyka
- open source - język jest w pełni otwarty i oficjalnie tworzony przez społeczność, choć część jego twórców dostaje za pracę nad projektem wypłatę z Microsoftu
- hierarchia plików w solucji ma znaczenie (w odróżnieniu np. od C#, gdzie nie ma to znaczenia)
Funkcyjny paradygmat programowania, to w porównaniu do obiektowego paradygmatu programowania nieco inne spojrzenie na te same problemy.
W przypadku programowania obiektowego, tworzymy klasy, jako definicję obiektów, w oparciu o które tworzymy obiekty. W tych obiektach "zamykamy" pewne dane, a nast. wykonujemy na nich pewne obiczenia. Mamy więc zbiory obiektów, każdy z nich wewnątrz ma swoje specyficzne dane, na których wykonuje obliczenia, często w sposób mniej lub bardziej tajny (tzw. enkapsulacja), a nast. operujemy na danych wynikowych wychodzących z tych obiektów.
W przypadku programowania funkcyjnego mamy do czynienia z innym podejściem. Tutaj nie mamy typowych klas przedstawiających obiekty. Mamy za to funkcje, które przyjmują pewne wartości i które zwracają wyniki. Do tego mamy kilka typów kolekcji i... operujemy na danych z tych kolekcji za pomocą tworzonych funkcji. Jeżeli trzeba, to w naszych funkcjach, wykorzystujemy inne funkcje, w których możemy wykorzystywać kolejne funkcje itd. Oczywiście istnieje kilka typów kolekcji, różniących się od siebie właściwościami (np. sekwencje z definicji obsługują "lazy loading", natomiast Sety bazują na drzewie binarnym), jak i kilka typów kluczowych (np. rec sprawiających, że dana funkcja jest funkcją rekurencyjną).
Skąd czerpałem wiedzę?
Postanowiłem połączyć teorię z praktyką czyli:
- Jako teorię czytałem książkę "F# for Quantitative Finance (Johan Astborg)", która ma raczej średnie opinie w necie, ale z uwagi, że wpadła w moje ręce za darmo podczas jednej z promocji na "Pact Publishing" to postanowiłem ja przeczytać i czegoś się z niej nauczyć.
- Jako praktykę, postanowiłem wykonać przynajmniej 10 zadań z Project Euler. Jak mi poszło, można sprawdzić na w odp. projekcie, na moim koncie na githubie.
- Połączenie jednego z drugim, czyli forum stackoverflow
Po tym nieco przydługim wstępnie, teraz czas na to, co tygryski lubią najbardziej, czyli konkluzje, czyli wnioski.
- czytając opis języka w książce myślałem sobie, niby spoko
- do czasu, aż zacząłem to programować samemu, wtedy co rusz napotykałem na dziwne błędy oraz zmuszenie mnie do zmiany sposobu myślenia
- o ile pierwsze zadania z projektu euler były stosunkowo proste (przydała się praktyka w stos. linq oraz przykłady z książki, to im dalej w las tym trudniej)
- sporo problemów i frustracji, szczególnie podczas pracy z pętlami przytrafił mi typ danych unit. Ponieważ jest on bardzo podobny do uint, na początku te typy mi się myliły, szczególnie, że F# nie pozwala na dynamiczną zmianę typów. Tworzyłem więc pętle, które z jakiegoś powodu w którymś momencie zwracały unit (brak wartości), natomiast mi się wydawało, że wraz z którąć iterecją, z nieznanego mi powodu zwracają one typ uint i mam problem z mapowaniem i porównywaniem typów.
- pętle w F# nie są typowymi "pętlami" tylko "wyrażeniami" lub "wyrażeniami wyższego rzędu", co oznacza, że nie posiadają typowego "break-a". Nie możemy w dowolnym momencie, ot tak sobie wyjść z pętli przerywając jej działanie, tylko musimy ją ładnie "zamknąć", tudzieź pozwolić aby wszystko się wykonało tak jak należy
- sposobem, aby pętle nie trwały nieskończenie wiele, albo nie robiły zbyt dużo "pustych przelotów", jest zastosowanie sekwencji z ich "lazy loading", oraz słowa kluczowego "yield". Bardzo ładnie obrazuje to przykład rozwiązania problemu nr.9 https://github.com/zchpit/ProjectEuler/blob/master/F%23/ProjectEulerInF%23/ProjectEulerInF%23/Problem9.fs
- kod napisany w F# zazwyczaj jest krótszy i bardziej "elegancki" niż w porównaniu do tradycjnej wersji C#
- kod przynajmniej w teorii dużo łatwiej powinno się dać skalować (wielowątkowość)
- choć nie wiem, jak wygląda kwestia jego wydajności względem C#
- Chad Fowler zachęcał do nauki języków funkcyjnych, widząc w tym przyszłość
- jednak ilość obecnych ogłoszeń o pracę na popularnych portalach z pracą (w PL) na chwilę obecną jakoś specjalnie do tego nie zachęca
- rozmawiając nt. temat z managerem jednej z firm deweloperskich, usłyszałem odp., że na razie to jest raczej nowość i nie ma na rynku zbyt dużo os., więc ewentualna zasępowalność jest niewielka i co za tym idzie na chwilę obecna bardziej ceniona jest dla nich chęć uniknięcia tzw. "Bus factor" niż "innowacyjność".
- z drugiej strony, to natywne wsparcie dla programowania rozproszonego oraz wielowątkowego kusi, oj kusi :D
Reasumując, temat warty uwagi śledzenia. O ile obecnie jest zauważalny "hype" na konferencjach oraz grupach programistycznych, jednak jak na razie nie przekłada się to na ilość ofert pracy dla ludzi umiejących F#. W sumie najbardziej popularnym obecnie jezykiem funkcyjnym jest w polsce Scala, jednak tak naprawdę, ten język to takie "niewiadomo co", a z całą pewnością nie można go nazwać językiem typowo funkcyjnym. Z drugiej strony, od czasu rozpropagowania modelu aktorów do języków obiektowych, częściowo otwarta została pewna "nisza" wykorzystywana wcześniej jedynie przez języki funkcyjne.
Jak to się wszystko potoczy? Myślę, że bardzo dużo zależy od tego, czy będą się pojawiały ogłoszenia o pracę w tym konkretnym języku, zarówno pod względem ich ilości jak i jakości. W każdym bądź razie zamierzam temat bacznie obserwować, przynajmniej jeszcze przez jakiś czas :-)
piątek, 1 stycznia 2016
e-learning, pluralsight.com vs coursera.org
W tym wpisie postaram się opisać moje przemyślenia, nt. dwóch platform elearningowych, z których miałem okazję korzystać ost. jesieni.
Pierwszą platformą, z której skorzystałem jest to pluralsight.com.
Platforma dostarcza dwie opcje dostępu, tj. "standard" ograniczoną do oglądania filmów video, oraz "plus", w którórej dostępne są również ćwiczenia, sprawdzenia wiedzy oraz certyfikaty.
Standardowo, każdy może skorzystać z "free trail", dzięki któremu, możemy skorzystać z 10dni/200min darmowego dostępu. Dzięki uprzejmości Pawła Klimczyka miałem dostęp miesięczny dostęp do platformy za pomocą kodu promocyjnego.
Podczas mojej obecności na platformie, korzystałem z dostępu standard i obejrzałem dwa materiały szkoleniowe, jeden związany z Angular.js, oraz drugi, z językiem Scala. To na co zwróciłem uwagę, to spora ilość materiałów szkoleniowych, oraz wysoki poziom prezentowanych materiałów. Podczas kursu angular.js autor wykorzystywał plunkera, natomiast w prezentacji nt. języka scala autor pierwsze co zrobił, to postawił sobie środowisko z automatycznym testowaniem testów jednostkowych podczas pisania kodu oprogramowania. W środkowisku .net za podobną funkcjonalność odpowiada płatny plug-in do VS o nazwie NCrunch.
Kursy mi się podobały, można się było sporo nauczyć od profesionalistów, jednak wesja standard to jest jednak zdecydowanie za mało. Cały materiał pojedyńczego kursu podzielony jest na kilka półgodzinnych części. Nie wiem jak inni, ale u mnie, podczas oglądania półgodzinnego materiału z czasem spadało skupienie. Samo oglądanie, to jednak za mało. Zapewne dużo lepiej sprawdziła by sie wersja "plus", w której jest więcej ćwiczeń do samodzielnego opracowania tematu.
Warto też wspomnieć, że plularsight się rozwija i zakupił inne, podobne serwisy, takie jak np. codeschool.com ,który bardzo polubiłem swego czasu, jednak w momencie, kiedy testowałem ten serwis, to konta oraz płatności pomiędzy tymi serwisami nie były zintegrowane.
Drugą platformą do elearningu, którą miałem okazję ost. przetestować jest www.coursera.org.
Coursera, to platforma oparta o uczelnie wyższe, tj. renomowane uczelnie na codzień zajmujące się kształceniem studentów. Warto wspomnieć, ze w projekcie coursery można znaleźć takie uczelnie jak m.in. słynne MIT.
Coursera oferuje ścieżki nauki, w których znajdują się kursy, z różnymi dziedzinami danego zagadnienia prowadzone przez różne uczelnie. Każdy kurs składa się z 4 tygodni nauki. W każdym tyg. mamy część video z teorią, test wiedzy oraz kilka zadań praktycznych, które musimy wykonać samodzielnie, a nast. przesłać na uczelnię. Na każdym tyg. mamy deadline, w którym musimy się zmieścić z wykonaniem swoich zadań. Deadliny są dwa. Jeżeli wyrobimy się w pierwszym to ok, jeżeli jednak się z nim nie wyrobimy, to za każdy dzień zwłoki tracimy 5% punktów za odp. Nieryrobienie się w drugim deadline oznacza niezaliczenie zadania. W wersji płatnej możliwe są oficjalne certyfikaty wydawane przez uczelnie.
W moim przypadku był to kurs programowania urządzeń mobilnych w języku java na platformę Andrid prowadzony przez University of Maryland, College Park. To co warte jest wspomnienia, to fakt, że podczas oglądania materiałow wideo, średnio co 3-5 min. była pauza z 1-3 pytań nt. omawianego materiału (pomaga w skupieniu się na omawianym materiale), oraz fakt, iż prowadzący od samego początku pokazuje, w których miejscach należy szukać informacji (linki do dokumentacji platformy, lokalnych grup użytkoników, forum stackoverflow.com, itp.).
Bardzo fajny sposób nauki, który wymaga od ucznia, zarówno poznania teorii, samodzielnej pracy z kodem, jak i pracy na dokumentacji.
Główną wadą, jaką zauważyłem odnośnie coursery jest stosunkowo mała ilość dostępnych kursów / ścieżek. Np. szukałem ścieżki z programowania funkcyjnego i niestety niemogłem nic znaleźć.
Podsumowanie:
Obie platformy są bardzo fajne.
W plularsight podobała mi się ilość dostępnych materiałów oraz profesionalne podejście prowadzących. Widać, że mamy do czynienia z zawodowcami, którzy od samego początku uczą "dobrych praktyk". Główną wadą tej wersji, z której korzystałem była zaby mała interakcja pomiędzy prowadzącym a prowadzonym. W wersji standard brakowało tego "learn by doing". Możliwe, że w wersji "plus" te mankamenty zostały poprawione, jednak nie wiem czy stoją ona na tak wysokim poziomie, jak w courserze.
W courserze podobało mi się połączenie wykładów (materiały wideo), pracy na dokumentacji (testy na zaliczenie) oraz prac domowych z kodem (przygotowane wcześniej aplikacje, które trzeba nieco przerobić, aby zaczęły pracować tak jak chcemy). Główną wadą coursery jest dostępna ilość materiałów, oraz ich aktualność. Kurs, który ja przechodziłem miał już dobre 1.5 roku, więc zdąćył się już nieco zestarzeć poprawny kod programu działał tylko na emulatorach (maszynach wirtualnych) tylko niektórych androidów.
Co bym polecił?
Gdybym samemu miał wydawać własne pieniądze, to:
a) jeżeli ktoś nie ma żadnego doświadczenia, lub jest dopiero początkujący w jakiejś technologii, to dla takiej osoby polecił bym zacząć od wykonania pełnej ścieżki (6 kursów) na courserze. Zostanie ładnie oprowadzony po danej technologii, pozna jej różne aspekty, dzięki czemu będzie posiadał solidne podstawy.
b) jeżeli jednak ktoś ma podstawy i miał już okazję pracować w danej technologii, a chciałby jedynie podnieść swój poziom, tudzież się "doszkolić" w najnowszych trendach, to dla takich osób polecił bym plularsight.
Pierwszą platformą, z której skorzystałem jest to pluralsight.com.
Platforma dostarcza dwie opcje dostępu, tj. "standard" ograniczoną do oglądania filmów video, oraz "plus", w którórej dostępne są również ćwiczenia, sprawdzenia wiedzy oraz certyfikaty.
Standardowo, każdy może skorzystać z "free trail", dzięki któremu, możemy skorzystać z 10dni/200min darmowego dostępu. Dzięki uprzejmości Pawła Klimczyka miałem dostęp miesięczny dostęp do platformy za pomocą kodu promocyjnego.
Podczas mojej obecności na platformie, korzystałem z dostępu standard i obejrzałem dwa materiały szkoleniowe, jeden związany z Angular.js, oraz drugi, z językiem Scala. To na co zwróciłem uwagę, to spora ilość materiałów szkoleniowych, oraz wysoki poziom prezentowanych materiałów. Podczas kursu angular.js autor wykorzystywał plunkera, natomiast w prezentacji nt. języka scala autor pierwsze co zrobił, to postawił sobie środowisko z automatycznym testowaniem testów jednostkowych podczas pisania kodu oprogramowania. W środkowisku .net za podobną funkcjonalność odpowiada płatny plug-in do VS o nazwie NCrunch.
Kursy mi się podobały, można się było sporo nauczyć od profesionalistów, jednak wesja standard to jest jednak zdecydowanie za mało. Cały materiał pojedyńczego kursu podzielony jest na kilka półgodzinnych części. Nie wiem jak inni, ale u mnie, podczas oglądania półgodzinnego materiału z czasem spadało skupienie. Samo oglądanie, to jednak za mało. Zapewne dużo lepiej sprawdziła by sie wersja "plus", w której jest więcej ćwiczeń do samodzielnego opracowania tematu.
Warto też wspomnieć, że plularsight się rozwija i zakupił inne, podobne serwisy, takie jak np. codeschool.com ,który bardzo polubiłem swego czasu, jednak w momencie, kiedy testowałem ten serwis, to konta oraz płatności pomiędzy tymi serwisami nie były zintegrowane.
Drugą platformą do elearningu, którą miałem okazję ost. przetestować jest www.coursera.org.
Coursera, to platforma oparta o uczelnie wyższe, tj. renomowane uczelnie na codzień zajmujące się kształceniem studentów. Warto wspomnieć, ze w projekcie coursery można znaleźć takie uczelnie jak m.in. słynne MIT.
Coursera oferuje ścieżki nauki, w których znajdują się kursy, z różnymi dziedzinami danego zagadnienia prowadzone przez różne uczelnie. Każdy kurs składa się z 4 tygodni nauki. W każdym tyg. mamy część video z teorią, test wiedzy oraz kilka zadań praktycznych, które musimy wykonać samodzielnie, a nast. przesłać na uczelnię. Na każdym tyg. mamy deadline, w którym musimy się zmieścić z wykonaniem swoich zadań. Deadliny są dwa. Jeżeli wyrobimy się w pierwszym to ok, jeżeli jednak się z nim nie wyrobimy, to za każdy dzień zwłoki tracimy 5% punktów za odp. Nieryrobienie się w drugim deadline oznacza niezaliczenie zadania. W wersji płatnej możliwe są oficjalne certyfikaty wydawane przez uczelnie.
W moim przypadku był to kurs programowania urządzeń mobilnych w języku java na platformę Andrid prowadzony przez University of Maryland, College Park. To co warte jest wspomnienia, to fakt, że podczas oglądania materiałow wideo, średnio co 3-5 min. była pauza z 1-3 pytań nt. omawianego materiału (pomaga w skupieniu się na omawianym materiale), oraz fakt, iż prowadzący od samego początku pokazuje, w których miejscach należy szukać informacji (linki do dokumentacji platformy, lokalnych grup użytkoników, forum stackoverflow.com, itp.).
Bardzo fajny sposób nauki, który wymaga od ucznia, zarówno poznania teorii, samodzielnej pracy z kodem, jak i pracy na dokumentacji.
Główną wadą, jaką zauważyłem odnośnie coursery jest stosunkowo mała ilość dostępnych kursów / ścieżek. Np. szukałem ścieżki z programowania funkcyjnego i niestety niemogłem nic znaleźć.
Podsumowanie:
Obie platformy są bardzo fajne.
W plularsight podobała mi się ilość dostępnych materiałów oraz profesionalne podejście prowadzących. Widać, że mamy do czynienia z zawodowcami, którzy od samego początku uczą "dobrych praktyk". Główną wadą tej wersji, z której korzystałem była zaby mała interakcja pomiędzy prowadzącym a prowadzonym. W wersji standard brakowało tego "learn by doing". Możliwe, że w wersji "plus" te mankamenty zostały poprawione, jednak nie wiem czy stoją ona na tak wysokim poziomie, jak w courserze.
W courserze podobało mi się połączenie wykładów (materiały wideo), pracy na dokumentacji (testy na zaliczenie) oraz prac domowych z kodem (przygotowane wcześniej aplikacje, które trzeba nieco przerobić, aby zaczęły pracować tak jak chcemy). Główną wadą coursery jest dostępna ilość materiałów, oraz ich aktualność. Kurs, który ja przechodziłem miał już dobre 1.5 roku, więc zdąćył się już nieco zestarzeć poprawny kod programu działał tylko na emulatorach (maszynach wirtualnych) tylko niektórych androidów.
Co bym polecił?
Gdybym samemu miał wydawać własne pieniądze, to:
a) jeżeli ktoś nie ma żadnego doświadczenia, lub jest dopiero początkujący w jakiejś technologii, to dla takiej osoby polecił bym zacząć od wykonania pełnej ścieżki (6 kursów) na courserze. Zostanie ładnie oprowadzony po danej technologii, pozna jej różne aspekty, dzięki czemu będzie posiadał solidne podstawy.
b) jeżeli jednak ktoś ma podstawy i miał już okazję pracować w danej technologii, a chciałby jedynie podnieść swój poziom, tudzież się "doszkolić" w najnowszych trendach, to dla takich osób polecił bym plularsight.
sobota, 11 kwietnia 2015
Recenzja - "Adaptive Code via C# - Agile coding with design patterns and SOLID principles" -> Gary McLead Hall
Na tą książkę zwróciłem uwagę, dzięki pytaniu K.Cebuli na naszej grupie na portalu www.facebook.com. To był chyba grudzień 2014r. i akurat amazon.com miał promocję na tą książkę. Recenzje miała dobre, wydawcę również (Microsoft), a tytuł brzmiał zachęcająco. Kupiłem więc tą książkę w formie ebooka, załadowałem na mojego kindla i w wolnym czasie ją sobie "trawiłem".
Cóż mogę napisać o samej książce?
Pierwszy rozdział, to głównie Agile oraz szczegółowe omówienie metodologii SCRUM. Przy okazji wspomniane jest też jak ważną rolę odgrywają w "zwinnym podejściu" takie elementy jak zależności, interfejsy oraz testy jednostkowe.
W tym rozdziale autor opisał też, dlaczego powinniśmy unikać pewnych elementów języka, takich jak m.in. extension method czy używanie słówka "new".
Porównał to do używania korzystania z dżwigu (skyhook) oraz windy (lift). Obie mogą posłużyć do wejścia na dach budynku, jednak windy są dużo bezpieczniejsze i dużo lepiej sprawdzają się "długoterminowo".
Drugi rozdział, to szczegółowe omówienie zasad SOLID. Tutaj autorowi należą się dodatkowe podziękowania, z uwagi na bardzo dobre tłumaczenie tematu oraz wplecenie w te rozdziały wzorców projektowych. Autor wspomniał o GoF, o tym, że przez lata pewne wzorce stały się kanonem, a inne antywzorcami i... wszystko demonstruje na przykładach. Bardzo dobra robota.
Trzeci rozdział, to próba połączenia dwóch pierwszych rozdziałów na przykładzie niewielkiego zespołu oraz przykładowego zadania. Mamy tutaj rozmowy projektowe, szacowanie kosztów oraz... samo kodowanie ;-)
Napisałem po krótce, o czym jest ta książka, ale... teraz najważniejsze pytanie. Czy warto? Osobiście uważam że tak. Uważam, że ta książka jest bardzo dobra, zarówno pod względem technicznym, jak i samego sposobu jej napisania. Uważam również, że każdy szanujący się developer powinien ja przeczytać (a przynajmniej prawie cały 1 i cały drugi rozdział). Dodatkowo uważam, że książka GoF jest już na tyle stara i ciężko napisana (trudno się ją czyta), że... powinna odejść do lamusa i to właśnie "Adaptive Code via C# - Agile coding with design patterns and SOLID principles" powinna zająć jej miejsce.
Cóż mogę napisać o samej książce?
Pierwszy rozdział, to głównie Agile oraz szczegółowe omówienie metodologii SCRUM. Przy okazji wspomniane jest też jak ważną rolę odgrywają w "zwinnym podejściu" takie elementy jak zależności, interfejsy oraz testy jednostkowe.
W tym rozdziale autor opisał też, dlaczego powinniśmy unikać pewnych elementów języka, takich jak m.in. extension method czy używanie słówka "new".
Porównał to do używania korzystania z dżwigu (skyhook) oraz windy (lift). Obie mogą posłużyć do wejścia na dach budynku, jednak windy są dużo bezpieczniejsze i dużo lepiej sprawdzają się "długoterminowo".
Drugi rozdział, to szczegółowe omówienie zasad SOLID. Tutaj autorowi należą się dodatkowe podziękowania, z uwagi na bardzo dobre tłumaczenie tematu oraz wplecenie w te rozdziały wzorców projektowych. Autor wspomniał o GoF, o tym, że przez lata pewne wzorce stały się kanonem, a inne antywzorcami i... wszystko demonstruje na przykładach. Bardzo dobra robota.
Trzeci rozdział, to próba połączenia dwóch pierwszych rozdziałów na przykładzie niewielkiego zespołu oraz przykładowego zadania. Mamy tutaj rozmowy projektowe, szacowanie kosztów oraz... samo kodowanie ;-)
Napisałem po krótce, o czym jest ta książka, ale... teraz najważniejsze pytanie. Czy warto? Osobiście uważam że tak. Uważam, że ta książka jest bardzo dobra, zarówno pod względem technicznym, jak i samego sposobu jej napisania. Uważam również, że każdy szanujący się developer powinien ja przeczytać (a przynajmniej prawie cały 1 i cały drugi rozdział). Dodatkowo uważam, że książka GoF jest już na tyle stara i ciężko napisana (trudno się ją czyta), że... powinna odejść do lamusa i to właśnie "Adaptive Code via C# - Agile coding with design patterns and SOLID principles" powinna zająć jej miejsce.
sobota, 14 marca 2015
Wroc# (wrażenia nt. konferencji)
O konferencji Wroc# dowiedziałem się na początku stycznia z dwóch mniej lub bardziej niezależnych źródeł. Najpierw, informację podał gutek na naszej grupie programistycznej na portalu facebook.com. Kilka dni później, podobne info na liście mailingowej lider wg.net Michał Grzegorzewski. W sumie to nie wiem, kto póścił info, ale stwierdziłem, ze może warto by się było tym eventem zainteresować. Zanim podjąłem odp. decyzję, to... już Michał podał info na grupie, że limit biletów, dla członków grupy już został wyczerpany. W międzyczasie, przejrzałem listę gości... i zrobiło się grubo :D W tym momencie wiedziałem, że chce się tam znaleźć :)
Teoretycznie, pozostało czekać, i dostać bilet z "puli otwartej", jednak pomny doświadczeń, z takimi losowaniami z 2 ost. imprez, na których chciałem się pojawić, tj. devday.pl/ i 2014.confitura.pl/ w przypadku których bilety rozeszły się w mniej niż 5 min. postanowiłem... wypełnić formularz kontaktowy, który znalazłem na oficjalnej stronie konferencji. Wpisałem, tam kim jestem i... dlaczego chciałbym się znaleźć na tej konferencji i... miałem nosa. W odpowiedzi na moją wiadomość, dostałem darmowy bilet na konferencję, a... kilka dni później ruszyły oficjalne zapisy, podczas których wejściówki rozeszły się w... 3 min :)
W międzyczasie okazało się, że dzień wcześniej szykuje się "grube" spotkanie Wrocławskiej grupy .NET. Pomny, jak to wyglądało wcześniej w przypadku Krakowskiego DevDays, przyjechałem do Wrocławia dzień wcześniej. I się nie zawiodłem. Spotkanie odbyło się w knajpie na Włodkowica 21 link do www.meetup.com, na którym zjawiło się naprawdę sporo devów, odbyły się 3 prelekcje nt. CQRS, podczas którego, darmowe piwo zapewniało nam pgs-soft.com.
Spotkanie fajne, podczas którego można się było poznać, porozmawiać, czegoś nauczyć, oraz wymienić poglądy nt. różnych technologii. Ja np. dostałem odp. na jedno z nurtujących mnie pyt. nt. simpledata., jak i była okazja do rozmów o własnych przemyślaniach nt. przyszłości różnych technologii.
Właściwa konferencja zaczęła się czwartek na Hali Stulecia we Wrocławiu. Na pocz. krótka rejestracja, tj. odchaczenie na liście gości po czym... dostajemy garść suwenirów. Już na samym początku konferencji, miłym zaskoczeniem był fakt, że... każdy dostał smycz z agendą oraz dyskietką 3,5 cala z własnym imieniem/nazwą jako identyfikatorem :D Zajebisty pomysł. Patrząc na tą dyskietkę, przypomniały mi się czasy dzieciństwa, kiedy jako 12-14 letni maluch żąglowałem takimi dyskietkami w naszym Atarii 500 :D
Oczywiście gadżetów było więcej, ale tamte wymienię na koniec mojego wpisu.
Więc mam już swój identyfikator, kurtka wylądowała w szatni, to wchodzę na salę. Akurat na sali przemawiał ktoś ważny z www.objectivity.pl/. Zrobiłem sobie kawę (stoły z napojami do wyboru do koloru stały przy jednym z boków sali) i usiadłem na jakimś randomowym krzesełku. Pierwsze co się rzucało, to piękny angielski os. przemawiającej. Od razu człowiek wiedział, że ma do czynienia z jakimś "native speakerem", w dodatku z top managmenu (kto był w Anglii, ten wie, że tzw. "Cambridge English" posługuje się tylko elita). Przemówienie było o tym, że... grupa devów chciała zorganizować konferencję, ściągnąć kogoś fajnego, na pocz. miało to być coś małego, ale... w trakcie jak to organizowali to im się ta konferencja ciągle rozrastała (i koszty również), ale postanowili przyjać to "na klatę". Miło z jego/ich strony ;)
Razem z gadżetami, dostaliśmy też do wypełnienia kartkę, z sesjami i uwagami, jako "feedback", więc dostusuje się z moją opinią, do wymienionej tam skali oceny prezentacji, tj.: zielonej, żółtej, czerwonej.
Christian Heilmann - "Innovating the outer web":
Całkiem ciekawy człowiek, związany ze środowiskiem "Open Source", który przez pewien czas pracował w fundacji Mozilli, cały czas walcząc z IE8 i... pewnego dnia stwierdził, że jeżeli naprawdę chce się wyeliminować z rynku IE8 to... należy się zatrudnić w Microsofcie i... wyelimować tą przeglądarkę z rynku "od środka" ;) Tak też zrobił i obecnie zmienia Microsoft, a dokładniej ich dział webowy od środka. Temat prezentacji, natomiast dot. stron... firmowych, rządowych, ale również tych będących często za firmowymi intranetami. To też jest web, a w wielu tych miejscach obowiązkową przeglądarką jest właśnie IE. I to od nas zależy, jaki ten "inny" web będzie i ile w nim będzie innowacji. Co ważne, Christian podał linka do strony QA w MS: (making-it-easier-for-enterprise-customers-to-upgrade-to-internet-explorer-11-and-windows-10.)
Wspominał też, o nowych przeglądarkach tworzonych przez MS i ich konfigurowaniu.
Ocena: Zielono mi, czyli mi się prezentacja podobała.
Matt Elis - "Litle changes to make your app a lot faster"
Prezentacja mocno techniczna i całkiem przyjemna. Matt pokazał, różne konstrukcje języka oraz sposób ich działania "od środka". Pomijając proste rzeczy, typu "unikać" jawnych i niejawnych mapować na "object" (lepiej używać generyków lub przekazując int do "string.Format" ręcznie wykonać metodę "toString()" (kompilator domyślnie najpierw zrzutuje nam int -> object -> string), a iterując na listach i kolekcjach o ile potrafimy przewidzieć ich długość (np. stosując foreach) to warto jawnie zadeklarować ich wielkość w kontruktorze (fajny, miły bajer), to... uderzył też w nowości języka C# 3.0, czyli... IEnumerable i LINQ. Buuu. Ja lubię linq i IEnumerable. W sumie domyślałem się, że to może działać wolniej niż typowa pętla for, a teraz już wiem dlaczego :) Jak coś ma być szybkie, to omijamy linq, IEnumerable i... klepiemy własne pętle for, niczym w C++ :/
Ocena: Prezentacja godna obejrzenia przez każdego programistę, czyli Zielono
Mark Seemann - "Type-Driven Development"
Sesja o F#, typach, i sposobie rozwiązywania problemów. Mark zrobił krótki wstęp o językach programowania, później przedstawił problem biznesowy, oraz pokazał swój sposób rozwiązania tego problemu w F#. Nie znam się na F#, ale sposób mówienia był lekko "senny", a kody które pokazywał Mark z tylnych krzeseł słabo widoczne (siedziałem w ost. rzędzie). Mark próbował "kalibrować" wielkość kodu, ale nie do końca mu to wychodziło i w konsekwencji moim głównym moim zadaniem podczas tej prelekcji było "jak by tu nie zasnąć". Zapewne problem przedstawiony przez Marka był fajny, dodatkowo na plus, że w swojej prezentacji poruszył realne zagadnienia i realne rozwiązania, jednak... sposób mówienia, oraz sposób prezentowania tej prezentacji nie do końca przypadł mi do gustu.
Ocena: żółto, (nie czerwono, bo jednak realne problemy, nie zielono, bo gdyby krzesełka były wygodniejsze, to bym tam usnął)
Lunch: Obiadek, obiadek. Aby być fair, to trzeba przyznać, że po każdej prezentacji była krótka przerwa na kawę i przekąski, które były smaczne i których było pod dostatkiem (cały czas przynoszone były nowe). Do tego, po sesji Marka była sesja obiadowa, a przed panelem dyskusyjnym piwo/wino/drinki (ale o tym później).
Ocena: zieleń ;)
Dan North - "O, Programmer"
Dan w swojej prezentacji opisywał zmieniające się role i wymagania, jakie stały przed programistami na przestrzeni lat, oraz jak to wygląda obecnie. Na początku kilka fajnych, śmiesznych obrazków (np. Pair programming, ludzi wspólnie oglądających "karty perforowane" itp. ;)). Później przeszedł do czasów współczesnych. Mi ta sesja bardzo przypominała materiał zamieszczony w 2 książkach nt. etyki pracy programistów, tj. pragmatyczny programista oraz mistrz czystego kodu-kodeks postepowania profesjonalnych programistow, za to, dla kilku chłopaków, którzy siedzieli obok mnie, to było "WOW".
Ocena: zielono (sesja, jak najbardziej na plus)
Maurice De Beijer - "What is new in ASP.NET vNext?"
Sesja bardzo ważna i moim zdaniem bardzo przydatna. Maurice pokazał w całkiem fajny i przyjemny sposób, nowości związane z nowym asp.net i nie będę ukrywał, wygląda to obiecująco. Wprawdzie jest jeszcze do dopracowania kwestia wydajności tego "mikrokompilowania", ale i tak chłopaki z MS wykonali kawał dobrej roboty, na którą wielu czekało. Tutaj jest jeszcze jedna uwaga, do prowadzącego: mógłby popracować nad swoim angielskim, oraz swoim akcentem, ponieważ z os. występujących na scenie, najtrudniej było go zrozumieć (z os. "z po za sceny" brylował jeden z uczestników, próbujący zadawać pytania, ale za cholere nie potrafiliśmy go zrozumieć, ani ja, ani chłopaki, którzy siedzieli obok. Widocznie organizatorzy też nie umieli go zrozumieć, bo zaraz po tamtej sesji, przenieśli "zadawanie pytań" na twittera ;)).
Ocena: zieleń (fajna i potrzebna prezentacja, tylko niech prelegent popracuje jeszcze nad akcentem ;)).
Chris Klug - "Decomposing AngularJS"
Temat brzmiał mocno pro-technicznie w Angularze. Uważam, takie sesje za potrzebe, ponieważ AngularJS robi się coraz popularniejszy, jednak z uwagi na mój brak komercyjnego doświadczenia z tą biblioteką (rok temu robiłem sobie tutoriale, z których już nic nie pamiętam), to tą sesję postanowiłem sobie odpuścić, bo wiedziałem, że i tak za dużo z niej nie zrozumię. Pochodziłem sobie po sali, pograłem na automatach, które przyniesiono do przedsionka (był m.in. "Tekken2", choć z tamtych czasów osobiście bardziej lubiłem serię "Virtual Fighter" ;)). Później wróciłem na końcówkę sesji i wygladało to "pro", czyli... mój nos mnie nie zawiódł. Pewnie i tak nie wiele bym z tej prezentacji zrozumiał, ale jak ktoś na codzień siedzi w Angularze to pewnie był zachwycony.
Ocena: brak oceny -> niech się wypowie ktoś, kto na co dzień siedzi w AngularJS.
Tutaj miała byc ost. sesja, z twórcą biblioteki Simple.Data, czyli Markiem Rendle, na którą mocno ostrzyłem sobie zęby, jednak Mark zachorował i w ost. chwili organizatorzy zamiast jego sesji zorganizowali panel dyskusyjny z prelegentami. Zanim to jednak nast. , na salę wyjechały kegi z "firmowymi browarami" serwowane w szklance z logo konferencji, które... organizatorzy postanowili podarować uczestnikom w ramach prezentu. I mając browara w dłoni zasiadłem do słuchania panelu dyskusyjnego. Atmosfera była fajna, jednak z uwagi na kwestie osobiste, nie wytrzymałem do końca i zwinąłem się z konferencji. Sam panel obejrzę sobie w przyszłości na youtube, a najbardziej żałuję, że jednak nie dane mi było być na afterparty. Cóż, takie życie :/
Ogólnie, jeżeli chodzi o prezentacje, to było bardzo dobrze i nawet nieco bardziej technicznie niż na DevDay. Tylko jedna "żółta kartka" i żadnej "czerwonej" to bardzo dobry wynik. W dodatku było mocno techczninie, zarówno na konferencji, jak i przed nią, więc uważam, że z całą pewnością czegoś się tutaj nauczyłem i coś z tej konferencji wyniosłem (nie licząc gadżetów ;)).
A skoro mowa o gadżetach, to, pomijając smaczne jedzenie (czy wspomninałem już o mnóstwie przekąsek dostęnych między prezentacjami?? ;)), to dostaliśmy:
- dyskietka 3.5 cala jako identyfikator (+ agenda i smycz)
- drewnianą łamigłówkę w firmowym woreczku o taką, jak ta :)
- koszulkę z logo konferencji
- szklankę do piwa/ lampkę do wina z logo konferencji (czy wspominałem wam już, że razem z moim bratem od ok 12 lat kolekcjonujemy szklanki i kufle do piwa z całego świata i obecnie samych kufli do piwa mamy ok 70 rodzajow, a szklanek to już będzie spokojnie ponad 220? :))
- ładnie wyglądający notes thinkme.pl/notesy.html - i tutaj ciekawostka. Akurat z tego gadżetu na pocz. cieszyłem się "najmniej", jednak jakie to życie potrafi być przewrotne. Jadąc dzisiaj do Warszawy PolskimBusem okazało się, że... przedmną stoi matka z 15 dziewczyną i... kierowca nie chciał jej wpuścić do autokaru mimo wykupionego biletu, tłumacząc się, że do 16 roku życia potrzebuje mieć pisemną zgodę rodziców (dziewczyna miała jechać sama, bez matki). I ja wtedy wyjmuję z plecaka notes #wrocsharp, oraz konferencyjny długopis, wspólnie wyrywamy kartkę z notatnika, mama skrobie zgodnę na kartce i dziewczyna może kontynuować podróż. Niby nic, ale jednak zawsze ten jeden dobry uczynek do przodu :)
Podsumowujac:
Z tego miejsca, bardzo chciałbym podziękować całemu zespołowi http://www.objectivity.pl/ za zorganizowanie tej konferencji oraz zaproszenie mnie na nią.
Uważam, że była to bardzo udana konferencja, na której występowali ciekawi prelegenci z interesującymi tematami. Organizacja eventu była na najwyższym poziomie, a geekowe akcenty znaleźć można było niemal na każdym rogu. W dodatku, konferecnję poprzedził fajny before.
I to wszystko za darmo. Czego chcieć więcej? Dla mnie bomba! Żyć nie umierać i (oby) do zobaczenia w przyszłości :)
Teoretycznie, pozostało czekać, i dostać bilet z "puli otwartej", jednak pomny doświadczeń, z takimi losowaniami z 2 ost. imprez, na których chciałem się pojawić, tj. devday.pl/ i 2014.confitura.pl/ w przypadku których bilety rozeszły się w mniej niż 5 min. postanowiłem... wypełnić formularz kontaktowy, który znalazłem na oficjalnej stronie konferencji. Wpisałem, tam kim jestem i... dlaczego chciałbym się znaleźć na tej konferencji i... miałem nosa. W odpowiedzi na moją wiadomość, dostałem darmowy bilet na konferencję, a... kilka dni później ruszyły oficjalne zapisy, podczas których wejściówki rozeszły się w... 3 min :)
W międzyczasie okazało się, że dzień wcześniej szykuje się "grube" spotkanie Wrocławskiej grupy .NET. Pomny, jak to wyglądało wcześniej w przypadku Krakowskiego DevDays, przyjechałem do Wrocławia dzień wcześniej. I się nie zawiodłem. Spotkanie odbyło się w knajpie na Włodkowica 21 link do www.meetup.com, na którym zjawiło się naprawdę sporo devów, odbyły się 3 prelekcje nt. CQRS, podczas którego, darmowe piwo zapewniało nam pgs-soft.com.
Spotkanie fajne, podczas którego można się było poznać, porozmawiać, czegoś nauczyć, oraz wymienić poglądy nt. różnych technologii. Ja np. dostałem odp. na jedno z nurtujących mnie pyt. nt. simpledata., jak i była okazja do rozmów o własnych przemyślaniach nt. przyszłości różnych technologii.
Właściwa konferencja zaczęła się czwartek na Hali Stulecia we Wrocławiu. Na pocz. krótka rejestracja, tj. odchaczenie na liście gości po czym... dostajemy garść suwenirów. Już na samym początku konferencji, miłym zaskoczeniem był fakt, że... każdy dostał smycz z agendą oraz dyskietką 3,5 cala z własnym imieniem/nazwą jako identyfikatorem :D Zajebisty pomysł. Patrząc na tą dyskietkę, przypomniały mi się czasy dzieciństwa, kiedy jako 12-14 letni maluch żąglowałem takimi dyskietkami w naszym Atarii 500 :D
Oczywiście gadżetów było więcej, ale tamte wymienię na koniec mojego wpisu.
Więc mam już swój identyfikator, kurtka wylądowała w szatni, to wchodzę na salę. Akurat na sali przemawiał ktoś ważny z www.objectivity.pl/. Zrobiłem sobie kawę (stoły z napojami do wyboru do koloru stały przy jednym z boków sali) i usiadłem na jakimś randomowym krzesełku. Pierwsze co się rzucało, to piękny angielski os. przemawiającej. Od razu człowiek wiedział, że ma do czynienia z jakimś "native speakerem", w dodatku z top managmenu (kto był w Anglii, ten wie, że tzw. "Cambridge English" posługuje się tylko elita). Przemówienie było o tym, że... grupa devów chciała zorganizować konferencję, ściągnąć kogoś fajnego, na pocz. miało to być coś małego, ale... w trakcie jak to organizowali to im się ta konferencja ciągle rozrastała (i koszty również), ale postanowili przyjać to "na klatę". Miło z jego/ich strony ;)
Razem z gadżetami, dostaliśmy też do wypełnienia kartkę, z sesjami i uwagami, jako "feedback", więc dostusuje się z moją opinią, do wymienionej tam skali oceny prezentacji, tj.: zielonej, żółtej, czerwonej.
Christian Heilmann - "Innovating the outer web":
Całkiem ciekawy człowiek, związany ze środowiskiem "Open Source", który przez pewien czas pracował w fundacji Mozilli, cały czas walcząc z IE8 i... pewnego dnia stwierdził, że jeżeli naprawdę chce się wyeliminować z rynku IE8 to... należy się zatrudnić w Microsofcie i... wyelimować tą przeglądarkę z rynku "od środka" ;) Tak też zrobił i obecnie zmienia Microsoft, a dokładniej ich dział webowy od środka. Temat prezentacji, natomiast dot. stron... firmowych, rządowych, ale również tych będących często za firmowymi intranetami. To też jest web, a w wielu tych miejscach obowiązkową przeglądarką jest właśnie IE. I to od nas zależy, jaki ten "inny" web będzie i ile w nim będzie innowacji. Co ważne, Christian podał linka do strony QA w MS: (making-it-easier-for-enterprise-customers-to-upgrade-to-internet-explorer-11-and-windows-10.)
Wspominał też, o nowych przeglądarkach tworzonych przez MS i ich konfigurowaniu.
Ocena: Zielono mi, czyli mi się prezentacja podobała.
Matt Elis - "Litle changes to make your app a lot faster"
Prezentacja mocno techniczna i całkiem przyjemna. Matt pokazał, różne konstrukcje języka oraz sposób ich działania "od środka". Pomijając proste rzeczy, typu "unikać" jawnych i niejawnych mapować na "object" (lepiej używać generyków lub przekazując int do "string.Format" ręcznie wykonać metodę "toString()" (kompilator domyślnie najpierw zrzutuje nam int -> object -> string), a iterując na listach i kolekcjach o ile potrafimy przewidzieć ich długość (np. stosując foreach) to warto jawnie zadeklarować ich wielkość w kontruktorze (fajny, miły bajer), to... uderzył też w nowości języka C# 3.0, czyli... IEnumerable i LINQ. Buuu. Ja lubię linq i IEnumerable. W sumie domyślałem się, że to może działać wolniej niż typowa pętla for, a teraz już wiem dlaczego :) Jak coś ma być szybkie, to omijamy linq, IEnumerable i... klepiemy własne pętle for, niczym w C++ :/
Ocena: Prezentacja godna obejrzenia przez każdego programistę, czyli Zielono
Mark Seemann - "Type-Driven Development"
Sesja o F#, typach, i sposobie rozwiązywania problemów. Mark zrobił krótki wstęp o językach programowania, później przedstawił problem biznesowy, oraz pokazał swój sposób rozwiązania tego problemu w F#. Nie znam się na F#, ale sposób mówienia był lekko "senny", a kody które pokazywał Mark z tylnych krzeseł słabo widoczne (siedziałem w ost. rzędzie). Mark próbował "kalibrować" wielkość kodu, ale nie do końca mu to wychodziło i w konsekwencji moim głównym moim zadaniem podczas tej prelekcji było "jak by tu nie zasnąć". Zapewne problem przedstawiony przez Marka był fajny, dodatkowo na plus, że w swojej prezentacji poruszył realne zagadnienia i realne rozwiązania, jednak... sposób mówienia, oraz sposób prezentowania tej prezentacji nie do końca przypadł mi do gustu.
Ocena: żółto, (nie czerwono, bo jednak realne problemy, nie zielono, bo gdyby krzesełka były wygodniejsze, to bym tam usnął)
Lunch: Obiadek, obiadek. Aby być fair, to trzeba przyznać, że po każdej prezentacji była krótka przerwa na kawę i przekąski, które były smaczne i których było pod dostatkiem (cały czas przynoszone były nowe). Do tego, po sesji Marka była sesja obiadowa, a przed panelem dyskusyjnym piwo/wino/drinki (ale o tym później).
Ocena: zieleń ;)
Dan North - "O, Programmer"
Dan w swojej prezentacji opisywał zmieniające się role i wymagania, jakie stały przed programistami na przestrzeni lat, oraz jak to wygląda obecnie. Na początku kilka fajnych, śmiesznych obrazków (np. Pair programming, ludzi wspólnie oglądających "karty perforowane" itp. ;)). Później przeszedł do czasów współczesnych. Mi ta sesja bardzo przypominała materiał zamieszczony w 2 książkach nt. etyki pracy programistów, tj. pragmatyczny programista oraz mistrz czystego kodu-kodeks postepowania profesjonalnych programistow, za to, dla kilku chłopaków, którzy siedzieli obok mnie, to było "WOW".
Ocena: zielono (sesja, jak najbardziej na plus)
Maurice De Beijer - "What is new in ASP.NET vNext?"
Sesja bardzo ważna i moim zdaniem bardzo przydatna. Maurice pokazał w całkiem fajny i przyjemny sposób, nowości związane z nowym asp.net i nie będę ukrywał, wygląda to obiecująco. Wprawdzie jest jeszcze do dopracowania kwestia wydajności tego "mikrokompilowania", ale i tak chłopaki z MS wykonali kawał dobrej roboty, na którą wielu czekało. Tutaj jest jeszcze jedna uwaga, do prowadzącego: mógłby popracować nad swoim angielskim, oraz swoim akcentem, ponieważ z os. występujących na scenie, najtrudniej było go zrozumieć (z os. "z po za sceny" brylował jeden z uczestników, próbujący zadawać pytania, ale za cholere nie potrafiliśmy go zrozumieć, ani ja, ani chłopaki, którzy siedzieli obok. Widocznie organizatorzy też nie umieli go zrozumieć, bo zaraz po tamtej sesji, przenieśli "zadawanie pytań" na twittera ;)).
Ocena: zieleń (fajna i potrzebna prezentacja, tylko niech prelegent popracuje jeszcze nad akcentem ;)).
Chris Klug - "Decomposing AngularJS"
Temat brzmiał mocno pro-technicznie w Angularze. Uważam, takie sesje za potrzebe, ponieważ AngularJS robi się coraz popularniejszy, jednak z uwagi na mój brak komercyjnego doświadczenia z tą biblioteką (rok temu robiłem sobie tutoriale, z których już nic nie pamiętam), to tą sesję postanowiłem sobie odpuścić, bo wiedziałem, że i tak za dużo z niej nie zrozumię. Pochodziłem sobie po sali, pograłem na automatach, które przyniesiono do przedsionka (był m.in. "Tekken2", choć z tamtych czasów osobiście bardziej lubiłem serię "Virtual Fighter" ;)). Później wróciłem na końcówkę sesji i wygladało to "pro", czyli... mój nos mnie nie zawiódł. Pewnie i tak nie wiele bym z tej prezentacji zrozumiał, ale jak ktoś na codzień siedzi w Angularze to pewnie był zachwycony.
Ocena: brak oceny -> niech się wypowie ktoś, kto na co dzień siedzi w AngularJS.
Tutaj miała byc ost. sesja, z twórcą biblioteki Simple.Data, czyli Markiem Rendle, na którą mocno ostrzyłem sobie zęby, jednak Mark zachorował i w ost. chwili organizatorzy zamiast jego sesji zorganizowali panel dyskusyjny z prelegentami. Zanim to jednak nast. , na salę wyjechały kegi z "firmowymi browarami" serwowane w szklance z logo konferencji, które... organizatorzy postanowili podarować uczestnikom w ramach prezentu. I mając browara w dłoni zasiadłem do słuchania panelu dyskusyjnego. Atmosfera była fajna, jednak z uwagi na kwestie osobiste, nie wytrzymałem do końca i zwinąłem się z konferencji. Sam panel obejrzę sobie w przyszłości na youtube, a najbardziej żałuję, że jednak nie dane mi było być na afterparty. Cóż, takie życie :/
Ogólnie, jeżeli chodzi o prezentacje, to było bardzo dobrze i nawet nieco bardziej technicznie niż na DevDay. Tylko jedna "żółta kartka" i żadnej "czerwonej" to bardzo dobry wynik. W dodatku było mocno techczninie, zarówno na konferencji, jak i przed nią, więc uważam, że z całą pewnością czegoś się tutaj nauczyłem i coś z tej konferencji wyniosłem (nie licząc gadżetów ;)).
A skoro mowa o gadżetach, to, pomijając smaczne jedzenie (czy wspomninałem już o mnóstwie przekąsek dostęnych między prezentacjami?? ;)), to dostaliśmy:
- dyskietka 3.5 cala jako identyfikator (+ agenda i smycz)
- drewnianą łamigłówkę w firmowym woreczku o taką, jak ta :)
- koszulkę z logo konferencji
- szklankę do piwa/ lampkę do wina z logo konferencji (czy wspominałem wam już, że razem z moim bratem od ok 12 lat kolekcjonujemy szklanki i kufle do piwa z całego świata i obecnie samych kufli do piwa mamy ok 70 rodzajow, a szklanek to już będzie spokojnie ponad 220? :))
- ładnie wyglądający notes thinkme.pl/notesy.html - i tutaj ciekawostka. Akurat z tego gadżetu na pocz. cieszyłem się "najmniej", jednak jakie to życie potrafi być przewrotne. Jadąc dzisiaj do Warszawy PolskimBusem okazało się, że... przedmną stoi matka z 15 dziewczyną i... kierowca nie chciał jej wpuścić do autokaru mimo wykupionego biletu, tłumacząc się, że do 16 roku życia potrzebuje mieć pisemną zgodę rodziców (dziewczyna miała jechać sama, bez matki). I ja wtedy wyjmuję z plecaka notes #wrocsharp, oraz konferencyjny długopis, wspólnie wyrywamy kartkę z notatnika, mama skrobie zgodnę na kartce i dziewczyna może kontynuować podróż. Niby nic, ale jednak zawsze ten jeden dobry uczynek do przodu :)
Podsumowujac:
Z tego miejsca, bardzo chciałbym podziękować całemu zespołowi http://www.objectivity.pl/ za zorganizowanie tej konferencji oraz zaproszenie mnie na nią.
Uważam, że była to bardzo udana konferencja, na której występowali ciekawi prelegenci z interesującymi tematami. Organizacja eventu była na najwyższym poziomie, a geekowe akcenty znaleźć można było niemal na każdym rogu. W dodatku, konferecnję poprzedził fajny before.
I to wszystko za darmo. Czego chcieć więcej? Dla mnie bomba! Żyć nie umierać i (oby) do zobaczenia w przyszłości :)
sobota, 7 marca 2015
Simple.Data - rok później
Ponad rok temu, tj. w grudniu 2013 roku miałem okazję poznać nową bibliotekę, Simple.Data. Nawet zrobiłem nt. post na bloku w styczniu 2014 roku link. Teraz, po ponad roku komercyjnego używania tej biblioteki, mam na jej temat pewne przemyślenia, którymi chciałbym się podzielić.
Czym jest Simple.Data? Jest to jeden, z coraz popularniejszych "microORM", który łączy ze sobą zalety ORM, przy okazji nie narzucając zbyt dużo konfiguracji oraz "dodatkowych bajerów", które oferują tradycyjne ORM takie jak EF lub nHibernate.
Reklamowane zalety:
- szybkość aplikacji (szybszy dostęp do aplikacji)
- brak dodatkowej konfiguracji (biblioteka sama rozpoznaje nazwy tabel)
- mniejsza ilość kodu
- nowa, fajna składnia, wykorzystująca dynamic (np. db.highscores.
- identyczna obsługa, dla wielu typów baz danych (włączając w to zarówno SQL jak i NoSQL)
Potencjalne wady:
- brak intellisense
- ewentualne problemy występuja dopiero w runtime
Tyle teorii, a teraz trochę praktyki:
- jak pokazuje prosty przykład (https://bitbucket.org/zchpit/sqlitesamples) Biblioteka Simple.Data jest ok 10 razy szybsza od EF (2500 ms vs 304 ms) jednak nadal ok 10 razy wolniejsza od klasycznego Data Reader (304 ms vs 17 ms).
- zaleta, w postaci automatycznego mapowania nazw tabel na nazwy obiektów nie zawsze się sprawdza, ponieważ często w istniejących bazach danych spotykałem się z polskimi nazwami tabel, a nazwy wszystkich zmiennych, klas, metod itp. w aplikacji wolę mieć po ang. więc... w pracy z istniejącymi rozwiązaniami i tak trzeba było wykonywać mapowanie
- inna składnia, która nie jest LINQ (fajny bajer, ale jednak wolał bym mieć również do dyspozycji również klasycznego LINQ)
- problem z aktualizacją modelu po zmianie na bazie danych, przez kogoś innego (np. administrator bazy danych)
- fajne, dla małych 1-2 os. aplikacji typu CRUD, które operują na małych bazach danych (np. 5-8 tabel)
- można zastosować dla baz, co do których mamy wątpliwości, czy zostaną obsłużone przez nHibernate lub EF.
Podsumowując, kiedy stosować, a kiedy nie stosować?
Nie stosować gdy:
- tworzymy duże rozwiązanie, przy którym będą niezależnie od siebie pracować programiści oraz BI. Brak możliwości automatycznego "update" modeli po stronie kodu, mocno utrudnia taką współpracę (choć oczywiście można się dogadać, co do używania procedur składowanych o niezmiennych parametrach).
- gdy najważniejszym parametrem jest szybkość działania aplikacji (nawet kosztem dłuższego czasu wytwarzania). W takich przypadkach lepszym rozwiązaniem będzie klasyczny Data Reader
-gdy pracujemy na istniejącej bazie danych, która w dodatku posiada polskie nazwy tabel, proc. składowanych itp. -> nieaktualne (patrz komentarz na końcu)
- gdy pracujemy na istniejącej, dużej bazie danych i spodziewamy się mnóstwa złączeń itp. W takich przypadkach jednak osobiście wolę wygenerować sobie Model automatycznie, mieć Intelii Sense oraz używać klasycznego LINQ a nie co chwila googlować jak to połączyć w nowej składni.
Kiedy stosować microORM
- gdy dostajemy do zrobienia od zera nową, stosunkowo małą aplikację typu CRUD, która ma pobrać dane z jednego źródła, przetworzyć je i zapisać gdzieś indziej np. z bazy X pobieramy naszych gości naszej super konferencji, z publicznego API pobieramy listę sankcyjną ludzi publicznie objętych zakazem wjazdu do UE, matchujemy obie listy, a wynik tego machowania zapisujemy do osobnej bazy danych.
Edit: od napisania tego posta, minął niecały tydź., ale miałem okazję bywać w kilku miejscach, więc mały update
a) O kwestie związane z aktualną bazą danych, na której mamy polskie nazwy tabel, a zmienne w aplikacji (viewModel), czyli "gdy chcemy mieć po ang. to czy musimy robić ręczne mapowanie?" zapytałem Maćka Aniserowicza (link do bloga) podczas spotkania Wrocławskiej grupy .NET i Maciek mi odpowiedział mega banalną odpowiedź (kurde, jak na to nie wpadłem, to sam nie wiem), tj.: pobierać dane z bazy za pomocą widoków, a w widokach nadawać zwracanym kolumnom ALIASY
b) Pod tym postem znalazłem komentarz Maćka Jędrzejewskiego, z ciekawości wszedłem na jego bloga i... znalazłem tam fajny "auto.mapper" o nazwie Slapper, za pomocą którego można automatycznie mapować typy "dynamic" zwracane przez Simple.Data na klasy naszego ViewModel -> link do posta na blogu Maćka
Linki:
- Test wydajności mojego autorstwa
- Podst. solucję, którą wykorzystałem w moim teście pobrałem z bloga Tigran Gasparian
- Kody źródłowe Simple.Data na Github
- Porównanie kilku innych microSQL
- Link do bloga Maćka Jedrzejewskiego (automatyczne mapowanie obiektów do ViewModelu)
Czym jest Simple.Data? Jest to jeden, z coraz popularniejszych "microORM", który łączy ze sobą zalety ORM, przy okazji nie narzucając zbyt dużo konfiguracji oraz "dodatkowych bajerów", które oferują tradycyjne ORM takie jak EF lub nHibernate.
Reklamowane zalety:
- szybkość aplikacji (szybszy dostęp do aplikacji)
- brak dodatkowej konfiguracji (biblioteka sama rozpoznaje nazwy tabel)
- mniejsza ilość kodu
- nowa, fajna składnia, wykorzystująca dynamic (np. db.highscores.
FindAllByScore(2); )- identyczna obsługa, dla wielu typów baz danych (włączając w to zarówno SQL jak i NoSQL)
Potencjalne wady:
- brak intellisense
- ewentualne problemy występuja dopiero w runtime
Tyle teorii, a teraz trochę praktyki:
- jak pokazuje prosty przykład (https://bitbucket.org/zchpit/sqlitesamples) Biblioteka Simple.Data jest ok 10 razy szybsza od EF (2500 ms vs 304 ms) jednak nadal ok 10 razy wolniejsza od klasycznego Data Reader (304 ms vs 17 ms).
- zaleta, w postaci automatycznego mapowania nazw tabel na nazwy obiektów nie zawsze się sprawdza, ponieważ często w istniejących bazach danych spotykałem się z polskimi nazwami tabel, a nazwy wszystkich zmiennych, klas, metod itp. w aplikacji wolę mieć po ang. więc... w pracy z istniejącymi rozwiązaniami i tak trzeba było wykonywać mapowanie
- inna składnia, która nie jest LINQ (fajny bajer, ale jednak wolał bym mieć również do dyspozycji również klasycznego LINQ)
- problem z aktualizacją modelu po zmianie na bazie danych, przez kogoś innego (np. administrator bazy danych)
- fajne, dla małych 1-2 os. aplikacji typu CRUD, które operują na małych bazach danych (np. 5-8 tabel)
- można zastosować dla baz, co do których mamy wątpliwości, czy zostaną obsłużone przez nHibernate lub EF.
Podsumowując, kiedy stosować, a kiedy nie stosować?
Nie stosować gdy:
- tworzymy duże rozwiązanie, przy którym będą niezależnie od siebie pracować programiści oraz BI. Brak możliwości automatycznego "update" modeli po stronie kodu, mocno utrudnia taką współpracę (choć oczywiście można się dogadać, co do używania procedur składowanych o niezmiennych parametrach).
- gdy najważniejszym parametrem jest szybkość działania aplikacji (nawet kosztem dłuższego czasu wytwarzania). W takich przypadkach lepszym rozwiązaniem będzie klasyczny Data Reader
-
- gdy pracujemy na istniejącej, dużej bazie danych i spodziewamy się mnóstwa złączeń itp. W takich przypadkach jednak osobiście wolę wygenerować sobie Model automatycznie, mieć Intelii Sense oraz używać klasycznego LINQ a nie co chwila googlować jak to połączyć w nowej składni.
Kiedy stosować microORM
- gdy dostajemy do zrobienia od zera nową, stosunkowo małą aplikację typu CRUD, która ma pobrać dane z jednego źródła, przetworzyć je i zapisać gdzieś indziej np. z bazy X pobieramy naszych gości naszej super konferencji, z publicznego API pobieramy listę sankcyjną ludzi publicznie objętych zakazem wjazdu do UE, matchujemy obie listy, a wynik tego machowania zapisujemy do osobnej bazy danych.
Edit: od napisania tego posta, minął niecały tydź., ale miałem okazję bywać w kilku miejscach, więc mały update
a) O kwestie związane z aktualną bazą danych, na której mamy polskie nazwy tabel, a zmienne w aplikacji (viewModel), czyli "gdy chcemy mieć po ang. to czy musimy robić ręczne mapowanie?" zapytałem Maćka Aniserowicza (link do bloga) podczas spotkania Wrocławskiej grupy .NET i Maciek mi odpowiedział mega banalną odpowiedź (kurde, jak na to nie wpadłem, to sam nie wiem), tj.: pobierać dane z bazy za pomocą widoków, a w widokach nadawać zwracanym kolumnom ALIASY
b) Pod tym postem znalazłem komentarz Maćka Jędrzejewskiego, z ciekawości wszedłem na jego bloga i... znalazłem tam fajny "auto.mapper" o nazwie Slapper, za pomocą którego można automatycznie mapować typy "dynamic" zwracane przez Simple.Data na klasy naszego ViewModel -> link do posta na blogu Maćka
Linki:
- Test wydajności mojego autorstwa
- Podst. solucję, którą wykorzystałem w moim teście pobrałem z bloga Tigran Gasparian
- Kody źródłowe Simple.Data na Github
- Porównanie kilku innych microSQL
- Link do bloga Maćka Jedrzejewskiego (automatyczne mapowanie obiektów do ViewModelu)
niedziela, 21 grudnia 2014
Wielowątkowy dostęp do zasobów "po polsku" :D
Jak każdy wie, samo programowanie jest wystarczająco trudne, a programowanie wielowątkowe jest trudne do kwadratu. O tym, że jest u nas z tym "krucho" można się było przekonać podczas tegorocznego DevDay 2014 w Krk, podczas którego Dan North wytknął to polskim programistom (głównie tym uczestniczącym na jego warsztatach).
Może ze świadomością wielowątkowości nie jest jakoś super, ale jednak pewna świadomość jest, co pokazała choćby sesja nt. "Modelu aktorów" na Warszawskiej grupie .NET.
A gdzie ja się z tym ost. spotkałem? Ano w aplikacji webowej, którą stworzyłem, a która do generowania raportów wykorzystuje SQL Server Reporting Services w trybie "local reports", tzn. do generowania raportów wykorzystywane są pliki ".rdlc" umieszczone na tym samym serwerze co serwer IIS hostujący stronę web (w moim konkretnym przypadku framework nancyfx).
I o ile przez większość czasu, te raporty generowały się poprawnie, o tyle przed wystawieniem aplikacji dla naszych doradców (pierwsza faza testów objęła ok 50-60 docelowych użytkowników systemu) razem z Adamem K. (osoba z "biznesu") postanowiliśmy przetestować to na x raportów wygenerowanych równocześnie. Zrobiliśmy tak i... klops. Pojawiły się błędy, jedne, te związane z użyciem słówka "static" udało się szybko wyeliminować, to pozostał jeszcze "concurrent access to file".
Stackoverflow.com zaproponowało synchroniczny dostęp do plików za pomocą "lock". O ile na "początek" to miało sens, tj. wrzucam 'lock'a' "na szybko" i oddaję pierwszą wersję aplikacji użytkownikom do testów, o tyle w docelowej wersji (i kilka razy większej ilości użytkowników) taka wersja systemu była by bardzo niewygodna.
Z pomocą i pomysłem przyszedł mi Michał Kwiatos, który zaproponował rozwiązanie pt. "dla każdego requesta wygeneruj GUID, utwórz katalog z nazwą GUIDa, przekopiuj tam swoje pliki, wykorzystaj je do generowania raportu, a na koniec skasuj niepotrzebny już, śmieciowy katalog", co też zrobiłem i co... rozwiązało mój problem.
I tak sobie teraz myślę, że... najprostsze rozwiązania zwykle bywają najskuteczniejsze.
p.s. mój system docelowo będzie miał mniej niż 500 userów, czyli takie rozwiązanie wydaje się być optymalne. Gdybym tworzył system na +2k userów, to myślę, że na poważnie zastanowił bym się nad implementacją "modelu aktorów" w tym systemie.
p.s.2 wszelkie uwagi mile widziane
Może ze świadomością wielowątkowości nie jest jakoś super, ale jednak pewna świadomość jest, co pokazała choćby sesja nt. "Modelu aktorów" na Warszawskiej grupie .NET.
A gdzie ja się z tym ost. spotkałem? Ano w aplikacji webowej, którą stworzyłem, a która do generowania raportów wykorzystuje SQL Server Reporting Services w trybie "local reports", tzn. do generowania raportów wykorzystywane są pliki ".rdlc" umieszczone na tym samym serwerze co serwer IIS hostujący stronę web (w moim konkretnym przypadku framework nancyfx).
I o ile przez większość czasu, te raporty generowały się poprawnie, o tyle przed wystawieniem aplikacji dla naszych doradców (pierwsza faza testów objęła ok 50-60 docelowych użytkowników systemu) razem z Adamem K. (osoba z "biznesu") postanowiliśmy przetestować to na x raportów wygenerowanych równocześnie. Zrobiliśmy tak i... klops. Pojawiły się błędy, jedne, te związane z użyciem słówka "static" udało się szybko wyeliminować, to pozostał jeszcze "concurrent access to file".
Stackoverflow.com zaproponowało synchroniczny dostęp do plików za pomocą "lock". O ile na "początek" to miało sens, tj. wrzucam 'lock'a' "na szybko" i oddaję pierwszą wersję aplikacji użytkownikom do testów, o tyle w docelowej wersji (i kilka razy większej ilości użytkowników) taka wersja systemu była by bardzo niewygodna.
Z pomocą i pomysłem przyszedł mi Michał Kwiatos, który zaproponował rozwiązanie pt. "dla każdego requesta wygeneruj GUID, utwórz katalog z nazwą GUIDa, przekopiuj tam swoje pliki, wykorzystaj je do generowania raportu, a na koniec skasuj niepotrzebny już, śmieciowy katalog", co też zrobiłem i co... rozwiązało mój problem.
I tak sobie teraz myślę, że... najprostsze rozwiązania zwykle bywają najskuteczniejsze.
p.s. mój system docelowo będzie miał mniej niż 500 userów, czyli takie rozwiązanie wydaje się być optymalne. Gdybym tworzył system na +2k userów, to myślę, że na poważnie zastanowił bym się nad implementacją "modelu aktorów" w tym systemie.
p.s.2 wszelkie uwagi mile widziane
niedziela, 16 listopada 2014
dotPeek, czyli darmowe narzędzie do reverse engineering
dotPeek to nowe, darmowe narzędzie do deasemblacji (inżynierii wstecznej) od twórców ReSharpera, czyli JetBrains (link). Czym jest deasemblacja? Jest to próba odtworzenia kodów źródłowych na podstawie skompilowanych plików .dll lub .exe. O tym, że w .NET jest to możliwe wie każdy, kto zetknął się z mechanizmem refleksji, czyli... każdy szanujący się programista. Co jest fajnego w dotPeek, po za tym, że jest darmowe? To, że kod po deasemblacji wygląda na naprawdę zbliżony do tego, jaki widzimy w Visual Studio. Polecam zgrać i się nieco pobawić :)
Etykiety:
C#,
code review,
DevTools,
dotPeek,
Hacking,
inżyniera wsteczna,
JetBrains,
narzędzia,
programowanie,
refleksja,
ReSharper,
reverse engineering
wtorek, 11 lutego 2014
Szkolenie Comarch - Programowanie .NET 4.0 - kurs zaawansowany
W dniach od 05.02.2014 do 07.02.2014 (3 dni) miałem przyjemność wziąć udział w szkoleniu, zorganizowanym przez firmę Comarch nt. ' Programowanie .NET 4.0 - kurs zaawansowany'.
Szkolenie przeprowadził Marcin Najder (techblog), ale zanim przejdę do konkretów najpierw kilka spraw "formalnych". Szkolenie odbyło się w Warszawskiej siedzibie firmy, przy ul. Leśna 2 (przecznica ul. Puławskiej 525), czyli... na Ursynowie, przy ul. Puławskiej, drugie światła od zjazdu z południowej obwodnicy Warszawy, czyli... bardzo dobra lokalizacja dla zmotoryzowanych (w okoliczny jest gdzie zaparkować).
Co do oferty szkoleniowej, to można ją przejrzeć tutaj, natomiast szczegóły szkolenia, na którym ja byłem, można obejrzeć tutaj. Pod każdym szczegółowym opisem szkolenia jest niebieski przycisk "Terminarz i Rejestracja", więc jeżeli ktoś jest zainteresowany, to wiadomo co i jak.
Jeżeli chodzi o samo szkolenie, to nie będę ukrywał, że cena 3 dniowego szkolenia, była jak na Warszawę bardzo konkurencyjna (w promocji, 1400zł + VAT).
A jak wyglądało samo szkolenie?
Należy zacząć od tego, że sam prowadzący, to bardzo sympatyczny, a przy tym doświadczony programista. Prawdziwy pasjonat w swoim fachu, fan zarówno języków funkcyjnych jak i obiektowych i to m.in. próbował nam przekazać podczas szkolenia. Ponieważ w naszej 7 os. grupie, były os. o bardzo zróżnicowanym doświadczeniu programistycznym, Marcin musiał się nieco wysilić, szczególnie że był niemal przez cały czas pod porządnym gradobiciem pytań.
Były więc os. zaraz po studiach (i kursie podstawowym), które prosiły o więcej wyjaśnień związanych z lambdami, delegatami itp., jak i doświadczony programista PHP pragnący spróbować swoich sił w .NET, jak i 2-3 bardziej doświadczonych programistów, pytających co chwila o bardziej zaawansowane tematy oraz różnego rodzaju "wątki poboczne".
Na wszystkie te tematy, prowadzący odpowiadał spokojnie i rzeczowo. W efekcie, w trakcie kursu, przerobiliśmy też fragment "kursu podstawowego", to co było w agendzie związane z zaawansowanymi aspektami programowania w .NET (linq, lambdy, refleksja, więcej lambd, T4, wzorce projektowe, programowanie współbieżne, jeszcze więcej lambd itp. ;)), ale również tematy okołoprogramistyczne, takie jak np. rozproszone kontrole wersji (github, bitbucket), "NoSQL" (MongoDb, RavenDb), JSON, frameworki javascriptowe (Angular.JS, Node.JS). Wspomniany został nawet ServiceStack (niestety aktualnie płatny) Jeżeli doliczymy do tego ćwiczenia praktyczne z wykorzystaniem nUnit oraz Resharpera, oraz rozmowy programistyczne oraz około programistyczne, czy w czasie kursu, czy też w czasie wspólnego posiłku to daje nam naprawdę intensywnie spędzone 3 dni..
Wprawdzie to nie Ja płaciłem za szkolenie(firma płaciła), ale uważam, że naprawdę warto było pójść na to szkolenie. Fajnie jest przebywać w towarzystwie inteligęnych (i nierzadko mądrzejszych) ludzi od siebie i tak "na spokojnie" się czegoś nowego dowiedzieć/nauczyć. Taki miłe urozmaicenie w stosunku do samotnego przerabiania tutoriali / dokumentacji / oglądania podcastów w domu ;)
Z tego co Marcin mówił, to obok pracy na etacie, prowadzi również szkolenia ASP.MVC, programowanie reaktywne, jak i kurs podstawowy. Inna sprawa, że kurs podstawowy, czasami prowadzi też inna zupełnie inna osoba.
To tyle. Gdyby ktoś kiedyś miał okazję udać się na takie szkolenie, to szczerze polecam. Fajnie było :)
Szkolenie przeprowadził Marcin Najder (techblog), ale zanim przejdę do konkretów najpierw kilka spraw "formalnych". Szkolenie odbyło się w Warszawskiej siedzibie firmy, przy ul. Leśna 2 (przecznica ul. Puławskiej 525), czyli... na Ursynowie, przy ul. Puławskiej, drugie światła od zjazdu z południowej obwodnicy Warszawy, czyli... bardzo dobra lokalizacja dla zmotoryzowanych (w okoliczny jest gdzie zaparkować).
Co do oferty szkoleniowej, to można ją przejrzeć tutaj, natomiast szczegóły szkolenia, na którym ja byłem, można obejrzeć tutaj. Pod każdym szczegółowym opisem szkolenia jest niebieski przycisk "Terminarz i Rejestracja", więc jeżeli ktoś jest zainteresowany, to wiadomo co i jak.
Jeżeli chodzi o samo szkolenie, to nie będę ukrywał, że cena 3 dniowego szkolenia, była jak na Warszawę bardzo konkurencyjna (w promocji, 1400zł + VAT).
A jak wyglądało samo szkolenie?
Należy zacząć od tego, że sam prowadzący, to bardzo sympatyczny, a przy tym doświadczony programista. Prawdziwy pasjonat w swoim fachu, fan zarówno języków funkcyjnych jak i obiektowych i to m.in. próbował nam przekazać podczas szkolenia. Ponieważ w naszej 7 os. grupie, były os. o bardzo zróżnicowanym doświadczeniu programistycznym, Marcin musiał się nieco wysilić, szczególnie że był niemal przez cały czas pod porządnym gradobiciem pytań.
Były więc os. zaraz po studiach (i kursie podstawowym), które prosiły o więcej wyjaśnień związanych z lambdami, delegatami itp., jak i doświadczony programista PHP pragnący spróbować swoich sił w .NET, jak i 2-3 bardziej doświadczonych programistów, pytających co chwila o bardziej zaawansowane tematy oraz różnego rodzaju "wątki poboczne".
Na wszystkie te tematy, prowadzący odpowiadał spokojnie i rzeczowo. W efekcie, w trakcie kursu, przerobiliśmy też fragment "kursu podstawowego", to co było w agendzie związane z zaawansowanymi aspektami programowania w .NET (linq, lambdy, refleksja, więcej lambd, T4, wzorce projektowe, programowanie współbieżne, jeszcze więcej lambd itp. ;)), ale również tematy okołoprogramistyczne, takie jak np. rozproszone kontrole wersji (github, bitbucket), "NoSQL" (MongoDb, RavenDb), JSON, frameworki javascriptowe (Angular.JS, Node.JS). Wspomniany został nawet ServiceStack (niestety aktualnie płatny) Jeżeli doliczymy do tego ćwiczenia praktyczne z wykorzystaniem nUnit oraz Resharpera, oraz rozmowy programistyczne oraz około programistyczne, czy w czasie kursu, czy też w czasie wspólnego posiłku to daje nam naprawdę intensywnie spędzone 3 dni..
Wprawdzie to nie Ja płaciłem za szkolenie(firma płaciła), ale uważam, że naprawdę warto było pójść na to szkolenie. Fajnie jest przebywać w towarzystwie inteligęnych (i nierzadko mądrzejszych) ludzi od siebie i tak "na spokojnie" się czegoś nowego dowiedzieć/nauczyć. Taki miłe urozmaicenie w stosunku do samotnego przerabiania tutoriali / dokumentacji / oglądania podcastów w domu ;)
Z tego co Marcin mówił, to obok pracy na etacie, prowadzi również szkolenia ASP.MVC, programowanie reaktywne, jak i kurs podstawowy. Inna sprawa, że kurs podstawowy, czasami prowadzi też inna zupełnie inna osoba.
To tyle. Gdyby ktoś kiedyś miał okazję udać się na takie szkolenie, to szczerze polecam. Fajnie było :)
Subskrybuj:
Posty (Atom)