Blog Kokosa

.NET i okolice, wydajność, architektura i wszystko inne

NAVIGATION - SEARCH

Pro .NET Memory Management oficjalnie wydany!

Oficjalnie mogę już ogłosić, że moja książka została opublikowana! Jest dostępna w sprzedaży w różnej formie, na różnych sklepach. M.in. na Amazon czy stronie wydawcy Apress. Więcej szczegółów jest też na mojej dedykowanej stronie. Być zatem nie może, że nie napiszę o tym ważnym wydarzeniu na mojej blogu! Żeby nie czynić tego tekstu nudną ścianą tekstu, proponuję krótkie Q&A. Pytania wymyśliłem sam:)

Dlaczego ta książka jest taka duża?!

To pierwsze pytanie, które może się Wam nasunąć. Na Twitterze wiele osób "śmieszkuje" z jej rozmiaru. Fakt, te ponad 1000 stron i ponad kilogram wagi robi mogą robić pewne wrażenie, nawet na mnie! Nie było moim celem napisanie takiej dużej książki, nie wyznaczałem sobie żadnych celów na tym polu. Ale też żadnych granic. Po prostu chciałem napisać to co wydawało mi się istotne i przydatne w kontekście pamięci w .NET. A że temat jest naprawdę obszerny, gdy się w niego wgłębić, to oto i efekt. Innymi słowy, nawet patrząc na ten kilogram tekstu, nie widzę większych fragmentów, których bym chciał się pozbyć. Może poza paroma drobnymi fragmentami, które bym napisał zwięźlej. Ale to nie zrobiłoby wielkiej różnicy. 

Nakłada się na to jeszcze aspekt samego wydawcy. Początkowo spodziewałem się około 500 stron, ostatecznie skończyłem na 800. Ale w trakcie tych ponad dwóch lat pisania Apress zmienił szablon swoich książek. Na prośby czytelników zwiększył czcionki, trochę marginesy - podobno źle się ludziom czytało drobny maczek. Ja go osobiście lubię ale pola do negocjacji nie było wiele. Książka z dnia na dzień z 800 stron przekształciła się w... 1200 stron. Na szczęście drobne sugestie z mojej strony zredukowały tę liczbę do obecnych 1072!

Osobiście ostatecznie się z tego cieszę. Książka ma przynajmniej jakiś swój, rozpoznawalny charakter :)

Co jest w tej książce, a czego tam nie ma?

Można się spotkać z głosami, że skoro zarządzanie pamięci w .NET jest automatyczne, to o czym tam pisać te tysiąc stron? I tak i nie. Automatyczne zarządzanie pamięcią i Garbage Collector są wygodną dla programisty abstrakcją. Ale jak każda abstrakcja, wcześniej czy później zaczyna ona przeciekać. Programując coś więcej niż projekty na studiach, prędzej czy później, bardziej lub mniej, w końcu zderzamy się z takimi przypadkami. Okazuje się, że warto lepiej zrozumieć jak coś działa i jak tego używać - nawet jeśli jest "automatyczne". 

Poza tym, "zarządzanie pamięcią" to nie tylko GC. W książce opisuję pojęcia finalizacji, po co jest IDisposable, po co są struktury. Co się ostatnio w C# zadziało na tym polu. Po co jest i jak działa Span<T>.

Co więcej, jedną z głównych moich ambicji wobec tej książki było nie tylko opisanie jak coś działa, ale również dlaczego zostało tak zaprojektowane. Ta książka ma dać Wam poczucie, że rozumiecie nie tylko .NET GC ale każdy inny napotkany potem GC będzie również dla Was łatwiejszy do zrozumienia. 

W książce nie zrealizowałem natomiast jednej z moich pierwotnych ambicji - obszernego porównania .NET GC z innymi GC. I dobrze. To zbyt obszerny temat i do tego niezbyt praktyczny dla programisty .NET. Jest to fajny temat na osobną książkę hmm.... Pierwotnie też, będąc m.in. pod wrażeniem książki The Garbage Collection Handbook i jej akademickiego "sznytu", sam chciałem zawrzeć dużo więcej teorii u siebie. Pierwotnie wręcz książka była podzielona na część "teoretyczną" (co i jak z GC) i "praktyczną" (implementacja w .NET). Ale nijak mi się to nie spinało. Pierwsza część byłaby nudna i niepraktyczna, a jednak wymagana do zrozumienia części drugiej. Ostatecznie więc gdzieś się one przenikają w każdym rozdziale (przy znacznym uszczupleniu części teoretycznej). I też dobrze!

Czemu od czerwcowego wpisu o napisaniu książki, dopiero teraz trafia ona do odbiorców?

Jak widać prace teoretycznie skończyłem już w czerwcu [http://blog.kokosa.net/post/jak-idzie-pisanie-czyli-co-to-znaczy-100] więc skąd takie opóźnienie?! Otóż samo napisanie tekstu to jedno, ale potem przerzucenie go przez tryby recenzji, poprawek i zatwierdzania - to drugie. Teoretycznie czas ten nie wymagał z mojej strony wiele pracy, z wyjątkiem kilku okresów bardzo intensywnego "zatwierdzania". Jednak jeśli dodać do tego tworzenie stron, marketing i inne sprawy formalne - nadal tak naprawdę "pracowałem nad książką". 

Jak wyglądał proces pisania, ile to zajęło? Jak wybrałem wydawcę? Czemu nie self-publishing? Ile zarobiłem?!

Są to wszystko świetne pytania. Na tyle, że planuję większy post-retrospektywę na ten temat. Z niego dowiecie się wszelkich szczegółów jak to u mnie wyglądało. 

--

A może Wy macie jakieś pytania? Na wszystkie chętnie odpowiem. Szczególnie na te związane z procesem wytwórczym, na które odpowiem we wspomnianym dedykowanym poście. Czekam też na pierwsze recenzje na Amazon albo Goodreads (najlepiej pozytywne)!

Powoli wracam... m.in. na .NET Developer Days!

Choć już raz pisałem o skończeniu prac nad książką, był to wtedy tylko pewien ważny etap prac - skończenie pisania treści jako takiej. Od połowy czerwca do połowy sierpnia trwał żmudny proces kolejnych iteracji korekt, uwzględniających uwagi recenzentów. I ten etap mam już właściwie za sobą. Teraz mogę powiedzieć w pełni prawdziwie - nie pracuję już nad książką! Dalsze prace są teraz po stronie wydawnictwa...

W związku z tym powoli wracam do życia zawodowego i... właściwie każdego innego. Ponieważ prace nad książką były bardzo wyczerpujące (również finansowo), muszę się teraz odrobinę skupić na innych rzeczach (np. zarabianiu ;)). M.in. do końca roku mam już zarezerwowanych kilka bardzo fajnych szkoleń z ramienia Bottega IT Minds

Z tego też względu mój jesienny prelekcyjny kalendarz wygląda bardzo skromnie. Występuję do końca roku 2018 tylko trzy razy w Polsce. Na wiele konferencji CFP w ogóle nie wysłałem, kilku odmówiłem (kiedyś nadrobię!). Dlaczego zdecydowałem się jednak na te trzy wystąpienia i gdzie one będą?


Pierwsze to, nie bójmy się tego powiedzieć, pewne spełnienie moich marzeń - wystąpienie na .NET Developer Days. Moim zdaniem to najciekawsza ogólnie-.NETowa konferencja w Polsce. Duże wydarzenie, z dużym rozmachem, świetni prelegenci (w większości o dużej renomie międzynarodowej). W zeszłym roku byłem członkiem rady programowej, mając realny wpływ na treści tam wygłaszane. Była to spora frajda, mieć wpływ na tak dużą i cenioną przeze mnie konferencję.

Jednak od lat sobie obiecywałem, że "kiedyś tu wystąpię". I udało się! W tym roku możecie mnie posłuchać - według agendy - pierwszego dnia o 15:20 w sali B. Przygotowuję na tę okazję całkiem nowy temat, oczywiście w ramach ulubionych przeze mnie tematów .NET-internalso-wydajnościowych:

Całą agenda wygląda dla mnie ciekawie - ja z chęcią zostanę na konferencji na oba pełne dni. Zapraszam - jeśli tam będziesz - podchodź, zagaduj! Chętnie opowiem jaką frajdą jest pisanie książki...

Drugie wystąpienie to Umbraco Poland Festival. Co ja mam wspólnego z Umbraco? To, że stoi na .NET więc można się przyjrzeć jego wydajności :)

Ostatnie wystąpienie to konferencja... którą samą współorganizuję. Ale to już zasługuje na jeszcze jeden, osobny post.

Do zobaczenia, gdzieś tam!


.NET Developer Days 2016 - wywiad

Pisałem, organizowałem konkurs, aż w końcu konferencja .NET Developer Days 2016 stała się faktem. Mi się osobiście podobała. Dużo "mięsa" o .NET i C#, profil zdedydowanie bardziej techniczny niż w zeszłym roku. Warsztaty z Tedem Newardem, które odbyły się dzień wcześniej też mi się podobały. Choć spodziewałem się więcej ale może po prostu za dużo już w tym siedzę, żeby dać się łatwo zaskoczyć. W każdym razie możliwość wymiany choćby kilku zdań z nim czy Jonem Skeetem to atrakcja sama w sobie. Najmilej zaś wspominam dużo lepsze after-party niż w zeszłym roku, w tym samym miejscu co sama konferencja. Mnóstwo okazji do ciekawych rozmów!

Ja natomiast chcąc jakoś zamknąć moją współpracę z organizatorami, poprosiłem o wywiad z "dyrektorem naczelnym" tego zamieszania - Maciejem Pileckim. Zapraszam do lektury! Więcej...

Konkurs - .NET Developer Days 2016

Pisałem na początku lipca, czemu to warto wybrać się w październiku do Warszawy na konferencję .NET Developer Days. Obiecałem też wtedy konkurs, w którym wygrać będzie można jedną wejściówkę na to zacne wydarzenie.

Najwyższa pora ten konkurs ogłosić. Myślałem, myślałem, co by tu zrobić by nie było nudno. I wymyśliłem. Obecność m.in. Jona Skeeta i Teda Newarda, a zwłaszcza przedkonferencyjny warsztat całodniowy tego drugiego, to bliski mojemu sercu temat "internalsów" .NETa. W związku z tym, konkurs będzie zabawą w tym obszarze, a konkretnie próbą napisania jak najgorszsego kodu ukazującego problem ukrytych alokacji. Poprzez taką paradoksalną zabawę trochę się pouczymy, a ktoś wygra wejściówkę o wartości 1200 PLN! Więcej...

.NET Core - kompilacja, uruchomienie, debuggowanie

Dziś chciałbym Was przeprowadzić przez proces skompilowania, uruchomienia i debuggowania .NET Core - czyli wersji open source środowiska .NET. Bez zbędnych wstępów przejdźmy do odpowiedzi na proste pytanie...

Po co?

Żeby bawić się, żeby bawić się, żeby bawić się na całego. Mamy źródła .NETa! Po co nam je kompilować? Żeby grzebać, zmieniać, analizować, psuć - aż w końcu wynajdziemy dla siebie miejsce na Pull Request i zapiszemy się w Hall Of Fame, a nasz kod powędruje na miliony komputerów na całym świecie!

A nawet jeśli nie mamy tak ambitnych planów, czy nie fajnie popatrzeć "do środka", jak działa .NET? Oczywiście CoreCLR to nie jest kod komercyjnego .NETa jeden-do-jednego. Ale zdecydowana większość trzewiów jest taka sama, więc jest się czym bawić. Na stronie .NET foundation mówią wprost:

.NET Core has two major components. It includes a small runtime that is built from the same codebase as the .NET Framework CLR. The .NET Core runtime includes the same GC and JIT (RyuJIT), but doesn’t include features like Application Domains or Code Access Security. (...)

.NET Core also includes the base class libraries. These libraries are largely the same code as the .NET Framework class libraries, but have been factored (removal of dependencies) to enable us to ship a smaller set of libraries.

Jeśli zatem coś nas pociąga w spojrzeniu w kod frameworka, którego używamy od lat, mamy ku temu okazję. Więcej...

NDepend - spojrzenie na .NET Core

Czy znacie narzędzie NDepend? Służy do statycznej analizy jakości kodu. Istnieje w świecie .NET już od wielu lat i zyskał zasłużoną renomę. Pisał o nim ostatnio Piotr Gankiewicz, zwycięzca konkursu Daj się poznać, którym przeanalizował swój projekt Warden. I mi nadarzyła się okazja by przyjrzeć się temu narzędziu bliżej. Kilka lat temu bawiłem się nim na potrzeby analizy projektów w pracy. A teraz zapragnąłem nim przebadać coś nieswojego, coś dużego - .NET Core. Jesteśmy szczęściarzami, że żyjemy w czasach, w których .NET ma swoją wersję Open Source. A skoro tak, to kto nam zabroni ocenić jakoś kodu pisanego przez sam Microsoft i zebrane wokół community? Warto tu nadmienić, że NDepend potrafi analizować skompilowane assembly więc tak naprawdę nie musiałbym się ograniczać do .NET Core tylko wziąć na tapetę ten komercyjny, dojrzały .NET Framework. Ale uważam, że podpatrzenie tego, co możemy ew. zmienić jest po prostu fajniejsze. Więcej...

.NET Developer Days 2016 - za 102 dni!

Czas naprawdę "szybko leci". Prawie jak wczoraj pamiętam udział w konferencji .NET Developer Days 2015, a tutaj już na poważnie rozkręciła się organizacja tegorocznego wydarzenia. Było ciekawie, więc z dużym zainteresowaniem śledziłem doniesienia organizatorów na temat tego, co szykują w tym roku. Poprzednią edycję szczegółowo opisałem we wpisie ".NET DeveloperDays - debriefing". Zapraszam do jej przeczytania, ale podsumowując - atmosfera, jedzenie, prelegenci - wszystko na plus. Było to duże wydarzenie, w którym uczestniczyło około 500 developerów. W ciągu dwóch dni, w dwóch ścieżkach, odbyło się w sumie 20 prelekcji, w tym gości takich jak Scott Hanselman i Scott Hunter. Swoją drogą, można je już obejrzeć na Channel 9. Ja najbardziej polecam "Scaling Yourself: Information Overload and Personal Productivity" Scotta Hanselmana na temat osobistej produktywności i rozwoju. Sesja bardzo w tematach, o których pisałem w "Jak się rozwijać" oraz "Technika Pomodoro (...)". Więcej...

Advanced .NET Debugging - recenzja

Nie wiem czy macie prawo jazdy, ale nawet jeśli nie, to pewnie zrozumiecie wysublimowaną analogię, którą zaraz przeczytacie. Otóż jeżdżąc samochodem i mniej więcej kojarząc przepis drogowe, możemy jeździć z powodzeniem całe życie. Jednak chcąc być profesjonalnym, zawodowym kierowcą-wyjadaczem, spędzającym w samochodzie całe dnie, prędzej czy później ubrudzimy sobie ręce smarem, grzebiąc w silniku. Podobnie widzę życie .NET developera. Zdecydowana większość może "jeździć" bardzo dobrze, znając składnię, wzorce projektowe, sztuczki i kruczki. I będą profesjonalistami. Ale jest mniejsza grupa geeków, nerdów, wyjadaczy, którym to nie wystarcza. Chcą zrozumieć internalsy CLR, chcą wiedzieć jak to wszystko działa pod spodem, jak wgrzebać się w pamięć i jak używać tak surowych narzędzi jak WinDbg. Osobiście myślę, że to jest po prostu ciekawe i każdego może kiedyś zainteresować, choćby na chwilę. Popularność czerwcowych devWarsztatów, które ja oraz Sebastian Solnica zdecydowaliśmy się poprowadzić, niejako to potwierdzają.

Dla takich osób istnieje książka, którą mogę z czystym sumieniem polecić - tytułowe Advanced .NET Debugging autorstwa Mario Hewardta. Więcej...

WPF i komponent do grafów

Trochę sporo ostatnio czasu w ramach projektu poświęciłem na naprawianie biblioteki ClrMd i pisania poradników o GitHubie. W ramach rdzennego rozwoju projektu skupiłem się na neo4j, teraz pora najwyższa wrócić do interfejsu i zastanowić się nad ważnym pytaniem - czego użyję jako biblioteki rysującej grafy. Na pierwszy ogień poszło przeglądanie “internetów” i wyszukanie opcji, których będę mógł użyć w WPF. Wynik tych poszukiwań nie jest przytłaczający. Wygląda na to, że jest pewne pole do popisu dla osoby, która napisze funkcjonalny i ładny komponent WPF do rysowania grafów. Ja w ramach tego projektu nie mam na to czasu, więc pozostaje mi korzystać z gotowców. Więcej...

MemoryVisualizer - Neo4j, .NET i GitHub

neo4j

Jak już nie raz wspominałem, chciałbym by sercem MemoryVisualizera był język zapytań oparty o Cypher, a właściwie leżąca pod spodem baza grafowa Neo4j. Ma mi to zapewnić dużą ekspresyjność zapytań oraz (mam nadzieję) dużą szybkość działania. Tutaj pojawia się pewien drobny temat do przemyślenia. Neo4j napisany jest w Javie i szczęściarze piszący w tym języku mogą załączyć ten silnik jako część swojej aplikacji. Niestety w aplikacji .NETowej o takim self-hostowaniu nie może być mowy. Portu Neo4j na .NET nie ma, choć pojawiły się i takie pomysły, np. w formie Neo4Net. Ciekawa dyskusja na ten temat odbyła się na grupie lists.neo4j.org. Więcej...