PHPCon Poland 2015 – jak było?

PHPCon Poland 2015 - ścieżka

Ponad tydzień temu odbyła się kolejna edycja konferencji PHPCon Poland. Jak ten czas szybko leci, pamiętam jak była organizowana pierwsza edycja w 2010 roku. Wtedy była to mała konferencja na 100-200 osób w Hucie Szklanej.

W tym roku uczestników było już prawie dziewięciuset, a konferencja przeniosła się do wielkiego hotelu w Ossie. Ale dzięki wielkości hotelu, oraz 3 salom (2 prelekcyjne, 1 warsztatowa) nie odczuwało się tak dużej ilości uczestników.
Moim zdaniem hotel dobrze poradził sobie z taką imprezą, gastronomicznie również dał radę. Jedyne co, to brakowało ewidentnie znaków/strzałek kierujących pierwszego dnia na miejsce rejestracji uczestników konferencji, z recepcji hotelowej.

Warsztaty

W tym roku miałem okazję uczestniczyć w konferencyjnych warsztatach. Ze względu na Mariusza uczestniczyłem w warsztacie z Ansible. Moim zdaniem świetna rzecz, Mariusz z Kacprem (Source Ministry) pokazali dlaczego warto skorzystać z Ansible oraz jak łatwo wykorzystać to narzędzie.
Ansible jest bardzo łatwy jeśli chodzi o „czytanie” plików konfiguracyjnych, jak także w samej konfiguracji. Bardzo ułatwia w dostosowywaniu pod siebie Vagranta, który siedzi pod spodem. A dzięki Ansible nie musimy za wiele wiedzieć o samym mechaniźmie wirtualizacji i kolejny raz tracić czas na stawianie środowiska pracy pod konkretny projekt.

PHPCon Poland 2015 - OLX pod maską

Konferencja

Minusem warsztatów było, że w najlepszym wypadku traciliśmy połowę wykładowego dnia. Nie powinno tak być. Pierwsza prelekcja, na której mogłem być zaczynała się o 20:00 (agenda). Wybrałem „OLX pod maską”. Łukasz Szymański przedstawił krótko historię polskiego OLX, które zaczynało jako szerlok (ktoś jeszcze pamięta?), a następnie tablica.
Miesięcznie polski OLX obsługuje 9,5 mln UU / 77,5 mln wizyt / 1,5 mld odsłon. Wszystko jest ogarniane przez 1 instancję haproxy, za tym dopiero stoją nginx-y z varnishem oraz riakiem.
Poza tym OLX wykorzystuje głównie memcached, Redis dla fjuczerów oraz MySQL. Do statystyk używają Graphite.
Później Łukasz opisał jak była stworzona architektura aplikacji, jakie zespół miał wyzwania i co obecnie planują. To już nie było tak interesujące.
Jak na wykład sponsorki tej edycji było i tak bardzo dobrze.

PSR-7

Drugi, a jednocześnie ostatni wykład tego dnia, który wysłuchałem był poświęcony PSR-7, a dokładnie jego historii. Niestety zapomniałem, że historia może być tak nudna.
Mimo sporych wysiłków Kacpra Guni i Mariusza Gila, oraz cofnięcia się do podstaw PHP czyli aplikacji webowych opartych o Request i Response nie sprawili, że pokochałem historię.
Najważniejsze do zapamiętanie – teraz wszyscy „będą” PSR-7 i jest to dobra wiadomość, bo będzie można prawie, że dowolnie podmieniać implementację tego interfejsu/specyfikacji.

Dzień drugi

Drugi dzień konferencji. Sobota miała być tym co programiści lubią najbardziej. Prelekcje w godzinach od 10:00 do 20:00 dawały teoretyczną możliwość poznania sporej porcji nowej wiedzy i weryfikację już posiadanej. Niestety w tym roku coś niedobrego stało się z prelekcjami. Pewne prelekcje zostały specjalnie wyróżnione w agendzie (S), coś czego nie było w latach poprzednich. Niby nic, ale merytoryka mocno spadła moim zdaniem. I nie chodzi o to, że były to tzw. „sponsorskie wykłady”. W poprzednich latach „mówiły” firmy, ale były to ciekawe case study lub przypadki opisu użytych technologii. Tym razem były to tylko wyjątki jak OLX lub getResponse.

PHP 7 w praktyce

Na PHPCon Poland najbardziej lubię posłuchać polskich prelegentów, zagranicznych mamy w kuluarach i na YT. Pierwszy wykład tego dnia przesiedziałem u Leszka na „PHP 7 w praktyce”, gdzie tytułowej praktyki mi zabrakło ale merytorycznie było bardzo dobrze. Dla osób myślących o przesiadce na PHP 7 przypominam, że dostępny jest darmowy ebook.
Najważniejsze do zapamiętania – Udział PHP 5.3 w rynku to 36.4%, PHP które żyło w latach 2009-2014.

Bla Bla Bla – technical story

Abstrakt prelekcji „Bla Bla Bla – technical story” naprawdę zachęcał. Serwis obsługuje duży ruch, równie duża jest liczba deweloperów odpowiedzialnych za serwis. Niestety angielsko-francuski prelegentów (Benjamin de Bernardi, Olivier Dolbeau) sporo zepsuł.
To co udało mi się wychwycić, to informacja że BlaBla najpierw było oparte o Mambo w 2005 roku, a dopiero później zaczęli stosować inne technologie, szczególnie gdy w 2010 roku weszli na inne rynki (Hiszpania, Włochy, UK).
W pierwszych wersjach powstały takie potworki jak plik lib.trip.php, który posiadał prawie 4k linii kodu, bez żadnych testów. Dlatego zespół postanowił przejść z własnego rozwiązania na Symfony.
PHPCon Poland 2015 - samochodziki BlaBla
A dlaczego Symfony? Ponieważ Symfony posiada duże community, szczególnie we Francji. Łatwiej również znaleźć nowych programistów, którzy szybko wdrożą się w projekt symfonowy.
Obecnie BlaBlaCar korzysta z git, Atlassian Bamboo, phpunit, behat, Elasticsearch, rabbitMQ, varnish, chef, zabbix, hadoop, AWS, New Relic, Galera, swrrot.
Jak tylko ukażą się nagrania (zapewne wiosną) warto obejrzeć, jak opowiadają o problemach z jakimi się zderzyli (chociażby kod spaghetti).
Najważniejsze do zapamiętania – warto posiadać wewnętrzne API pomiędzy warstwami

Michelangelo – 200K+ reasons why security is a must

Nie ominąłem oczywiście prelekcji Michelangelo van Dam, który w bardzo przystępny sposób dał do zrozumienia, że mamy wszyscy coraz większy problem z bezpieczeństwem. Nie tylko bezpieczeństwem aplikacji, ale również własnym (hasła, loginy, dostępy itp).
Kilka lat temu Michelangelo zrobił test, i przeszukał github’a pod względem występowania w jednej linii zwrotu mysql_query + $_GET. Wtedy dostał 99k wyników (!).
Po 2 latach zamiast ilość takich wystąpień zmaleć wzrosła do tytułowych 200k (możliwe, że częściowo winne forki). A w dniu prelekcji (14 listopada) ilość wyników osiągnęła 352k wystąpień.
Najważniejsze do zapamiętania – komentuj złe praktyki, naprawiaj świat! Naucz się podstaw hackingu (hack.me, ha.ckers.org).

Kilka następnych prelekcji pominę. Sobotni dzień natomiast zamykał Marco Pivetta i Sławomir Sobótka.
PHPCon Poland 2015 - Audytorium Maximum

Doctrine ORM Good Practices and Tricks

Marco opowiedział o dobrych praktykach i sposobie myślenia twórców popularnego ORM jakim stał się Doctrine. Była to zupełnie inna prelekcja niż ta podczas Symfony Live London 2015: Benjamina Eberlei podczas „Doctrine 2: To Use Or Not To Use”.
Doctrine został zainspirowany JSR-317 i warto o tym pamiętać. Marco wspomniał również, że w dzisiejszych czasach nie powinniśmy projektować nowej aplikacji zaczynając od bazy danych. Pamiętajmy również, że auto-ID (auto increment) mimo że istnieje to nie znaczy, że mamy z tego mechanizmy korzystać.
Jest chociażby 128-bitowy UUID, który możemy użyć. Podczas projektowania bazy możemy zastanowić się również czy potrzebny jest nam PRIMARY KEY? Może to zły pomysł.
Skorzystanie z popularnego mechanizmu soft delete to również nienajlepszy pomysł, który powoduje problemy z wydajnością, kluczami obcymi, indeksami.
Najważniejsze do zapamiętania – pomiar, to jedyne narzędzie do profilowania ORM

Jak wciągnąć eksperta domenowego w wir modelowania

Sobotni dzień zamknął Sławek. Osoba na co dzień związana z Javą. Ale wydaje mi się, że dla wszystkich osób, które były na jego wykładzie, to on najmocniej zapadnie w pamięć uczestnikom tegorocznej konferencji PHP.
Przedstawił on na początku podstawową różnicę, jaka dzieli w myśleniu tzw. biznes i dział wytwarzania.
Należy pamiętać, że biznes nie widzi co jest pod maską. I nie zawsze biznes zdają sobie sprawę, że wprowadzenie nowego checkboxa powoduje lawinę zmian w backendzie. Sławek mocno podkreślił definicję tzw. „aplikacji głębokiej”, czyli aplikacji w której występuje dużo rzeczy pomiędzy GUI a bazą. W takim wypadku warto stosować DDD.
Sławek Sobótka ma dar przekazywania bardzo trudnych zagadnień w prosty sposób (Jeśli ekspert domenowy mówi CRUD to go „popsułeś”). Jeśli będziecie mieli szansę pójść na jego prelekcję – idźcie!
Warto obejrzeć również wystąpienie Pawła Szulca na Confitura ’13, gdzie wprowadził definicję „Encja na twarz i pchasz”, o której wspomniał Sławek.

PHPCon Poland 2015 - gadżety

Large-scale websites performance optimisation tricks

Dla mnie wykładem otwierającym niedzielę była prelekcja Georgiana’y Gligor, która przedstawiła case study Allegiant Air. Allegiant Air to amerykańska firma specjalizująca się w tanich lotach, a w zadaniu chodziło o stworzenie nowego serwisu do rezerwacji biletów, z dwiema drogami sprzedaży: website & call-center.
Klient oczekiwał prostej skalowalności i odporności na duże obciążenia (głównie chodziło o dni wielkich wyprzedaży jak Black Friday). Obecny serwis był bardzo monolityczny, trudny w rozwoju i utrzymaniu.
Georgiana zaprezentowała swoje rozwiązanie na powyższy problem – SILO. Każdy SILO to serwer ze skonfigurowaną w pełni aplikacją, w której frontend oparty jest na Drupalu + JS SPA (Single Page App), natomiast backend to Symfony + cache.
Aby w pełni obsłużyć obciążenie, został postawiony load balancer F5, a za nim 3x SILO. Warto zaznajomić się z prezentacją, aby zobaczyć jak został zaprojektowany sposób komunikacji pomiędzy warstwami. Ponieważ warstwy w tym rozwiązaniu są najważniejsze.
Georgiana podkreśliła również ważność logów w systemie. Logi, co często zapominamy, to nie tylko miejsce gdzie zapisujemy wyjątek/problem/etc, ale to miejsce które powinno opowiedzieć całą ścieżkę przejścia Użytkownika w naszym systemie. Mechanizm logowania jest na innej warstwie, który odpowiadał od razu kodem 204, a później dopiero dane zapisywał do bazy.
Najważniejsze do zapamiętania – trick 204, od razu po żądaniu wysyłasz 204, a kolejna „niezależna” warstwa zajmuje się „obróbką”.

Na zakończenie dnia, jak również konferencji PHPCon Poland 2015 zostały smaczki – Mariusz Gil (MySQL under the siege) oraz Michał Pipa (HTTP Cache).

MySQL under the siege

Temat rzeka, spokojnie Mariusz mógł opowiadać 3 godziny i nie wyczerpałby tematu. Szczególnie zapadło mi w pamięć, że często porzucamy MySQL (lub jej forki) na rzecz innych rozwiązań, bo tak naprawdę nie znamy tej bazy danych.
W krytycznych sytuacjach należy pamiętać, że MySQL ma ogromną społeczność i bardzo prosto znaleźć odpowiedź na ważne, pojedyczne problemy. Nie zrobimy tego na przykład w przypadku Hive.
Mariusz podkreślił, to co dzień wcześniej powiedział Marco:

  • schemat bazy danych nie powinien być na pierwszym miejscu, ponieważ każda baza danych jaką zaprojektujemy działa tylko do czasu. Szczególnie gdy przewidujemy, że nasza aplikacja będzie szybko gromadziła nowe dane. W takiej sytuacji powinniśmy pomyśleć najpierw o workfoad.
  • Co z auto-ID, gdy mamy 50k zapisów do bazy na sekundę?

A także, co chwilę słyszeliśmy pytania:

  • Czy Twoja aplikacja używa wszystkich 750M rekordów w tabeli? A może tylko z ostatniego miesiąca?
  • Czy na pewno musisz robić COUNT przy paginacji? Pobieraj dane +1, i wtedy będziesz wiedział czy jest następna strona z danymi. Jedno zapytanie mniej, aplikacji lżej.
  • Możesz założyć prosty indeks na jedno pole, ale jaką selektywność ma ten indeks? 50%? Może lepiej założyć selektywny indeks (description[8])
  • Nie masz cache’u w aplikacji? Pamiętaj, że baza zawsze ma – może warto go wyłączyć jeśli masz głównie operacje zapisu?
  • Masz dużo operacji odczytu? Memcached. Ale co z invalidacją cache? Wyeliminuj JOIN-y, rozłóż SELECT-y na części i dopiero w aplikacji sklejaj.

Najważniejsze do zapamiętania – slow log na produkcji to podstawa

HTTP Cache

Temat, który poruszył Michał wydawałoby się, że jest znany. Ale czy my na pewno dobrze znamy samo HTTP?
Jaki jest najlepszy cache? Taki do którego nie trzeba się odwołać, bo jest po stronie Klienta. Można to osiągnąć na kilka sposobów, a na jeszcze więcej jeśli chcemy mieć pewną kontrolę nad jego trwaniem po stronie Klienta.

  • header() w PHP – najczęściej wystarczy nam do wszystkiego
  • Varnish / Squid – jeśli chcemy to zrobić szczebel wyżej

Są też różne rodzaje nagłówków, które powinniśmy wykorzystywać w zależności od naszych potrzeb:

  • Expires – nie jesteśmy w stanie tego wycofać
  • Cache-Control
  • Last-Modified / If-Modified-Since – ruch sieciowy występuje, ale mniejszy bo odpowiadamy tylko kodem 304
  • ETag / If-None-Match – podobna zasada do powyższej, tylko sprawdzenie odbywa się na innej zasadzie
  • ESI – Edge Side Includes

Podsumowanie

Jak mówiłem już kilku osobom, to co podobało mi się w poprzednich edycjach PHPCon Poland, to że wyznaczały trendy w świecie PHP do czasu następnej konferencji. Tym razem tak nie było. Może magia „zlotu programistów i entuzjastów języka PHP” znikła…

Jednak pomiędzy wierszami prelekcji tegorocznej edycji dało się usłyszeć/zauważyć trendy w naszym programistycznym świecie. Prawie wszyscy wspominali o wykorzystaniu CQRS oraz Event Sourcing. I wydaje mi się, że mimowolnie coraz bliżej wszystkim nam będzie do różnych literowych skrótów w najbliższym czasie…

Prezentacje: Dropbox