fbpx
devstyle.pl - Blog dla każdego programisty
devstyle.pl - Blog dla każdego programisty
38 minut

Relacja z MTS 2010


10.10.2010

Tegoroczna edycja konferencji Microsoft Technology Summit odbyła się 5 i 6 października 2010. Po sieci krąży już sporo wrażeń uczestników, więc i ja, jakom uczynił w roku ubiegłym i przedubiegłym, dorzucę swoje 12 groszy.


Wrażenia ogólne

Na samym początku napiszę jasno: to najlepsza edycja MTS, w której dane mi było uczestniczyć (bywam regularnie od 2008 roku). Wreszcie większość sesji stała na naprawdę zadowalającym poziomie. I… to chyba tyle jeśli chodzi o “dobre wrażenia ogólne”.

Moje (i nie tylko moje) pozytywne odczucia dotyczą w głównej mierze właśnie kwestii merytorycznych prezentowanych na wykładach. Oczywiście na szczęście jest to najważniejsze, bo w końcu zjawiamy się w PKiN po potężną dawkę wiedzy, ale… Jeśli cena zostaje podniesiona o dobre kilkadziesiąt procent, to chciałoby się w jakiś sposób to odczuć.

W aspekcie organizacyjnym nie dostrzegłem niestety żadnej poprawy. Nie dało się zauważyć widocznego skoku jakościowego jeżeli chodzi chociażby o gadżety czy durne kanapki, które były po prostu paskudne.

Dziwi też (nawet słowo “oburza” nie byłoby chyba przesadzone) rezygnacja z udostępnienia online nagrań sesji. Dlaczego? Byłem na konferencji, ale fizycznie nie da się obejrzeć wszystkiego. Webcasty są naturalnym sposobem na nadrobienie tych braków. A w tym roku – niet!

Tragicznie rozwiązano także sposób informowania uczestników o nieobecności niektórych prelegentów – hostessy przed docelową salą szeptały każdemu na ucho tą jakże ważną informację tak, że na dostanie się na inny wykład było już za późno.

Na forum WSS z niemałym rozbawieniem przeczytałem z kolei o podarunku, jaki otrzymali niektórzy “szczęśliwcy”… Czy może ktoś mi wyjaśnić, jaki cel chciała osiągnąć osoba rozdająca ludziom książki o Windows 98? Pachnie mi to sabotażem:).

I obsługa szatni nie grzeszyła niestety nadmiarem pomyślunku. Po odebraniu gadżetów (w postaci plecaka, “masażeru” do głowy:), notesu wystarczającego na szczęście na wszystkie notatki oraz makulatury) wraz ze znajomymi oddałem je do szatni. Wyraźnie poprosiliśmy o oznaczenie plecaka zgodnie z posiadanym numerkiem. I co się okazało przy odbiorze ubrań? Że plecaki były wydawane losowo! Aż trudno mi w taki moronizm i absolutny brak odpowiedzialności uwierzyć! Na szczęście nikt z nas nie umieścił tam telefonu, portfela, żony bliźniego swego ani żadnej rzeczy, która jego jest. Bo by było niemiło.

Kolejne negatywne odczucie to całkowita rezygnacja z sesji kończącej imprezę. Wiem, że w ubiegłych latach Sala Kongresowa bynajmniej nie pękała w szwach z tej okazji, ale… Mimo wszystko moim zdaniem Organizatorowi po prostu wypada powiedzieć kilka słów zakończenia i podziękowań za udział w konferencji. W sumie boli mnie nie tyle brak gorącego “do zobaczenia za rok!” z ust Jacka Murawskiego, co całkowite zepchnięcie na boczny tor konkursu Speaker Idol. Zarówno rok, jak i dwa lata temu, z ogromnym zainteresowaniem oczekiwałem na ostatni element konferencji, czyli zmagania śmiałków mających odwagę stanąć na deskach Sali Kongresowej do walki o przywilej prowadzenia sesji podczas następnej edycji MTS. A tym razem nawet nie byłem w stanie obejrzeć choćby jednego wystąpienia. Nie oszukujmy się, na zatłoczonym korytarzu, podczas przerwy obiadowej, wśród szumu i gwaru nie ma zbytnio warunków do obserwowania tego rodzaju konkursu. A szkoda, gdyż idea jest naprawdę bardzo, bardzo fajna. I uczestnikom jak psu buda należy się większa ekspozycja. Po prostu. Howgh, rzekłem.

A teraz, po wylaniu wiadra jadu, przejdźmy do poszczególnych elementów agendy.


0. Sesja generalna

Jeszcze przed rozpoczęciem właściwej sesji na Sali Kongresowej panował bardzo fajny klimat. Podobnie jak rok temu, na scenę wypuszczono rockowo-popowy zespół wykonujący hiciory wszech czasów. I grali naprawdę dobrze! Wykonanie znanych wszystkim kawałków AC/DC, Bon Jovi czy Europe musiało się podobać. Mały offtop: czy zespół celowo grał tylko kawałki zawarte w Guitar Hero, czy mam po prostu skrzywienie na tym punkcie?;)

Na rozgrzaną występem scenę wkroczył najpierw Jacek Murawski, dyrektor generalny MS Polska. Podobnie jak rok temu poopowiadał nam o swoich spostrzeżeniach dotyczących teraźniejszości i przyszłości świata IT. Pokazano nam też, ileż to kasy Microsoft pompuje w swój dział R&D. Ja osobiście nie do końca rozumiem o co tyle szumu – czy wydanie miliarda dolarów więcej musi równać się lepszym efektom? Co z tego że MS jest na 1 czy 2 miejscu na świecie w tym zestawieniu, skoro Notepad (będący w końcu jednym dużym textboxem) psuje mi układ linii gdy nacisnę Save a instalacja SQL Server przyprawia o mdłości, podczas gdy narzędzia VMware z miejsca 10 czy 15 prostu kocham? Ale kończąc tendencyjne wycieczki – słuchało się tego całkiem przyjemnie.

W dalszej części pokazano nam między innymi nowe ficzery Internet Explorera 9. Przyznać muszę, że zrobiło to na mnie niemałe wrażenie. Jak tak dalej pójdzie, to za kolejne 2-3 wersje faktycznie może z tego wyjść nawet fajna przeglądarka:).

Oprócz IE9 przedstawiono pokrótce Windows Phone 7. Co prawda nie zapamiętałem żadnych konkretów i nic nie wbiło mi się w pamięć, ale z drugiej strony – produkt ten (ani żadne inne jabłkowe, androidowe, wszystkomające telefony za milion PLN, jeśli już przy tym jesteśmy) zupełnie mnie nie interesuje. Cierpliwie czekałem na dalszą część…

… która nadeszła w osobie Davida Chapella. Mówił o Cloud Computing – i całkowicie zauroczył mnie nie tylko sposobem prezentacji, ale także informacjami na omawiany temat. Szczerze mówiąc po opublikowaniu agendy MTS byłem trochę zawiedziony tak przeważającą liczbą sesji dotyczących tej materii. Nie wiedziałem za bardzo co to i nie chciałem się tego dowiedzieć. A Mr. Chapell zmienił moje nastawienie. W wielkim skrócie poopowiadał publiczności o co chodzi z całą tą chmurą, o której tak ostatnio głośno. I zaprosił na swoją sesję w całości poświęconą Windows Azure. Mimo, że podczas organizowania MTSowego kalendarza wybrałem inny wykład, wiedziałem: muszę tam być!

Odnoszę wrażenie, że z roku na rok sesja generalna jest coraz lepsza. Mniej lania wody, a więcej ciekawych prelekcji. Oby tak dalej!

1. “The Windows Azure Platform – a perspective” David Chapell

Tak jak napisałem wcześniej, planowałem obecność na innej sesji. Spontanicznie zrezygnowałem z tematu “Tworzenie wydajnych usług w technologii WCF” (o którym słyszałem zresztą potem same pozytywne opinie) i zdecydowanie nie żałuję.

Przed rozpoczęciem pisania tej relacji przeczytałem sobie własne wrażenia z edycji poprzednich i ze zdziwieniem zobaczyłem, że rok temu uczestniczyłem w wykładzie na ten sam temat. Mało tego – byłem z niego zadowolony! Jak to? Przecież gdy ktoś mówi “Azure” to jedyne co mu odpowiada z mojej czachy do głuche echo. Po tegorocznym MTS na pewno tak nie będzie. Wreszcie wiem i rozumiem o co w tym chodzi! Podoba mi się to i jestem w stanie autentycznie odczuć wielkość rewolucyjnych zmian, jakie cała ta chmura za sobą niesie!

Na początku David wyraźnie postawił krechę pomiędzy trzema modelami “chmury”. Ktoś wreszcie uświadomił mi, że całe to “cloud computing” można zamknąć w trzech dobrze zdefiniowanych kategoriach. Model udostępniający WSZYSTKO, od sprzętu po ostateczną aplikację, to Software As A Service (SaaS). Termin ten nie jest dla mnie nowy, jednak jakoś nigdy nie przypiąłem go do chmury. Przykładem SaaS może być BPOS, czyli Microsoft Business Productivity Online Services and Software. Drugim modelem, gdzie to MY tworzymy aplikację a wszystko inne mamy dostarczone, jest Platform As A Service (PaaS). W tej kategorii znajduje się Windows Azure. Dostawca daje nam wszystko co jest potrzebne do uruchomienia naszej aplikacji – my tylko wrzucamy swoje rozwiązanie i wszystko ma śmigać. Trzeci i ostatni model to Infrastructure As A Service (IaaS), gdzie ze stosiku dostarczanych rozwiązań zdejmuje się wszystko oprócz MASZYNY. Wykupiona maszyna jest NASZA, instalujemy na niej co chcemy i mamy całkowitą dowolność. David podkreślał jednak, że nieograniczone uprawnienia == nieograniczona odpowiedzialność. Nikt nie wgra nam patcha, nikt nie zadba o aktualizację. Usługi w tym modelu proponuje Amazon. Każdy z nich ma swoje zastosowanie i trzeba porządnie zastanowić się który model (o ile którykolwiek) spełni nasze oczekiwania.

Następnie speaker klarownie wyjaśnił, że za ofertą “Azure” stoją tak naprawdę trzy produkty: system operacyjny Windows Azure, rozproszony silnik relacyjnych baz danych SQL Azure oraz infrastruktura do komunikacji pomiędzy aplikacjami, AppFabric. Kolejno zagłębiliśmy się w poznawanie tych komponentów.

Dowiedzieliśmy się, że Windows Azure udostępnia dwa typy maszyn: web role i worker role. Rola web to właściwie dowolna aplikacja hostowana na IIS. Nie musi być to nawet .NET, możemy wrzucić tam PHP czy Ruby. Z kolei worker role to odpowiednik lokalnej usługi windows czy aplikacji konsolowe, która “coś sobie robi”. Takie aplikacje mogą przechowywać dane w specjalnych strukturach: BLOBach, kolejkach (queues), tabelach (tables – nie mają nic wspólnego z tabelami z relacyjnych baz danych, raczej można je traktować jako dokumenty z baz promowanych w ruchu NoSQL) oraz dyskach (drives). Oba te elementy: compute services oraz storage services nazwano wspólnie terminem Fabric.

Jak widać podstawowe składowiska danych są dość nietypowe jak na aktualne realia światka .NET. Dlatego też w ofercie mamy dostępną także relacyjną bazę danych: SQL Azure. Ma ona pewne ograniczenia w stosunku do standardowego Sql Servera, jednak do większości zastosowań powinna się nadawać. I co ważne: protokół komunikacji z tą bazą nie różni się niczym od protokołu komunikacji ze standardową wersją (TDS), więc w większości przypadków jedyna zmiana po stronie aplikacji to podmiana connection stringa. Sweet.

Niewątpliwie przyjdzie nam kiedyś skomunikować ze sobą aplikacje “cloud” z aplikacjami “on-premise” (czyli nie-cloud). Do tego (i nie tylko) celu będziemy mogli wykorzystać ostatni komponent Azure, czyli AppFabric (nie mylić z przedstawianym przy okazji Windows Azure Fabric… jak widać wymyślanie nazw produktów nie jest sprawą łatwą;) ). Składają się na niego szyna komunikacyjna (service bus) oraz usługi uwierzytelniające (access control).

Po przedstawieniu produktu mogliśmy zobaczyć ile to kosztuje. Cennik jest co prawda dostępny online, jednak w ten sposób każdy mógł sobie na gorąco pokalkulować czy rozwiązanie to jest w jego zasięgu czy też nie.

Tak duża dawka informacji nie była o dziwo, dzięki perfekcyjnemu warsztatowi prelegenta, trudna do przyswojenia. W tym momencie w wielu głowach pojawiło się zapewne pytanie: no okej, wszystko pięknie i fajnie, ale co tak naprawdę daje mi ta chmura? Do jakich zastosowań można ją użyć już dziś? Do czego się to nadaje? Nie minęła chwila – i już znaliśmy pogląd Chapella na ten temat. Na kilku slajdach zobaczyliśmy przykładowe scenariusze, gdzie Azure pomógłby rozwiązać realny problem biznesowo-technologiczny. Kilka przykładów: aplikacja o zmiennych potrzebach obliczeniowych (np. system sprzedaży biletów online, gdzie ruch po otwarciu sprzedaży na popularny koncert może krótkotrwale wzrosnąć X razy), startupy (chmura może zapewnić spore oszczędności poprzez zminimalizowanie początkowych inwestycji w infrastrukturę, w myśl zasady: scale fast or fail fast), dodatkowa lokalizacja przechowująca dane, obliczenia równoległe… I tak dalej, i tak dalej. Zobaczyliśmy takich scenariuszy kilkanaście i faktycznie wszystko to miało sensowne ręce i nogi.

Na koniec niespodzianka: na Microsoft świat się nie kończy! Na rynku istnieje już kilka firm oferujących “chmurzaste” usługi. Tak jak pisałem wcześniej, Azure można zaliczyć do PaaS. Amazon oferuje z kolei IaaS. Dodatkowo David wspomniał o AppEngine od Google’a (także PaaS, ale z obsługą jedynie Pythona i Javy, bez oferty relacyjnego składowiska danych) i Salesforce (SaaS jak nic). Super.

Ocena: 9/9 (nie zdawałem sobie sprawy co to jest cloud computing i nareszcie ktoś mi to perfekcyjnie wyłożył, dodatkowo w kontekście szerszym niż tylko oferta Microsoftu)

2. “Cloud Computing. Is it right for you?” John Craddock

Na poprzedniej sesji tak dobrze mi się siedziało, że kolejną również spędziłem na Sali Kongresowej. I znowu chłonąłem wiedzę o Windows Azure. Po potężnej dawce informacji o chmurze nadszedł czas na jej usystematyzowanie.

John Craddock rozpoczął wystąpienie próbując zdefiniować chmurę. Przedstawić analogię do zjawiska, które wszyscy doskonale znamy. Opisać ją tak, aby każdy na swój sposób mógł wyobrazić sobie o co się tak naprawdę rozchodzi. Wybrał zaiste ciekawy sposób na opisanie tego co się wokół nas dzieje. Postawił tezę, że dzięki chmurze moc obliczeniowa jest jak elektryczność. Każdy (w założeniu) ma do niej dostęp. Możemy polegać na jej niezawodności. Możemy dostosowywać pobór mocy do autentycznego zapotrzebowania. Jej wykorzystanie nie niesie za sobą skomplikowanych procedur. I najważniejsze: płacimy za to, co faktycznie wykorzystamy.

Dalsza część tego wykładu w sporej mierze pokrywała się z tym, co wcześniej omawiał Chapell. Ale i tak nie żałuję że byłem na tej sesji. Najbardziej wartościowe było w niej ostrzeganie przed hurra-optymizmem i nieprzemyślanym “wskakiwaniem w chmurę” w 100%. Craddock próbował włożyć nam do głowy mądrą radę: grzechem jest zignorowanie zjawiska, którego jesteśmy świadkami (“the cloud is in it’s beginning, but the cloud is now”), ale nie można dać się ponieść. Trzeba zadać sobie pytanie: “czy chmura może mi jakoś pomóc?”. Odpowiedź “nie” jest całkowicie poprawna i w wielu przypadkach oczekiwana, ale to właśnie ZADANIE PYTANIA jest kluczowe. Jeżeli zdecydujemy się poczekać z wykorzystaniem cloud computing, to zróbmy to w pełni świadomie. “Reframe your thinking – innovate!”.

Przestrogi przed zbyt pochopnym przeniesieniem infrastruktury bądź produktu w chmurę były podparte kilkoma historyjkami. Najbardziej zapadła mi w pamięć opowiastka o drobnodruczkowym dopisku do umowy oferowanej przez Google AppEngine, gdzie co prawda Google deklaruje 99,9999…% uptime, ale pod spodem definiuje downtime jako “nieprzerwany okres 10 minut, podczas którego usługa nie działa”. Nie wiem czy tak jest nadal czy też tak było kiedyś, ale wynika z tego jasno: tak naprawdę aplikacja może śmigać przez 1 minutę a potem paść na 9 minut, i tak w kółko, a umowa nie zostanie złamana.

John uczulał nas też przed ufaniem “w ciemno” dostawcom takich usług. Radził, aby zadawać im jak najwięcej pytań, nie ograniczając się do zapisów umowy. Jak chronione są dane? Co w przypadku wycieku? Czy są prowadzone (ewentualnie dostępne do przejrzenia) logi? I tak dalej, i tak dalej.

Zdarzyły się też nudne momenty, gdy to prelegent zbyt mocno rozwodził się nad jakimiś-tam security, identity etc:). No ale… nie była to sesja dedykowana dla programistów, więc można sie było tego spodziewać.

Ocena: 7/9 (czasami zaoferowanie zimnego, całkowicie wyprutego z marketingu spojrzenia na trendy temat może zapobiec niejednej wielkiej potencjalnej biedzie; tutaj mieliśmy takie spojrzenie przez całe interesujące 75 minut)

3. “Best Practices for Building Fast Web Applications” Pete LePage

Co za dużo to niezdrowo, więc nadeszła pora na krótki odpoczynek od chmury. Bez wahania wybrałem się na sesję Pete’a LePage – człowieka prosto z Redmond, który własne ręce po łokcie macza w Internet Explorerze. Początkowo miałem obawy, że cała sesja zostanie poświęcone jedynie IE, jednak na szczęście zostały one szybko rozwiane.

Pete rozpoczął wystąpienie od zaprezentowania nam z jakich modułów tak naprawdę składa się przeglądarka i jakie czynności po kolei muszą być wykonane, aby końcowy użytkownik zobaczył docelową stronę w okienku. Pobieżnie przelecieliśmy przez cały proces, od momentu pierwszego żądania do wyrenderowania wszystkich elementów na ekranie.

Po takim wstępie w bardzo ciekawy sposób pokazano, które elementy mają największy wpływ na szybkość ładowania strony. Z testu przeprowadzonego na kilku największych stronach z newsami (m.in. NY Times i MSN) wynikało jasno: połączenia sieciowe, javascript oraz kompozycja struktury strony. Jak zatem możemy usprawnić wydajność naszych rozwiązań?

W obszarze ruchu sieciowego pierwsza odpowiedź wydawała się oczywista: korzystajmy z cache! Odpowiednie ustawienie wartości cache w nagłówku HTTP pozwoli na uniknięcie zbędnego pobierania tych samych skryptów, tych samych obrazków czy tej samej treści. Dodatkowo możemy zaoszczędzić ogromne ilości przesyłanych bajtów kompaktując skrypty JS (minifying). Na koniec Pete zalecił mądre wykorzystanie sprite’ów, czyli techniki zbierania wielu mniejszych obrazków w jeden większy i sterowanie ich wyświetlaniem za pomocą CSS (po więcej szczegółów odsyłam do artykułu Jakuba Binkowskiego).

Następnie przyszedł czas na poświęcenie kilku chwil na przy Javascript. Przez moment skupiliśmy się na IE9, dla którego zaimplementowano całkowicie od nowa silnik uruchamiający skrypty. “Chakra” (bo tak się on nazywa) kompiluje javascript przed wykonaniem, co znacznie zwiększa jego wydajność. Ale nie zwalnia nas to z obowiązku odpowiedniego dbania o nasze skrypty. Bardzo ważne jest lokalne deklarowanie wykorzystanych w funkcji zmiennych, aby silnik JS nie musiał za każdym odwołaniem przeszukiwać całego dokumentu w poszukiwaniu używanego symbolu. Słówko “var” ma naprawdę wielką wagę i jego niestosowanie można uznać za bardzo złą praktykę. Mało tego: nawet jeśli w jakiejś funkcji posiadamy pętlę wykonującą inną (na przykład globalną) funkcję, to i tak warto przed samą definicją pętli przypisać ją do lokalnej zmiennej. Pete zwrócił także uwagę na to, aby starannie przeglądać listę dołączanych do htmla skryptów (szczególnie potępione zostały duplikowane referencje do tych samych plików js). Im ich mniej – tym mniej roboty ma przeglądarka i tym więcej czasu może poświęcić na pozostałe czynności związane z obsługą strony.

Pozostało spojrzenie na to, co możemy poprawić jeżeli chodzi o sam proces kompozycji DOM. Najważniejsza porada: nie zmieniajmy wielokrotnie zawartości i pozycji elementów! Nie budujmy zawartości “krokowo”, ciągle przypisując nową wartość do innerHtml – zamiast tego najpierw utwórzmy docelowy string i przypiszmy go tylko raz. Drastycznie zmniejszy to liczbę odrysowań tej części strony.

To wszystko mogłoby się wydawać banalne, ale na pewno wiele osób na sali nauczyło się czegoś nowego.

Dodatkowo bardzo fajnie było na żywo posłuchać, co jeden z twórców IE ma do powiedzenia na temat przeglądarek i internetu. Trochę żałuję że ominąłem dwie inne sesje przez niego prowadzone – podobno były jeszcze lepsze.

Ocena: 8/9 (chciałbym więcej takich prelegentów w przyszłości – nie marketingowiec z wykutymi na pamięć slajdami, a prawdziwy pasjonat pokazujący ludzką twarz Microsoftu; ważne jest, aby programiści używający jakiejś technologii mogli raz na jakiś czas spotkać kogoś kto faktycznie za tym stoi)

4. “Windows Azure – Jak zacząć, komponenty i narzędzia” Bartek Kierun

Jak chmura to chmura – a że jestem programistą to sesji Bartka nigdy nie omijam:). Oczekiwania miałem spore. Liczyłem na to, że naprawdę zobaczymy jak to zwykły dev może usiąść i napisać “rozwiązanie na chmurę”. Niestety, tym razem coś poszło nie tak.

Już na początku przeszkadzało mi trochę dość mało obiektywne wychwalanie firmy Microsoft i jej Azure. Stwierdzenie “jak już wybieramy rozwiązanie cloud computing, to najlepiej wybrać rozwiązanie firmy Microsoft!” niepoparte żadnym argumentem trochę kolidowało mi z tym, co zobaczyłem na poprzednich sesjach.

Zanim dotarliśmy do czegoś dla mnie nowego, po raz kolejny tego dnia posłuchałem o queues, tables, BLOBs itd. Potem jednak zaczęło sie robić interesująco. Bartek pokazał kilka ciekawych narzędzi wspierających programistę, m.in. Azure SDK które umożliwia lokalną symulację całej infrastruktury oferowanej przez chmurę by MS – tak więc każdy może spróbować swoich sił, bez zapisywania się do żadnego programu czy zakładania konta. Oprócz tego przydatne mogą okazać się Windows Azure MMC, SQL Azure Migration Wizard czy masa innych rozwiązań dostępnych na CodePlex.

I jakoś tak sobie sennie ten wykład trwał, aż ludzie zaczęli wychodzić. Bartek próbował ratować sytuację wprowadzając przedwczesne Q&A. Moim zdaniem tak powinna wyglądać cała ta sesja – dopiero wtedy było naprawdę ciekawie. Okazało się, że na sali znajduje się masa pytań czekających na odpowiedź i z pewnością interesująco byłoby poznać je wszystkie. Niestety, trochę za późno.

Ocena: 4/9 (jakoś tak bez przekonania i bez polotu, inaczej niż zwykle – jakby ktoś stworzył prezentację w PowerPoincie i kazał prelegentowi ją wyrecytować)


5. “Silverlight – lekcje odrobione” Bartosz Pampuch

Po imprezowaniu do 2 w nocy wstanie o 6 rano w celu zdążenia na pierwszą sesję może wydawać się wysiłkiem całkiem niemałym. Ale przecież wiemy po co idziemy, często wystąpienia Bartka Pampucha są punktem kulminacyjnym wszelkich konferencji, nie wyłączając MTS. Nawet słówko “Silverlight” w temacie mnie nie odstraszyło. Co prawda nigdy tej technologii nie używałem (i pewnie nigdy jej nie użyję), ale Bartek przyzwyczaił nas do zwiedzania ciekawych aspektów świata .NET wychodzących poza sam tytuł wykładu.

Nie inaczej było i tym razem. Po oryginalnym jak zwykle wstępie (intro w postaci filmiku animowanego zamiast nudnego slajdu “oto ja, hello world”) momentalnie zabraliśmy się za rozkładanie wzorca MVVM (Model View ViewModel) na czynniki pierwsze. Co prawda wśród .NETowców wzorzec ten zdobył popularność głównie dzięki WPF i Silverlight, jednak można go z powodzeniem stosować także w innych scenariuszach (jego główne zasady zostały przedstawione przez Martina Fowlera lata temu pod nazwą Presentation Model).

Na pierwszy ogień poszedł Model. Prelegent słusznie zauważył, że ten element wzorca jest często ignorowany w książkach i tutorialach zajmujących się głównie VVM, określając Model jako “cała reszta”. A to wielkie niedopatrzenie, w końcu Model jest sercem aplikacji i niepoprawna jego implementacja może nieźle zamieszać podczas kodowania pozostałych elementów. Zresztą od razu otrzymaliśmy przykład takiej “nieprawidłowej implementacji”, którą z pewnością można spotkać w większości systemów. Chodzi mianowicie o ręczne dłubanie implementacji interfejsu INotifyPropertyChanged. Wszyscy na sali raczej zrozumieli dlaczego to jest BE. Ale samo powiedzenie “tak nie rób”, bez przedstawienia rozsądnej alternatywy, byłoby bez sensu. Dlatego też Bartek zademonstrował rozwiązanie stosowane u niego w firmie: open-source’owy projekt Business Framework. Rozwiązanie bardzo ciekawe, polecam wszystkim zapoznanie się z oferowanymi przez nie funkcjonalnościami. Pojawienie się tej biblioteki w prezentacji było naprawdę cenne – ja sam miałbym raczej marne szanse na natknięcie się na nią w internecie przez przypadek, ponieważ nawet znając nazwę oraz docelowy framework musiałem się nieźle naszukać, aby trafić na odpowiedni site:).

Zaraz potem zajęliśmy się ViewModelem. Tutaj mogliśmy zobaczyć w akcji kolejną ciekawą bibliotekę: Caliburn Micro. Zaprezentowane możliwości wydały się całkiem potężne i w znacznej mierze redukujące ilość kodu potrzebnego do zaimplementowania powtarzalnych mechanizmów. A to wszystko w 2k liniach kodu! Gdybym miał tworzyć projekt w WPF to po tym wykładzie prawdopodobnie wybrałbym Caliburna zamiast promowanego przez Microsoft Prisma.

Ostatnia część prezentacji, czyli widok, zdecydowanie nie była kierowana do mnie. Nigdy w życiu nie odpaliłem narzędzia Expression i raczej nigdy tego nie zrobię. Silverlightowo-WPFowe czary-mary jakoś mnie nie kręcą;). Mimo to z zainteresowaniem zobaczyłem jak w prosty sposób można dorobić własny edytor do Blenda… a co za tym idzie, także to Visual Studio 2010.

W tym momencie jednak stało się jasne, że publiczność oczekiwała czegoś innego po całym wystąpieniu. Architektoniczne wynurzenia i demonstracje zdawały się jakoś odbijać od sali. Szczerze mówiąc: nie wiem właściwie dlaczego. Przecież to właśnie jest najcenniejsze w takiej konferencji. O magicznych animacjach czy wyklikaniu działającej aplikacji w 10 minut można sobie spokojnie poczytać w internecie, ale nie jest już tak łatwo trafić na okazję posłuchania o rozwiązywaniu faktycznych problemów przez doświadczonego programistę/architekta. I to mówiącego w taki sposób, że nawet ja – świadomie ignorujący zjawisko Silverlight od momentu jego premiery – znalazłem tam bardzo wiele interesujących informacji. 80% sesji określiłbym jako “technology-agnostic”, co powinno cieszyć – a zdaje się, że nie do końca tak było.

Tak czy siak moje oczekiwania zostały spełnione i jeśli za rok Organizatorzy ponownie umieszczą Bartka w pierwszym okienku, nie zawaham się zerwać z boląca głową o 6 rano:).

Ocena: 8/9 (ciekawie, mądrze i – jak zwykle – na najwyższym poziomie; część sali wydawała się mieć jednak – o dziwo – inne zdanie)

6. “Modern Developer Toolbox” Tomasz Wiśniewski

Konkurs MTS Speaker Idol to zacna idea mająca moje pełne wsparcie duchowe. Dlatego też bez wahania wybrałem się na sesję Tomka, zwycięzcy zeszłorocznej edycji konkursu, rezygnując z obserwowania kolejnych wysiłków Bartosza Pampucha. Tytuł “Modern Developer Toolbox” jest bardzo enigmatyczny i właściwie nie miałem pojęcia czego mogę się spodziewać. Tomek mógł równie dobrze zaserwować nam omówienie oklepanych “nowości” w VS 2010, jak i przedstawić kompletnie nieznane zakamary oferty MS.

Na szczęście okazało się, że wybrał właściwą (dla mnie;)) ścieżkę. Z niczym pokazanym podczas tych 75 minut nie miałem wcześniej do czynienia, więc dowiedziałem się całkiem sporo.

Na samym początku mieliśmy okazję poznać nowy typ bazodanowego projektu w Visual Studio 2010 – Data-Tier Application. Szablon ten oferuje automatyczne wdrażanie bazy danych na podstawie przechowywanych skryptów. Daje tez możliwość wpięcia się w proces zarówno przed, jak i po deploy. Wszystko to z pewnością potrafi usprawnić proces tworzenia aplikacji, ponieważ wgranie wszelkich zmian na serwer wiąże się teraz tylko z jednym kliknięciem – nowe tabele i kolumny zostaną automatycznie wygenerowane w bazie. Co prawda każdy szanujący się developer i tak powinien mieć ten proces już w jakiś sposób zautomatyzowany (kiedyś pisałem o tym w kontekście MySQL), ale fajnie było poznać alternatywę dla własnoręcznie klepanych administracyjnych skryptów. Ja osobiście widzę trochę mniej zastosowań dla prezentowanego rozwiązania niż prelegent – jakoś średnio wierzę w to, aby w porządnej organizacji administrator baz danych pozwolił programistom na grzebanie w bazie za pomocą jednego kliknięcia:). Na szczęście z paczki generowanej podczas deploy można wygrzebać wygenerowany SQL i ten plik przekazać adminowi.

Kolejny temat to OData. Informacje o tym protokole obiły mi się o uszy/oczy, jednak jakoś nie znalazłem czasu ani ochoty aby się w nimi bardziej zainteresować. I bardzo dobrze – tutaj dowiedziałem się właściwie wszystkiego. W sumie wystarczył wstęp pokazujący, jak niezdecydowani są generatorzy nazw produktów w Microsoft: OData to nic innego jak WCF Data Services, formerly ADO.NET Data Services, code name Astoria:). Całkiem imponująco ten łańcuszek wygląda. Cóż więc to takiego? OData pozwala na udostępnienie danych “the RESTful way”. Znaczy to, że za pomocą odpowiednio skonstruowanego URLa mamy możliwość dobierania się do wystawionych w ten sposób informacji w bardzo, ale to bardzo elastyczny sposób. Wyszukiwanie, sortowanie, stronicowanie, projekcje – wszystko w URL! Czyż nie cool? A po stronie .NET odpowiednie komponenty zajmują się konwersją takich zapytań na LINQ. Oczywiście założeniem protokołu jest wieloplatformowość – dane przesyłane są domyślnie w formacie ATOM (możliwość zmiany na JSON), zatem nie ma żadnego problemu aby zintegrować w ten sposób .NET z PHP czy czymkolwiek innym. Gorąco polecam zapoznanie się z tym dziwadełkiem, to może być przyszłość zdalnego dostępu do danych. W trakcie prezentacji mieliśmy okazję na żywo pooglądać jak prosta jest konsumpcja takiego serwisu – za przykład posłużyła witryna Netflix. Zabrakło mi jedynie demonstracji UTWORZENIA takiej usługi, ale zapewne jest to tak proste jak wyklikanie New Project -> OData -> Next -> OK. Czy coś w ten deseń.

Trzeci element modern-developerskiej układanki to Silverlightowy Pivot. Kontrolka to pozwala na bardzo imponującą prezentację wielkich (choć niekoniecznie) zbiorów danych w megaatrakcyjny sposób. Póki co nie zanosi się na to, abym z ekscytacją zaczął tego używać, ale oglądało się fajnie. Robi wrażenie.

Na koniec Tomek zaserwował nam demko łączące w sobie OData i Pivot, wdrażając całość na (a jakże!) Windows Azure.

Wrażenia z całej sesji mam jak najbardziej pozytywne. Tak jak i rok temu sesja zwycięzcy Speaker Idola przewyższyła moje oczekiwania. Przyczepić mogę się tylko do jednej rzeczy, która mnie bardzo niemile zaskoczyła. W okolicach końca wykładu z ust prelegenta padło zdanie mniej więcej takie: “Linq2Sql można do śmieci wyrzucić”. A argumentów potwierdzających taki pogląd niestety zabrakło. Twierdzenie moim zdaniem MOCNO dyskusyjne – jak można powiedzieć w ten sposób o technologii, na której śmiga między innymi taki gigant jak StackOverflow?

Ocena: 7/9 (fajny dobór przedstawianych technologii zaprezentowanych w profesjonalny sposób – zasłużona wygrana Speaker Idola została udowodniona)

7. “Task Parallel Library czyli Programowanie równoległe w C# – zagadnienia zaawansowane” Cezary Nolewajka

Od razu po wejściu do sali, w której mieliśmy dowiedzieć się dużo fajnych rzeczy o TPL, spojrzeliśmy ze znajomymi na swe białostockie oblicza i zrozumieliśmy się w mgnieniu oka: “o nieee….“. Dlaczego takie nastawienie? WYDAJE mi się, że kiedyś wcześniej uczestniczyliśmy wszyscy w sesji prowadzonej przez tego prelegenta. Co prawda w żadnej ze swoich relacji nie potrafię odnaleźć jego nazwiska, ale bardzo mocno osoba skojarzyła nam się z jakąś prelekcją o bazach danych. Z niesamowicie NUDNĄ i słabą prelekcją. Zacznę więc od kwestii “warsztatowych”: kongratz! To co mieliśmy w pamięci a to co zobaczyliśmy na MTS to po prostu dwa różne światy! Nie wiem czy jest to kwestia dziesiątków szkoleń czy bardzo ciężkiej samodzielnej pracy, ale przed naszymi oczyma namalował się obraz absolutnie niespodziewany. Na luzie, z humorem (BARDZO dużą dawką humoru, to chyba najweselsza sesja w historii MTS – czy ktoś inny przywitał na sali panią fotograf tekstem “proszę nie robić mi zdjęć, wychodzę zazwyczaj jak TROLL!” ?:)), nieustannie utrzymując kontakt z publicznością… W trakcie sesji nieustannie miałem w głowie myśl: “może i dla mnie jest jeszcze szansa w tym światku, może wystarczy tylko odpowiednio mocno chcieć i się starać?”. Ale dość o tym, tak czy siak – megaszacun dla Czarka za poczynione postępy (cały czas nie mogę dokładnie skojarzyć poprzedniej sesji, ale jeszcze 3 inne osoby potwierdziły moje spostrzeżenia, więc prawdopodobieństwo że sie nie mylę jest całkiem spore).

I do rzeczy… Jak na sesję o wielowątkowości przystało zaserwowano nam sporą dawkę wiedzy odnośnie wątków i procesów. Czym się różnią, jaki jest czego koszt, dlaczego nadużywanie wątków powinno być tępione. Do tego dowiedzieliśmy się trochę o dostępnych na rynku rozwiązaniach hardware’owych: co dokładnie znaczy “wiele procesorów”? Co znaczy “wiele rdzeni”? Co to za technologia “hyper threading” i jakie niesie zyski?

Tutaj mała wstawka osobista – prelegent bardzo polecał zapoznanie się z książką Jeffrey’a Richtera. Dzięki firmie DevCore.NET można ją wygrać w moim konkursie:).

Temat mogliśmy poznać na faktycznie dość zaawansowanym poziomie dzięki całej masie demonstracji. Przejechaliśmy się chyba właściwie po wszystkim co TPL ma do zaoferowania. Od tworzenia tasków, przez nowe typy kolekcji (concurrent collections & blocking collection), przez niejako “automayczne” zrównoleglanie zadań w pętli (for / foreach), aż po pisanie własnych task schedulerów. Opisywanie całości tutaj mija się z celem, zainteresowani na pewno we własnym zakresie zagłębili się w dokumentację i przykłady dostępne na MSDN. Podobało mi się to, że Czarek nie ograniczył się do mechanizmów zawartych w samym .NET 4.0, ale zaprezentował dodatkowo ciekawy projekt uzupełniający TPL: Parallel Extensions Extras.

Na zakończenie doświadczyliśmy krótkiego monologu na temat “Thread.Sleep vs Thread.SpinWait“. Mogliśmy również zobaczyć jak wygląda debuggowanie tasków w VS 2010. A następnie pod niemałym wrażeniem opuściliśmy salę.

Ocena: 7/9 (ciekawy i bardzo potrzebny temat zaprezentowany w imponujący sposób – szczególnie mając w pamięci przeszłe wystąpienia prelegenta)

8. “Asynchroniczny model programowania w .NET” Mariusz Kukawski, Grzegorz  Jachimko

W tym miejscu mieliśmy ze znajomymi dylemat: zostać do końca, czy dymać na wcześniejszy pociąg? Doszliśmy jednak do wniosku, że skoro już tu jesteśmy to korona nam z głowy nie spadnie, jeśli i ostatnią sesję obejrzymy.

Już na samym początku nie żałowałem tego wyboru – okazało się bowiem, że obaj prezenterzy pracują we Wrocławiu, w Microsoftowym dev-center. Założyłem więc że muszą mieć dużo ciekawych rzeczy do opowiedzenia. I faktycznie zaczęło się bardzo interesująco, od pewnej symulacji: GDYBY jeden cykl procesora trwał jedną sekundę, to odczyt z rejestru również trwałby jedną sekundę. Odczyt z pamięci, odczyt z dysku – oczywiście odpowiednio dłużej. A na przykład odczyt z sieci? 30 lat! To był zdecydowanie fajny pomysł, który z pewnością zainteresował publiczność.

Po takim wstępie potwierdziły się informacje z sesji poprzedniej, że tworzenie nowych wątków wcale nie jest darmowe – i przełączanie kontekstu pomiędzy nimi także swoje kosztuje. Dowiedzieliśmy się też, że kosztowne operacje można podzielić na dwa rodzaje: obliczeniowe (compute-bound) oraz we/wy (I/O-bound). Ciekawie zademonstrowano nam zachowanie ThreadPool w przypadku zarówno jednej jak i drugiej operacji. Operacje obliczeniowe (zasymulowane przez ciągłą pętlę) są uruchamiane równolegle, jednak pula tworzy tylko tyle wątków, ile mamy procesorów w maszynie. Bo i po co więcej? Z kolei operacje I/O (zasymulowane prostym Thread.Sleep()) powodują utworzenie o wiele większej liczby wątków, co oczywiście niesie za sobą większy koszt działania aplikacji. Niestety nie wspomniano nawet o Task Parallel Library – co prawda tylko pośrednio łączy się to z tematem, jednak moim zdaniem wzmianka by nie zaszkodziła. Ostatnie demko pierwszego prelegenta pokazało w jaki sposób wykonywane są operacje I/O w kontekście synchronicznym i asynchronicznym: od wywołania metody w .NET do faktycznej realizacji żądania przez system operacyjny. Na koniec dowiedzieliśmy się również co to są I/O Completion Ports i co daje ich obecność w systemie. I dodatkowe warte wzmianki info: przy okazji tego tematu również odsyłano nas do twórczości Richtera.

W tym momencie pałeczkę przejął młodszy kolega dotychczasowego speakera i zaczął temat asynchronicznych kontrolerów w ASP.NET MVC. I niestety, od tego momentu dosłownie wszystko się panom posypało. Generalnie wniosek był jeden: warto stosować asynchroniczne kontrolery w ASP.NET MVC, i tyle. Nie wspomniano niestety żeby robić to tylko dla operacji I/O-bound, ponieważ zrzucenie jakichś obliczeń (czyli CPU-bound) do innego wątku nie tylko nie podniesie, ale nawet obniży wydajność aplikacji (za MSDN). Niewiele też wynikało z prezentowanych dem – pokazywanie przeglądarki z 10 otwartymi zakładkami i przełączanie się między nimi nie jest sposobem na porwanie publiczności.

Ale… przestanę w tym miejscu zajmować się samą sesją i podzielę się raczej kilkoma spostrzeżeniami dotyczącymi doboru osób do prowadzenia sesji na tak wielkiej imprezie jak MTS. Drugi prelegent ewidentnie nie był przygotowany do udźwignięcia takiej odpowiedzialności. Nie chodzi mi o wiedzę merytoryczną czy opanowanie materiału, a raczej o… “obycie prezenterskie”. Chyba nie przesadzę pisząc, że jego poziom przekazywania wiedzy dla szerszej publiczności był tak samo raczkujący jak mój. Zdenerwowanie, jąkanie się, niezbyt wyraźne mówienie… Po prostu trzeba znać swoje ograniczenia i być świadomym tego, co się potrafi a czego nie. Tak wielka konferencja nie jest miejscem do szlifowania warsztatu speakera – od tego są lokalne grupy zawodowe, gdzie każdy może poprowadzić sesję aby wprawić się w tym fachu. I tyle. Mimo to uważam, że masowe opuszczanie sali przez uczestników konferencji nie było na miejscu.

Na zakończenie przyszła pora na Q&A. Ponownie inicjatywę przejął pierwszy prelegent, ale niestety nie było już lepiej. Zachodzę w głowę i nie mogę zrozumieć jak to możliwe, że doświadczony programista Microsoft na pytanie “co to właściwie jest ASP.NET MVC?” odpowiada: “hmm… jak by to powiedzieć… najprościej: to taki dodatek do IIS“. Nie tylko w mojej głowie pojawił się wówczas kolorowy znaczek “WTF??“. Z publiczności padło jeszcze jedno zapadające w pamięć pytanie: “po co stosować asynchroniczne kontrolery – w czym jest to lepsze niż pozostanie przy synchronicznym modelu i zwiększenie do maksimum w IIS liczby wątków dedykowanych dla obsługi naszej aplikacji?”. Niestety nie doczekaliśmy się odpowiedzi rozwiewające tą wątpliwość.

Ocena: 3/9 (poruszone ciekawe tematy, ale druga część sesji oraz Q&A nie na poziomie MTS; uwaga do speaker-wannabes: przed zgłoszeniem się do MTS upewnijcie się, że jesteście w stanie to udźwignąć!)


Podsumowanie

W kwestiach organizacyjnych na pewno jest baaaardzo dużo miejsce na ulepszenia, ale mimo to był to pierwszy MTS, na którym:

  • ani razu nie zasnąłem (zawsze ta konferencja wiąże się z dwoma ostrymi imprezami poprzedzającymi “dni sesyjne”, więc już od pierwszego wieczora przed-MTS rozpoczyna się “męczenie materiału”:) )
  • nauczyłem się nowych rzeczy potencjalnie mogących mieć wpływ na moje życie zawodowe
  • stosunek marketingu do rzetelnego przedstawiania technologii stał na całkowicie akceptowalnym poziomie
  • nie odniosłem wrażenia, że wszyscy (zarówno organizatorzy jak i prelegenci) udają, że Microsoft jest jedyną firmą na świecie; w tym roku słowa takie jak “google”, “amazon”, “php”, “java”, “wmvare” czy “firefox” były na porządku dziennym i nie traktowano ich jako tabu; niezmiernie mnie to cieszy; niech Microsoft pokazuje nam dlaczego jego rozwiązania są lepsze od konkurencji, a nie pokazuje ich jako jedyne na rynku!

A co za tym wszystkim idzie: to pierwszy MTS, który (mimo podwyżki cen) moim zdaniem wart był pieniędzy żądanych przez Organizatora. Muszę przyznać, że z różnych względów akurat mnie to nie dotyczy, lecz gdybym musiał z własnej kieszeni wysupłać te 540 zł – nie żałowałbym.

Ocena MTS 2010: 8/9

Nie przegap kolejnych postów!

Dołącz do ponad 9000 programistów w devstyle newsletter!

Tym samym wyrażasz zgodę na otrzymanie informacji marketingowych z devstyle.pl (doh...). Powered by ConvertKit
Notify of
Tomasz Wisniewski

Dzieki Macku za pozytywny odbior mojej sesji. Pozwol, ze skomentuje to co napisales :) 1. Zamyslem DTA nie jest to aby na serwerze produkcyjnym developer wydawal bazy poprzez deploy/F5. To sie tyczylo srodowiska develperskiego. W kwestii produkcyjnej developer jak najbardziej powinien przekazac administratorowi paczke dacpac. Ten temat poruszalem z Damianem Widera podczas naszej sesji na ten temat na VS2010 Community Launchu w Katowicach. Mam nadzieje, ze na TechNecie w niedalekiej przyszlosci ukaze sie w koncu nasz artykul o tym rozwiazaniu wiec tam tez bedzie wiecej szczegolow :) 2. Demka z OData nie bylo bo juz czas mi sie konczyl, ale… Read more »

procent

@Tomasz Wisniewski:
1. OK, w takim razie za daleko poszedłem w swoich domysłach, dzięki za wyjaśnienie.
2. Spoko, jak wrócę do świata "cywilizowanego internetu":) to nie omieszkam się z tą sesją zapoznać.
3. …albo zastanowić się nad jeszcze inna alternatywą;)

lary
lary

Jeśli chodzi Ci o tę ‘niesamowicie NUDNĄ i słabą prelekcję’ Cezarego Nolewajki to na 99% chodzi o ‘SQL Server 2008 dla developerów’ (MTS 2008). Też pozostała mi w pamięci, bo miałem (nie)przyjemność na niej być.

Relacja jak zwykle na bardzo wysokim poziomie, aczkolwiek mnie osobiście tegoroczny MTS tematycznie mniej przypadł do gustu niż poprzednie.

dario-g

Dzięki. Nie byłem, przeczytałem Twój post i… już wszystko wiem. ;)

PS
A za brak webcastów dla organizatorów NAGANA!!!

noisy

Nie byłem… ale jestem niemal pewien, że jak tylko skończę studia, to zacznę się na takie wybierać :) Obecne obowiązki zawodowe nie pozostrawiają mi za dużo czasu wolnego :(

Opis bardzo ciekawy… napewno w jakis sposób poszerzyłem swoje horyzonty :) Bardzo ciekaw jestem co było powiedziane na temat samego działania IE. Z perspektywy pracownika Opery to nogło by być nadzwyczaj ciekawe! (Oni zapisać się na konferencję każdemu?)

Tak czy inaczej… dzięki za recenzję.

Artur
Artur

Fajna relacja, dla kogoś takiego jak ja (nie byłem na MTS2010). Pochylę się chwilę nad zdaniem "megaszacun dla Czarka za poczynione postępy ". Widziałem kilka razy CN w akcji i uważam go za jednego z lepszych prelegentów. A ta słabsza sesja, którą macie w pamięci to pewnie to: http://ms-groups.pl/wg.net/38_spotkanie/default.aspx

noisy

@Artur, @procent: może ów Czarek jest tak naprawdę dobrym prelegentem, tylko poprzednim razem chciał zaprotestować, że ktoś na siłe kazał mu występować.. no i np. pokazał jak występuje, kiedy mu się nie chce :)

Tomasz Wisniewski

Moim zdaniem dobry prelegent nigdy sobie nie pozwoli na to zeby specjalnie zle wypasc. Dobry prelegent zawsze da z siebie wszystko.

Mariusz Kukawski
Mariusz Kukawski

Dzięki Maciej za konstruktywną krytykę. Faktycznie mój występ pozostawiał wiele do życzenia, Twoje uwagi bardzo trafnie to przedstawiają. Zdecydowałem się na występ z tego względu, iż mimo angażu w MS-ie nie mieliśmy darmowej wejściówki na tą elitarną imprezę organizowaną przez MS (dlaczego ? inne budżety, biurokracja, inny "target", itp.). Jedyną możliwością było… zgłoszenie się do roli prelegenta. Zaryzykowaliśmy, mimo braku obycia z tak dużą publicznością. Niestety ani mi, ani Wam, nie wyszło to na dobre. Mimo roli prelegenta nie dostałem się na najlepsze sesje (niewpuszczanie przez obsługę ponad limit miejsc), Wy nie zdobyliście wiedzy takiej, na jaką zasługiwaliście (wysoka cena… Read more »

procent

@lary, @Artur:
Chyba Artur ma rację, na podlinkowanym spotkaniu WG.NET byłem na pewno (pamiętam sesję Bartka:) )

procent

@Mariusz Kukawski:
Czy impreza była "elitarna" to bym polemizował, bardziej pasuje jak dla mnie słowo… "jedyna".
Z tego co piszesz to faktycznie wyszło średnio z każdego punktu widzenia. Ale najważniejsze to wyciągać odpowiednie wnioski:).

procent

Do wszystkich zainteresowanych: Cezary Nolewajka rozpoczął prowadzenie bloga, na pierwszy ogień poszła oczywiście TPL:) Adres: http://www.neron.com.pl/blog/

Szkolenie z testów

Szkolenie z baz danych

Facebook

Książka

Zobacz również