niedziela, 28 kwietnia 2013

Spotkania z "Brown Bag"

Brown Bag to potoczna nazwa opakowania na lunch.



Brown bag seminar to szkolenia albo sesja informacyjna o rzeczach związanych z pracą zorganizowana podczas obiadu. Seminarium ma taki minus, że jest to spotkanie, które trwa koło godziny.
Brows Bag Meetings to spotkania, gdzie dowolna osoba może przedstawiać ważne informacje w ciągu trwania luncha (w praktyce 15 minut).



Dużym plusem takich spotkań jest transfer informacji wśród ludzi pracujących w firmie. Czasami tak jest, że 2 sąsiednie zespoły w obrębie jednej firmy nic o sobie nie widzą. Bardzo podobnie jest z scrum meetings, gdzie każda osoba w zespole wie co robi inna osoba, ale w firmie mamy kilka projektów, to zwyczajny pracownik nie ma bezpośredniej możliwości dowiedzenia się co dzieje się w innych projektach. Oczywiście jest Scrum of Scrums Meeting, ale na tych spotkaniach jest transfer informacji na wyższym szczeblu. Brown Bag Meetings daje możliwość wszystkim pracownikom udziału w życiu firmy.

sobota, 6 kwietnia 2013

Architekt jest jak ogrodnik

Bardzo mi się podoba metafora "architekt jest jak ogrodnik". Ogrodnik powinien pielęgnować ogród. Architekt powinien pielęgnować architekturę.

Problem może pojawić się, kiedy mamy architekta, który mówi, że wszystko jest ok, nie trzeba modernizować starego systemu, manualne czynności nie muszą być zautomatyzowane, projekt działa wystarczająco szybko, nie jest potrzebna reużywalność i tak dalej... To tak samo by było, gdyby ogrodnik nie chciałby wyciąć drzewa, które zagraża życiu ludzkiemu, przesadzić suche i brzydkie kwiatki czy podciąć zarośnięty żywopłot i nie dba o dróżki prowadzące przez ogród.

Z drugiej strony mamy architekta, który od nowa chce stworzyć system, zastosuje technologie jakie są teraz modne, a stary system z przyjemnością by usunął. Tak samo jest z ogrodnikiem, który chce wyciąć wszystko i od nowa posadzić nowe roślinki (oczywiście ogrodnik ten nie zna do końca wymagań wszystkich rośliny). Można zrobić fantastyczne ogrody tak jak labirynt znajdujący się w Kurozwękach czy ogród Herrenhäuser w Hannoverze, ale koszt utrzymania takiego ogrodu jest bardzo duży.


Pamiętaj, "architekt jest jak ogrodnik, pielęgnuje architekturę systemu".

Zapomniane C5

C5 oznacza Copenhagen Comprehensive Collecton Classes for C# i jest to biblioteka składająca się z generycznych kolekcji. C5 daje Ci większą kontrolę nad selekcja danych w kolekcjach. Programista może zdecydować czy chce mieć kolekcje zaimplementowana na funkcji haszującej (hash-based), drzewa (tree-based), tablicy (array-based) czy na LinkedList-based.


Mimo tego, że C5 ma duże zastosowanie w problemach wydajnościowych, mam wrażenie jakby biblioteka nie była popularna i projekty nieakademickie nie chcą korzystać z niej.

piątek, 5 kwietnia 2013

Najlepsze praktyki dla System.Collections.Generic

Krótko chciałem napisać 13 najlepszych praktyk przy używaniu generycznych kolekcji.

1) Nie używaj generyków jeżeli wiesz, że nie potrzebujesz
2) Używaj Stack<T> do implementacji list LIFO
3) Używaj Queue<T> do implementacji list FIFO
4) Używaj List<T> do implementacji listy z losowym dostępem do danych
5) Używaj LinkedList<T> jeżeli potrzebujesz dodawanie lub usuwanie elementów na brzegach listy
6) Używaj HashSet<T> jeżeli lista nie ma duplikatów lub potrzebujesz szybki zbiór danych
7) Używaj foreach na kolekcji kluczy zamiast używać pętli for po IDictionary<TKey,TValue>
8) Nie używaj metody ElementAt() czy ElementAtOrDefault()
9) Używaj dedykowanej klasy zamiast Tupli z dużą ilością parametrów.
10) Używaj SortedDictionary<TKey,TValue> jeżeli potrzebujesz mieć posortowane elementy
11) Używaj SortedSet<T> jeżeli potrzebujesz posortowany zbiór danych
12) Używaj KeyValuePair<TKey,TValue> zamiast Tuple<T1,T2>
13) Jeżeli implementujesz po interfejsie IEnumerable<T> to również zaimplementuj IEnumerable(z powodu wstecznej kompatybilności)


wtorek, 2 kwietnia 2013

Wykład Jacka Walkiewicza z pełną mocą


Dzisiaj widziałem prezentacje Jacka Walkiewicza. Wykład był o spełnianiu marzeń, strefie komfortu i ufaniu sobie.




Wywiad z Panem Jackiem można przeczytać na tej stronie. Jest też jeszcze drugi filmik. Bardzo polecam obejrzenie tych TED prezentacji.



niedziela, 31 marca 2013

Get-Date w PowerShell

Get-Date jest poleceniem wyświetlającym aktualną date i godzinę. Zamiast Get-Date możesz użyć [DateTime]::Now. Przy okazji muszę się przyznać, że zawsze mam problemy z formatem datetime dla Get-Date.

Co ciekawego można zrobić z Get-Date. Na przykład możesz sprawdzić jakie procesy działają dłużej niż dany okres czasu. Stwórzmy zmienną $1HourFromNow, która będzie trzymała date przed 1 godziną i wybierzmy wszystkie procesy, które jeszcze działają.
PS>$1HourFromNow = (get-date).AddHours(-1)
PS>Get-Process |where {$_.StartTime -ge $1HourFromNow }

Innym ciekawym skryptem jest wybranie wszystkich plików z danego katalogu, które w przeciągu ostatniego dnia był modyfikowane.
PS> $1DayFromNow = [DateTime]::Now.AddDays(-1)
PS>gci -recurse | where {$1DayFromNow -le $_.LastWriteTime }

Power Collections

Power Collectons jest biblioteką powstałą w 2005 roku na platformie .NET Framework 2.0 napisanej przez firmę Wintellect. Jest to zapomniana biblioteka. Była napisana, kiedy jeszcze nie było LINQa.
Za pomocą tej biblioteki możesz wykonać iloczyn kartezjański dla kart:
var kolory = new List<string> {"Trefl", "Karo", "Kier", "Pik"};
var figury = new List<string> {"As", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Walet", "Dama", "Król"};

var karty = Algorithms.CartesianProduct(figury,kolory)
    .Select(x=>x.First + " " + x.Second)
    .ToList();

foreach (var karta in karty)
{
    Console.WriteLine(karta);
}
I jeszcze potasować te karty i zagrać w pokera :)
var kartyNaFlopie = Algorithms.RandomSubset(potasowaneKarty, 3);
foreach (  var karta in kartyNaFlopie)
{
    Console.WriteLine(karta);
}
Oprócz tego za pomoca Power Collections możesz dokonać rotacji listy.
string word = "Arkadiusz Beer ";         
for (int i = 0; i < word.Length; i++)
{
    var builder = new StringBuilder();
    Algorithms.Rotate(word.ToList(), i)
        .ToList()
        .ForEach(c=> builder.Append(c));
    Console.WriteLine(builder);
}

Power Collections posiada typy, jakich może ci brakować w BCL (m.in. MultiDictionary<TKey, TValue> czy OrderedBag<T>). Zachęcam za do sprawdzenia tej biblioteki.