wtorek, 22 września 2015

Do czego służy małpa w c# csharp?

Do czego służy małpa csharp?

Małpa charp ma 2 zastosowania:
1) Kiedy potrzeba zdefiniować stringa dłuższego niż na jedną linijkę (lub po prostu pociętego)
string txt = @"ala
ma 
kota";
Przy okazji w stringu z małpą csharp’pie jeśli użyjemy cudzysłowu \” to będzie go trzeba zamienić na podwójny „”
string txt =  "tytuł: \"Programista\"";
string txt = @"tytuł: ""Programista""";
2) Drugim zastosowaniem „małpa csharp” jest użycie zmiennych, które chcemy nazwać jak słowa kluczowe, np.:
string class = ""; // wygeneruje błąd podczas kompilacji
string @class= ""; // poprawnie
Bonus: bardzo dobrze jest używać małpy na początku stringów wtedy gdy tworzmy wzorce wyrażeń regularnych. Odpada nam pilnowanie znaków zaczynających się od „\”.

niedziela, 20 września 2015

C# null

Czyli wszystko co chcielibyście wiedzieć o null w c# a NIE boicie się zapytać

Na wstępie trzeba napisać oczywistą oczywistość: NULL jest w C# wartością... pustą.
Null może wystąpić w typach referencyjnych jak i "wartościowymi" (Reference types / Value types). Do typów wartościowych można go przypisać na 2 sposoby:

int? i;

Nullable i;

Obie linijki robią to samo.

Dla typów referencyjnych będzie to po prostu:
Object o;
 
W kodzie bardzo często można zauważyć notoryczne sprawdzanie czy czasem jakiś obiekt nie jest nullem.
if (obj == null || i.HasValue) {
//...
}
 
inną techniką jest użycie ?? (dwa pytajniki)
Object result = obj ?? new Object()
 
znaczy: jeśli obj jest null, to podstaw pod result new Object();
Istnieje możliwość jeszcze takiego (pięknego) zapisu):
string result = value1 ?? value2 ?? value3 ?? String.Empty;
 
Nie jest to dobra praktyka tym bardziej, że jeśli gdzieś nie przewidzimy warunku wtedy dostaniemy po oczach wyjątkiem "nullreferenceexception". Dobrą obroną jest utworzenie "specjalnego przypadku" (Special case / Null object pattern). Całość sprowadza się do utworzenia podklasy, reprezentującej wartości "puste", np.:
class Osoba {
   string Imie {get;set;}
   string Nazwisko {get;set;}
}
 
tworzymy reprezentację "nullową/specjalny warunek":
class OsobaNull : Osoba {
   public OsobaNull() {
       Imie = "";
       Nazwisko = "";
   }
}
 
i tylko w jednym przypadku sprawdzamy null, tam gdzie pobieramy obiejkt typu osoba, jeśli tam wykryjemy nulla to zwracamy new OsobaNull() i nigdzie już nie potrzebujemy sprawdzać żadnych warunków. Kod się wykona ale będą tak ustawione wartości obiektu, że kod nic zlego nie zrobi i nie zakończy się błędem.

piątek, 18 września 2015

Entity Framework jak działa metoda Include [c#]

Niebezpieczeństwa w używaniu metody Include podczas budowania zapytań



Kiedy zaczynamy zabawę z Entity Framework'iem w .NET'cie wszystko wydaje się na prawdę proste. Piszemy co chcemy wyciągnąć za pomocą składni LINQ robimy np. wykonujemy zapytanie i już mamy wyciągnięte dane. Lecz do końca nie jest tak różowo jak się nam wydaje. Entity Framework ma taką naturę, że jeśli przestaniemy mu patrzeć na ręce bardzo szybko może nas wprowadzić w poważne tarapaty. Bardzo dobrym pomysłem jest zainstalowanie sobie darmowego Express Profiler i podglądanie jakie zapytania zostają wysyłane do bazy. Czasem na prawdę można się przestraszyć jakie potwory musi przetrawić baza. Począwszy od kilku zagnieżdżeń aż po kilometrowe SELECTy. Trzeba uważać w szczególności na metodę Include, która jest super narzędziem, lecz należy dołączać STARANNIE wyselekcjonowane dane. Trzeba uważać na długie ścieżki. Zamiast pisać

...Include("Osoba").Include("Osoba.Kraj").Include("Osoba.Kraj.Zdjecie")

lepiej jest:

.Include("Osoba.Kraj.Zdjecie")

Wygenerowane zapytanie jest mniejsze a im mniejsze tym lepsze. Dlatego też jeśli to możliwe obcinać SELECTy przez określenie jakie kolumny nas interesują .Select(p => .....)

czwartek, 17 września 2015

Podstawy wyjatków w csharp [c#]

Krótko o podstawach wyjątków (exceptions) w c#

W samym .NETcie istnieje bardzo dużo zdefiniowancyh już wyjątków, które możemy użyć w naszej aplikacji. Dziś skupimy się wyłącznie na podstawowych informacjach. Każdy wyjątek dziedziczy po klasie Exception. Jest to klasa nadrzędna dla exceptionów. Schodząc niżej o jeden poziom następuje podział na: ApplicationException oraz SystemException.

SystemException - po tej klasie dziedziczą wszystkie systemowe (dotnetowe) wyjątki takie jak nasz "ulubiony" NullPointerException. Można w skrócie powiedzieć, iż są to wyjątki dla niskopoziomowych części systemu.

ApplicationException - dziedziczą po niej wyjątki rzucane w wysokopoziomowych częściach aplikacji. Jeśli piszemy jakąś aplikację to dobrze jest aby nasze customowe wyjątki właśnie po niej dziedziczyły. Np. przypuścmy wystąpiła w naszej aplikacji jakaś sytuacja wyjątkowa, wtedy rzucamy naszym własnym wyjątkiem np. CustomException, dziedziczącym po ApplicationException.

Cała moc exeptionów właśnie w hierarchii w ich łapaniu. Dawno temu kiedy jeszcze nie było wyjątków reagowanie na wyjątkowe sytuacje odbywało się przez zwracanie odpowiedniego kodu błędu. Można było się w tym pogubić.

Zobaczmy prosty przykład użycia:
class NameException : ApplicationException {}

//----
// jakieś linie kodu
// i dochodzi do sytuacji wyjątkowej
//----


try{

  if (string.IsNullOrEmpty(name)) {
   throw new NameException();
  }
}catch(NameException ex) {
 // tutaj przejdzie sterowanie
}
catch(ApplicationException ex){ 
 // tutaj nie przejdzie
}
catch(Exception ex) {
 // tutaj tez nie przejdzie
}

Jeślibyśmy rzucili zamiast NameException jakimś innym dziedziczącym po ApplicationException to by wpadło do drugiego catcha. Natomiast wyrzucony wyjątek dziedziczyłby zaraz po klasie Exception to by wpadł do 3 catcha.
Dlatego bardzo ważna jest hieriarchia aby odpowiednio móc przechwytywać i reagować na wyjątki.

czwartek, 28 maja 2015

Bootstrap dobra ksiązka

Bootstrap - Twoje szukanie dobrej książki dotyczącej bootstrapa chyba dobiegło końca

Pamiętam doskonale czasy kiedy jak się chciało stworzyć jakąś aplikację internetową, to nie mogło się obejść bez grafika i "cssmana". W pomyśle na "mega-super-biznes" zawsze istniała skromna pozycja: "grafika + cięcie szablonu". Lecz mimo wszystko rodzi, to problemy czasowo-finansowe. Kto? Jak? Co? Za ile? I dlaczego nie może być taniej i szybciej, przecież pomysł wypali na 100% a kasa i wieczna chwała czeka tuż za rogiem...? ;) Po paru latach na świat przyszedł bootstrap, który wywodzi się z podobnego problemu. W "twitterze" mieli już dość tworzenia osobnych szablonów dla wewnętrznych systemów. Ujednolicenie okazało się zbawieniem...?

Spoglądając na dzisiejsze "startupy" można powiedzieć jedno: bootstrap się przyjął i jest powszechnie stosowany. Ujednolicony html, z jsem tworzą na prawdę całkiem przyjemną strukturę do pracy nawet dla średniozorientowanego programisty, ktory z cssem i htmlem ma niewiele wspólnego. A jeśli doliczymy do tego możliwość zakupu "wypasionych bootstrapów" z themeforest.net, startbootstrap.com etc to już nasze życie programisty posiadającego pomysł na biznes staje się o ciut prostsze (i tańsze zarazem) ;) Podobny układ graficzny wychodzi jedynie na plus dla użytkownika, który wchodząc na taką stronę odnosi wrażenie, że gdzieś to już widział i zna dzięki temu interface. Oczywiście zależy to dużo od szablonu, lecz stosując się do pewnych standardów spokojnie możemy standaryzować internet.

Dla osób chcących poznać dokładnie bootstrapa... dobra książka


C# 6.0 i MVC 5. Tworzenie portali internetowych - opinie / recenzja

Czy warto kupić ksiązkę C# 6.0 i MVC 5. Tworzenie portali internetowych?

Po "nagabywaniu" na facebooku i na niektórych blogach doszedłem do wniosku, że trzeba sprawdzić tę książkę, czy rzeczywiście jest tak dobra jak o niej piszą. W sam raz trafiła się promocja na ebookpointcie z okazji dnia książki (?) jeśli dobrze pamiętam i bam! Za pół ceny można zobaczyć co tam polscy autorzy napisali... nie mam zbyt pozytywnych opinii o polskich autorach książek technicznych niestety (za wyjątkiem Jarosława Zabiełło).

Spis treści prezentuje się imponująco. Mamy przekrój przez język c# od wersji 2.0 po (zapowiedź) 6.0. Wg mnie to bardzo miłe zamieszczać coś w książce o csharp 6.0 jak nawet jeszcze się nie ukazało. Można owszem poczytać na necie co tam się znajdzie, lecz o wiele lepiej raz a dobrze zażyć taką skondensowaną kapsułę. Bardzo dobre wrażenie na mnie zrobiło zamieszczenie wzorców architektonicznych. Mimo, że w asp.net mvc taplamy się wyłącznie w MVC, to można uzupełnić wiedzę o MVP, MVVP (nawiasem mówiąc asp.net mvc, to nie jest tak na prawdę prawdziwy MVC, lecz wzorzec model-2, ale to inna bajka). Cieszy też fakt, że postały pokrótce objaśnione terminy DDD, SOA, EDA. Nie spodziewałem się, że w książce dotyczącej ASP.NET można jeszcze znaleźć opis jak działa i jak jest podzielona cała platforma .NET. Są to takie smaczki tej książki, żadne wodolejstwo.

Książka "C# 6.0 i MVC 5. Tworzenie portali internetowych" wprowadza czytelnika w świat Entity Framework oraz całego stosu webowego. Wystarczająco są opisane każde aspekty, z którymi przyjdzie pracować podczas tworzenia aplikacji internetowej. Nie ma sensu tak na prawdę ich przytaczać bowiem znajdziemy wszystko co jest najważniejsze / najciekawsze np. metody asynchroniczne, cache, bezpieczeństwo, modeview, routing, IoC, ba! nawet znajdziecie zasady SOLID, słów kilka o bazach nieralacyjnych MongoDB, RavenDB.

Czy warto kupić tę książkę? Odpowiedź może być zaskakująca, ale jeśli ktoś pracuje z ASP.NET MVC, parę lat np. od wersji 2.0 czy 3.0 to myślę, że "samoistnie" się nauczył niemal wszystkiego. Natomiast dodatki uzupełni przeglądając wyrywkowo blogi lub jakieś tutoriale. Oczywiście książka usystematyzuje / uporządkuje wiedzie, lecz aż tak tego nie czuć. Natomiast jeśli jakaś osoba czuje, że ma braki np. Entity Framework jest dla niej czarną (lub szarą) magia, chętnie chciałby się dowiedzieć czegoś więcej o MVC jak to działa, jak używać etc to ZDECYDOWANIE MUSI MIEĆ TĘ KSIĄŻKĘ. Czyli, jeśli zjadłeś zęby na ".necie", może warto kupić, lecz jeśli ten świat jest dla Ciebie nowy lub czujesz, że czegoś Ci brak, to śmiało, kupuj bez namysłu.

niedziela, 8 marca 2015

[c#] Entity Framework - Wypisanie wygenerowanych zapytań na ekran

Nie raz podczas pracy z Entity Framework chcemy podejrzeć jak wyglądają wygenerowane zapytania SQL. Może coś nie działa jak tego byśmy chcieli, lub szukamy sposobu optymalizacji zapytania. Na szczęście Entity Framework został bardzo dobrze przemyślany i takie podglądnięcie wygenerowanego/surowego sqla nie stanowi żadnego problemu:

using(var content = new DatabaseContext())

{
  context.Database.Log = Console.Write;
  var user = context.Users.First(); // na ekran trafi wygenerowany select wyciągający pierwszego usera z tablicy
}
 
prawda, że proste? A co jeśli chcielibyśmy zapisywać sobie te zapytania do pliku, aby np. móc przewkleić je do jakiegoś managera SQL w celu analizy? Chłopaki od Entity Frameworka, też o tym pomyśleli:

1) Najpierw trzeba utworzyć swojego Loggera (nic trudnego)

public class Logger
{
  public void Log(string message)
  {
    // w tym miejscu można użyć dowolnej biblioteki do logowania np. log4net, nlog etc
    File.AppendAllText("log.txt", message + Environment.NewLine); 
  }
}

2) Następnie podczepiamy loggera do contextu:

var logger = new Logger();
context.Database.Log = sql => logger.Log(sql);

Gotowe, możemy teraz się cieszyć zapisanym sqlem w logu.

[c#] Stopwatch - jak zmierzyć czas wykonywania kodu

Przestawiam klasę stopwatch do mierzenia czasu wykonywania kodu w c#

Czasy kiedy do mierzenia czasu wykonywania kodu używaliśmy:

DateTime now = DateTime.Now;
// KOD
Console.WriteList(DateTime.Now - now);
bezpowrotnie już minęły. W .NET 4.5 otrzymaliśmy bardzo prostą, gotową do użycia klasę Stopwatch. Dostarcza ona większej precyzji niż zbada z DateTime.Now

Najprostsze użycie tego toola wygląda tak:

Stopwatch sw = Stopwatch.StartNew(); // od razu zegar zostaje wystartowany
// KOD
sw.Stop(); // zatrzymujemy zegar
Console.WriteList("Czas wykonywania: {0}ms", sw.ElapsedMilliseconds);

czego chcieć więcej od tak małej i użytecznej klasy? Oczywiście możemy utworzyć instancje Stopwatch i wykorzystać go kilka razy używając metod Reset() - do zresetowania czasu, Restart() - do resetu oraz natychmiastowego puszczenia ponownie zegara.

Stopwatch sw = new Stopwatch();
sw.Start(); // start zegara
// KOD
sw.Stop(); // zatrzymujemy
Console.WriteLine(sw.ElapsedMilliseconds);

sw.Reset(); // zerujemy zegar
sw.Start(); // start zegara
// KOD
sw.Stop(); // zatrzymujemy
Console.WriteLine(sw.ElapsedMilliseconds);

sw.Restart(); // zerujemy zegar i od razu go puszczamy w ruch
// KOD
sw.Stop(); // zatrzymujemy
Console.WriteLine(sw.ElapsedMilliseconds);

Ta klasa się można domyśleć bardzo dobrze przydaje w badaniu wydajności kodu i wszelakich optymalizacjach.

[c#] Zrozumieć LINQ część 1: Podstawy "czystego" LINQ

Dziś przedstawie podstawy LINQ w .NETcie. Nie ma potrzeby pisać dokładnie co to jest, jak działa, bo na dowolnej stronie poświęconej LINQ można to wyczytać. Bardzo istotną rzeczą jest zrozumienie o co w tym wszystkim chodzi.

Cała zabawa z LINQ polega na wywoływaniu metod/funkcji, aż do osiągnięcia interesuącego nas rezultatu (oczywiście nie jest to całkowita prawda, lecz w tym pierwszym poście wszystko upraszczamy). Schemat działania wygląda mniej więcej tak:

Dane wpadają do metody, która coś z nim robi, następnie wynik przekazuje innej metodzie itd. aż do zakończenia. Można to sobie wyobrazić, iż to działa na zasadzie sekwencji: A -> B -> C -> Wynik

Zobaczmy prosty przykład. Chcemy wygenerować 1000 elementową kolekcję. Bez użycia LINQ zrobilibyśmy zwykłą pętle for z granicą < 1000. To za dużo pisania, wystarczy to zrobić w tak:
Enumerable.Range(0, 1000)

Tak na marginesie w języku ruby (który też zawiera elementy programowania funkcyjnego) bardzo mi się podoba zapis:
5.times {|i| p i}

Znaczy, że to jest w klamrach (bloku) wykona się 5 razy. W csharpie ten sam efekt możemy właśnie osiągnąć przez:
Enumerable.Range(0, 10000000).ToList().ForEach(Console.WriteLine)

Jak widać ruby w tym przypadku (i nie tylko) jest bardzo zwięzły, ale nie o tym języku miało być dzisiaj.. ale wracając do LINQ. Microsoft dał .NETowcom, bardzo potężne i szybkie narzędzie to operacji na wszelakiego rodzaju kolekcjach.

1) Aby wyciągnąć maksymalny element w tablicy wystarczy użyć:
listaIntow.Max(); // jeśli lista zawiera same inty
listaUserow.Max(user => user.Id); // tablica zawiera użytkowników, Max zwróci usera z największym ID

2) Suma:
listaIntow.Sum();
listaUserow.Max(user => user.Id); // suma id

3) Ilość
listaIntow.Count();
listaUserow.Count();

4) Średnia
listaIntow.Average();
listaUserow.Average(user => user.Id); // średnia ze wszystkich wartości user ID

5) Minimum
identycznie jak Max

6) Sortowanie
listaIntow.OrderBy(); // OrderByDescending
listaUserow.OrderBy(user => user.Id); // OrderByDescending(user => user.Id);

LINQ daje nam na prawdę ogromne możliwości, nie wspominając już o PLINQ (paraller linq), ale to temat na osobny post.

Wyobraźmy sobie, że chcemy wygenerować liczby parzyste pomnożone przez 2, a następnie wynik chcemy wypisać w konsoli. Bez LINQ musielibyśmy się trochę upisać aby coś takiego osiągnąć.

Enumerable.Rang(0, 1000).Where(x=> x % 2 == 0).Select(x => x * 2).ToList().ForEach(Console.Write);

Mam nadzieję, że zachęciłem osoby, które jeszcze nie znają świata LINQ do zapoznania się z nim bliżej, w następnym poście spróbuję pokazać praktyczne przykłady użycia.

czwartek, 5 marca 2015

[c# / csharp] Jak zainicjować listę w jednej linijce (inline) w "csharpie"

Inicjowanie listy w inline'owo

C# umożliwia nam zainicjowanie listy w jednej linijce (inline).
Już nie musimy pisać:

List list = new List();
list.Add("a");
list.Add("b");
list.Add("c");

ani robić lekkich haków z array
new List(new string[] { "a", "b", "c"});

wystarczy po prostu napisać:
new List { "a", "b", "c" };

natomiast lista z jakaś naszą klasą po prostu będzie wyglądać tak:

new List {

new User { Id = 1, Name = "UserName1" },

new User { Id = 2, Name = "UserName2"}

});

przyjemnie

środa, 4 marca 2015

Optymalizacja kodu w ruby

Parę ciekawostek odnośnie optymalizacji kodu w ruby

Czasem warto poznać różne "sztuczki" aby przyspieszyć aplikację napisaną w ruby. Przejdźmy od razu do rzeczy:

1. Zamiast używać begin..rescue podczas zabezpieczenia się przed NoMethodError można użyć Object#respond_to?(:metoda)
Przyspieszenie: 10x

2) Jeśli mamy posortowaną tablicę to użycie Array#bsearch zamiast popularnego Array#find przyspieszy niemalże "diabolicznie" ;) Array#find działa w taki sposób, że sprawdza warunek na każdym elemencie, natomiast Array#bsearch (przeszukiwanie binarne) znajduje środek a następnie sprawdza warunek czy wartość jest większa, mniejsza, równa wtedy podejmuje decyzję czy szukać środka w pierwszej części czy w drugiej. Szczegółowe wytłumaczenie można zobaczyć sobie tutaj: http://en.wikipedia.org/wiki/Binary_search_algorithm

3) Zamiast Hash#merge można zastosować Hash#merge! Działa to szybciej dlatego, że merge! wykona operację bez zbędnego kopiowania siebie samego.
Przyspieszenie: 25x

4) Losowa wartość z tablicy. Array#shufle.first - działa w taki sposób, że najpierw alokuje miejsce w pamięci dla kopii tablicy a następnie kopiuje losowo wartości. Jak widać musi sporo pracy wykonać. Zamiast "szufli", można skorzystać z Array#sample
Przyspieszenie: 17x

Ruby ma więcej takich rzeczy, postaram się wyciągnąć podobne, które rozsiane są po różnych konferencjach.

opracowane na podst. https://www.omniref.com/github/JuanitoFatas/fast-ruby/HEAD/files/Rakefile

niedziela, 1 marca 2015

Jak przyspieszyć inicjalizacje obiektów aby szybciej można było utworzyć listy, słownik danych

Jeśli potrzebujecie przechować jakieś dane np. w cache to najpierw je trzeba pobrać i gdzieś umieścić. Przedstawię mały trick. Większość programistów c# (dane wzięte z kosmosu, ale się domyślam, że tak jest) przechwycone dane zapisuje jako klasę by następnie przechowywać je w jakiejś strukturze danych (lista, słownik, tablica). To w większości przypadków jest OK, lecz wyobraźmy sobie, że mamy do zainicjowania kolekcję złożoną z baaaaaaardzo wielu elementów a zależy nam bardzo na szybkości inicjalizacji. Więc zamiast robić:

Enumerable.Range(0, 10000000).ToDictionary(k => k, v => new X(123));

gdzie X jest klasą

wystarczy utworzyć strukturę
        struct Y
        {
            public int Val;
            public Y(int val) {
                Val = val;
            }
        }


 Enumerable.Range(0, 10000000).ToDictionary(k => k, v => new Y(123));

U mnie wzrost wydajnościowy jest niemal 3-4 krotny.

ps oczywiście tytuł jest trochę mylący bowiem struktura (Struct) nie jest obiektem!

Podstawy optymalizacji w C#. Odszukanie elementu z dużego zbioru danych.

Słowniki danych (dictionaries), są używane gdy potrzebujemy bardzo szybkiego dostępu do danych w pamięci. Standardowo można użyć listy:

List users = new List();

....

list.Single(k => k.UserId == 1);

problem tutaj jest taki, że przepatrujemy cały zbiór do momentu aż natrafimy na element spełniający warunek. Jeśli UserId znajdowałby się na samym końcu to zostanie przepatrzona cała lista. Wyobraźmy sobie, ze potrzebujemy co chwilę wyciągać użytkowników po danym ID. Trochę to wypada kiepsko.

Dobrym rozwiązaniem jest skorzystanie np. ze słownika danych:

Dictionary users = new Dictionary();

users[201]; // zwraca użytkownika z UserId 201

działa to na prawdę bardzo szybko.

sobota, 28 lutego 2015

Programowanie serie książek dla początkujących / zaawansowanych

Istnieje na rynku kilka serii książek dla programistów, są to np. serie:

Head First - przeznaczone raczej dla początkujących programistów, ze względu na sposób tłumaczenia poszczególnych zagadnień. Oczywiście serie Head First poruszają przeróżne tematy nawet te zaawansowane, lecz niezbyt dogłębnie. Sposób tłumaczeń dla programistów będący w branży od jakiegoś czasu pozostawia wiele do życzenia. Np. w książce "head first wzorce projektowe" część przykładów jest wziętych z kosmosu. Klasyfikuję te pozycję dla początkujących ew. średniozaawansowanych. Mimo wszystko każdy może sobie poczytać HeadFirsta, ot choćby dla relaksu a nuż znajdziemy coś czego nie wiedzieliśmy.

Osobiście przeczytałem:

Chciałbym zaznaczyć, iż nie był to czas stracony, ABSOLUTNIE.Wiele się dowiedziałem, ale coż, byłem początkujacy. Wiele wyniosłem z HeadFirstów, lecz trzeba było się posiłkować innymi przykładami. Jedną rzeczą którą zapamiętam do końca życia z książki Wzorce Projektowe to "stopnie wtajemniczenia" ludzi poznających wzorce:
  • Początkujacy - widzi wszędzie wzorce i wdraża je tam gdzie się nawet źle sprawdzą
  • Średniozaawansowany - podchodzi już z większym dystansem, modyfikuje je do własnych potrzeb
  • Zaawansowany/Guru - stara się ich w ogóle nie nadużywać. Zawsze trzeba obierać najprostszą drogę do realizacji zadania. Z wzorców czerpie się inspiracje oraz poszerza swoje horyzonty.

O'Reilly Media - większość pozycji z tej serii prezentuje na prawdę bardzo dobry poziom. Jeszcze ani razu się nie zawiodłem na żadnej książce pochodzącej z O'Reilly. W serii można znaleźć książki na prawdę poruszający każdy temat:

  • Techniki optymalizacji stron internetowych na poziomie CSS, JS, konfiguracji serwerów
  • Konfigurowanie serwerów linux/windows i więcej
  • Najnowsze/Topowe technologie typu node.js, ruby 2.X
  • Prace z bazami danych - dosłownie każdą łącznie z bazami NoSQL (mongodb, cassandra itp.)
  • Uwaga! Radzenie sobie z Google SEO :)

Każdy znajdzie coś dla siebie. Książki mają charakterystyczne białe okładki, na których zawsze najdziemy jakieś (dziwne) zwierze.

Ostatnią serię na jaką chciałbym zwrócić uwagę jest seria:
Folwer - przeważnie są to czarne książki ze specjalnym znakiem "A Martin Fowler Signature Book". Przeznaczone dla osób szukających najlepszych rozwiązań oraz chcących się rozwijać. Poruszają bardzo trudne tematy, które nie tak prosto normalnemu programiście przyswoić. Czasem trzeba przeczytać jedną pozycję parę razy po kilku miesiącach wtedy całkowicie można zmienić swoje poglądy na temat wytwarzania oprogramowania. Dla ludzi interesujących się architekturą oprogramowania obowiązkową pozycja jest Patterns of Enterprise Application Architecture. Bogaty zbiór dobrych praktyk i wzorców, dogłębne omówienia zagadnień np. Unit of work, jak stworzyć własny ORM czy też jak radzić sobie z blokadami "optymistycznymi/pesymistycznymi", jaką architekturę dobrać do danego systemu i wiele więcej. A to tylko jedna z pozycji serii. Polecam ją każdemu kto nie chce być tylko programistą w biurze od 9 - 17 a projektowanie/programowanie jest jego pasją.

Warto napomknąć jeszcze serie Roberta C. Martina (aka Unlce Bob), lecz to zostawię sobie na osobny wpis.