SlideShare une entreprise Scribd logo
1  sur  35
Télécharger pour lire hors ligne
JAK ZACZĄĆ, ABY NIE
ŻAŁOWAĆ
CZYLI 50 TWARZY PHP
PIOTR HORZYCKI
GDAŃSKIE WYDAWNICTWO OŚWIATOWE
„Granice mojego języka
oznaczają granice
mojego świata”
Ludwig Wittgenstein
Skąd popularność PHP?
●
Niski próg wejścia (łatwo zacząć).
●
Bardzo dużo tutoriali, książek.
●
Duża społeczność na całym świecie.
●
Stosowany zarówno w małych domowych
projektach, jak i dużych serwisach
komercyjnych
●
Stale rosnąca wydajność
PHP powstał w 1994 roku jako prosty zbiór narzędzi do monitorowania ruchu na
stronie – Personal Home Page Tools, upubliczniony dopiero rok później.
PHP/FI 2.0 – prosty język skryptowy:
Suppose you have a form:
<FORM ACTION="/cgi-bin/php.cgi/~userid/display.html" METHOD=POST>
<INPUT TYPE="text" name="name">
<INPUT TYPE="text" name="age">
<INPUT TYPE="submit">
</FORM>
Your display.html file could then contain something like:
<?echo "Hi $name, you are $age years old!<p>">
It's that simple! PHP/FI automatically creates a variable for each form input field in your form.
źródło: http://php.net/manual/phpfi2.php
●
PHP 3: przepisany silnik, zwiększona wydajność
i bezpieczeństwo
●
PHP 4: początki programowania obiektowego
●
PHP 5: modyfikatory dostępu do atrybutów/metod,
stopniowe ulepszenia w kolejnych wersjach: PDO,
obsługa wyjątków, namespace, domknięcia, wyrażenia
lambda
●
PHP 6: nieudana próba obsługi unicode, projekt
porzucono
●
PHP 7: taki, jaki znamy dziś: znaczny refaktoring
silnika, mniejsze zużycie RAM i czasu procesora;
skalarne typy parametrów (int, string), nowe
operatory (coalesce, spaceship)
PHP-owy szał i mroki średniowiecza
Popularne błędy bezpieczeństwa
w skryptach PHP (małych i dużych)
●
brak odpowiedniego filtrowania danych wejściowych
●
SQL injection
●
cross-site scripting
●
file inclusion
●
nadpisywanie zmiennych globalnych
Co wyszło z użycia?
●
magic_quotes: niezgrabne zabezpieczenie przed SQL Injection, zależne od
konfiguracji serwera, polegało na automatycznym dodawaniu backslasha
przed cudzysłowami i apostrofami w danych wejściowych; sprawiało więcej
szkód niż pożytku, zastąpione przez PDO i prepared statements
●
register_globals: zmienne tworzone automatycznie na podstawie GET i POST,
co przyczyniało się do dziur bezpieczeństwa
●
funkcje mysql_* - zastąpione przez obiektowe odpowiedniki lub PDO
Problemy z programowaniem w PHP
●
Dużo przestarzałych materiałów
●
Sprzyja pisaniu "na szybko"
●
Nie wymusza jednego paradygmatu
●
Brak konsekwencji w budowie biblioteki
standardowej (str_pad, strstr...)
●
Zachowanie często zależy od konfiguracji
●
Jest interpretowany, więc wiele błędów wychodzi
po uruchomieniu – dlatego przydaje się statyczna
analiza kodu
http://phpsadness.com/
https://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/
Jaki powinien być nasz kod?
●
Zrozumiały dla innych
●
Łatwy w rozbudowie
●
Stabilny
●
Testowalny
Piszę skrypty
„na szybko”
Zrobię to
„po swojemu”
Tworzę przemyślaną
architekturę
Używam sprawdzonych
rozwiązań
vs
Pułapki "małych" projektów
●
"To będzie prosta aplikacja"
●
"Tego nikt raczej nie będzie zmieniał"
●
"Niewielu ludzi będzie z tego korzystać"
●
"To taki wewnętrzny projekt, tylko dla nas"
●
"To tylko na chwilę, za miesiąc to zaoramy"
●
"To się raczej nie zdarzy"
Projekty informatyczne prawie zawsze rozrastają się
i działają dłużej, niż przewidywano
Korzystaj z dorobku innych!
●
standardy PHP-FIG: PSR-2, PSR-4, PSR-7…
●
frameworki ze wsparciem komercyjnym
●
popularne paczki Composera, np. http://moneyphp.org/
●
wzorce projektowe Gang of Four adaptowane dla PHP
https://github.com/domnikl/DesignPatternsPHP
●
Domain-Driven Design: https://leanpub.com/ddd-in-php/read
●
Architektura warstwowa:
http://alistair.cockburn.us/Hexagonal+architecture
Narzędzia są tworzone
przez ludzi takich jak Ty
– omylnych.
Twórz elastyczne systemy,
w których narzędzia można łatwo
wymieniać.
Composer
●
zastąpił PEAR
●
podobny do bundlera z Ruby
●
łatwa, semantyczna kontrola wersji
●
automatyzacja
●
generuje autoloader PSR-4
●
dobry sposób na modularyzację własnego kodu
Automatyczne ładowanie klas
src
|-- SomeClass.php ← PiotrMyAppSomeClass
tests
|-- SomeClassTest.php ← PiotrMyAppTestsSomeClassTest
composer.json:
{
"autoload": {
"psr-4": {
"PiotrMyApp": "src/",
"PiotrMyAppTests": "tests/"
}
}
composer dump-autoload i już...
Statyczna analiza kodu
●
Wykrywa popularne błędy, niedoróbki (code smells)
●
Bada złożoność kodu, liczbę zależności, czytelność,
podatność na błędy...
●
Pilnuje standardu formatowania kodu PSR-2
●
Uruchamiana lokalnie, przed commitem
oraz automatycznie po umieszczeniu kodu
w repozytorium (część Continuous Integration)
●
Przykładowo: PHP Code Sniffer, PHPMetrics, PHPStan
Skąd wiesz, że Twój program działa?
●
Najpierw testy, potem implementacja.
●
Wykonywane przed i po commicie.
●
Są formą dokumentacji.
●
Kod nie może pójść na produkcję, jeśli testy się
nie powiodły.
class OrderTest extends PHPUnitFrameworkTestCase
{
public function testTotalAmount()
{
$order = new Order();
$order->addItem(new Product(), Money::PLN(‘100’), 3);
$this->assertEquals(30000, $order->getTotalAmount());
}
}
●
Projektanci i testerzy piszą testy akceptacyjne,
które mogą być automatycznie uruchamiane
●
Testy akceptacyjne są formą dokumentacji,
która żyje, a nie idzie w zapomnienie jak
dokumenty Worda
Skąd wiesz, że Twój program działa?
Behat:
Feature: ls
In order to see the directory structure
As a UNIX user
I need to be able to list the current directory's contents
Scenario: List 2 files in a directory
Given I am in a directory "test"
And I have a file named "foo"
And I have a file named "bar"
When I run "ls"
Then I should get:
"""
bar
foo
"""
źródło: http://docs.behat.org/en/v2.5/quick_intro.html
Skąd wiesz, że Twój program działa?
PHPSpec:
namespace spec;
use PhpSpecObjectBehavior;
class MarkdownSpec extends ObjectBehavior
{
function it_converts_plain_text_to_html_paragraphs()
{
$this->toHtml("Hi, there")->shouldReturn("<p>Hi, there</p>");
}
}
źródło: http://www.phpspec.net/en/stable/manual/getting-started.html
Skąd wiesz, że Twój program działa?
Codeception:
class LoginCest
{
public function tryLogin(FunctionalTester $I)
{
$I->amOnPage('/');
$I->click('Login');
$I->fillField('Username', 'Miles');
$I->fillField('Password', 'Davis');
$I->click('Enter');
$I->see('Hello, Miles', 'h1');
}
}
źródło: http://codeception.com/docs/04-FunctionalTests
Skąd wiesz, że Twój program działa?
Czas wykonania kompletu testów powinien
wynosić maksymalnie kilka minut
źródło: https://www.symbio.com/solutions/quality-assurance/test-automation/
Dlaczego nie stosujemy TDD?
„U nas się takich rzeczy nie robi”
„To się nie opłaca”
„To tylko w książce tak dobrze wygląda”
„Terminy nas gonią”
„Musimy utrzymywać stary kod”
Brakuje nam wprawy w używaniu TDD.
Brakuje wprawy w pisaniu dobrych, pożytecznych testów.
Jeśli robimy to codziennie, mamy to w nawyku
– wtedy robimy to łatwo, przyjemnie i z korzyścią.
Debugowanie
●
"Metoda wędrującej d...py"
●
Xdebug – debugowanie linia po linii, zdalne
debugowanie, sprawdzanie pokrycia kodu testami
●
"Whenever you are tempted to type something
into a print statement or a debugger expression,
write it as a test instead" – Martin Fowler
Automatyzacja
●
Composer (post-install, post-update)
●
Skrypty basha
●
Makefile
●
Phing
●
Continuous Integration/Delivery: Jenkins,
GitLab CI, Travis...
Jaką architekturę wybrać?
●
surowy PHP nie wystarczy
●
Model-View-Controller (pożyczone z Ruby on Rails)
●
proste "modele" CRUD-owe nie wystarczają
w dużych systemach
●
Action-Domain-Response
●
architektura warstwowa/heksagonalna...
Baza danych
●
Ponoć jest tylko "szczegółem implementacyjnym"...
"The Principles of Clean Architecture by Uncle Bob Martin"
https://www.youtube.com/watch?v=o_TH-Y78tt4
●
Kiedyś: zapytania sklejane ze stringów, częste błędy
SQL injection, powolne wyszukiwanie...
●
Dziś: systemy mapujące relacje na obiekty (Doctrine,
Propel, Eloquent)
●
Dziś: nierelacyjne bazy danych; MongoDB, Redis
●
Dziś: szybkie wyszukiwanie (ElasticSearch)
●
Dziś: Command-Query Responsibility Separation
Kompilacja i wersjonowanie assetów
●
gulp, webpack
layout.scss
articles.scss => style-02ab5c852d.css
forum.scss
Vagrant, Docker czy localhost?
●
php -S – prosty serwer deweloperski
●
Vagrant: maszyna wirtualna z przygotowaną
konfiguracją (bash, Ansible, Chef...)
●
Docker: kontenery, które łatwo można deployować
na serwer testowy lub produkcyjny
●
Środowiska deweloperskie, testowe i produkcyjne
powinny być jak najbardziej zbliżone do siebie!
●
Sentry: automatycznie zbiera i grupuje raporty, wykrywa
regresje; dostępne jako SaaS lub samodzielna instalacja)
Raportowanie błędów
Pytania?
Dziękuję :)
piotr.horzycki@gmail.com
twitter.com/phorzycki
github.com/phorzycki

Contenu connexe

Tendances

4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...
4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...
4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...PROIDEA
 
INVOKEDYNAMIC - bardziej dynamiczna JVM (Confitura 2012)
INVOKEDYNAMIC - bardziej dynamiczna JVM (Confitura 2012)INVOKEDYNAMIC - bardziej dynamiczna JVM (Confitura 2012)
INVOKEDYNAMIC - bardziej dynamiczna JVM (Confitura 2012)Waldek Kot
 
Porażka nie wchodzi w grę, czyli o niezawodności
Porażka nie wchodzi w grę, czyli o niezawodnościPorażka nie wchodzi w grę, czyli o niezawodności
Porażka nie wchodzi w grę, czyli o niezawodnościKamil Grabowski
 
SkładQA 2018 - Daniel Dec
SkładQA 2018 - Daniel DecSkładQA 2018 - Daniel Dec
SkładQA 2018 - Daniel Deckraqa
 
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...Future Processing
 
Testy jednostkowe - 8 rzeczy, które musisz wiedzieć
Testy jednostkowe - 8 rzeczy, które musisz wiedziećTesty jednostkowe - 8 rzeczy, które musisz wiedzieć
Testy jednostkowe - 8 rzeczy, które musisz wiedziećAleksandra (Ola) Kunysz
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyqbeuek
 

Tendances (10)

4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...
4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...
4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...
 
INVOKEDYNAMIC - bardziej dynamiczna JVM (Confitura 2012)
INVOKEDYNAMIC - bardziej dynamiczna JVM (Confitura 2012)INVOKEDYNAMIC - bardziej dynamiczna JVM (Confitura 2012)
INVOKEDYNAMIC - bardziej dynamiczna JVM (Confitura 2012)
 
Wstęp do profilowania aplikacji
Wstęp do profilowania aplikacjiWstęp do profilowania aplikacji
Wstęp do profilowania aplikacji
 
Porażka nie wchodzi w grę, czyli o niezawodności
Porażka nie wchodzi w grę, czyli o niezawodnościPorażka nie wchodzi w grę, czyli o niezawodności
Porażka nie wchodzi w grę, czyli o niezawodności
 
Od zera do Automattica
Od zera do AutomatticaOd zera do Automattica
Od zera do Automattica
 
SkładQA 2018 - Daniel Dec
SkładQA 2018 - Daniel DecSkładQA 2018 - Daniel Dec
SkładQA 2018 - Daniel Dec
 
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
 
Wprowadzenie do PHPUnit
Wprowadzenie do PHPUnitWprowadzenie do PHPUnit
Wprowadzenie do PHPUnit
 
Testy jednostkowe - 8 rzeczy, które musisz wiedzieć
Testy jednostkowe - 8 rzeczy, które musisz wiedziećTesty jednostkowe - 8 rzeczy, które musisz wiedzieć
Testy jednostkowe - 8 rzeczy, które musisz wiedzieć
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatyczny
 

Similaire à Jak zacząć, aby nie żałować - czyli 50 twarzy PHP

201105 OWASP Fuzzing interpretera PHP
201105 OWASP Fuzzing interpretera PHP201105 OWASP Fuzzing interpretera PHP
201105 OWASP Fuzzing interpretera PHPLogicaltrust pl
 
PHPUnit - jak zacząć pisać testy automatyczne [PL]
PHPUnit - jak zacząć pisać testy automatyczne [PL]PHPUnit - jak zacząć pisać testy automatyczne [PL]
PHPUnit - jak zacząć pisać testy automatyczne [PL]Droptica
 
Shall we play a game? PL version
Shall we play a game? PL versionShall we play a game? PL version
Shall we play a game? PL versionMaciej Lasyk
 
CI oraz CD w złożonym projekcie o małym budżecie
CI oraz CD w złożonym projekcie o małym budżecieCI oraz CD w złożonym projekcie o małym budżecie
CI oraz CD w złożonym projekcie o małym budżecieGrzegorz Godlewski
 
Xdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHPXdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHP3camp
 
Zwiększanie produktywności programisty php (v2)
Zwiększanie produktywności programisty php (v2)Zwiększanie produktywności programisty php (v2)
Zwiększanie produktywności programisty php (v2)adamhmetal
 
Zwiększanie produktywności programisty php
Zwiększanie produktywności programisty phpZwiększanie produktywności programisty php
Zwiększanie produktywności programisty phpadamhmetal
 
Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...
Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...
Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...Wojciech Sznapka
 
Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Tomasz Dziuda
 
Testowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnychTestowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnychSecuRing
 
Extjs & netzke
Extjs & netzkeExtjs & netzke
Extjs & netzkeGaldoMedia
 
IT od kuchni w Nokaut.pl
IT od kuchni w Nokaut.pl IT od kuchni w Nokaut.pl
IT od kuchni w Nokaut.pl 3camp
 
Jak zarabiać na testowaniu oprogramowania(konferencja MeeTTech Piła 27.07.2016)
Jak zarabiać na testowaniu oprogramowania(konferencja MeeTTech Piła 27.07.2016)Jak zarabiać na testowaniu oprogramowania(konferencja MeeTTech Piła 27.07.2016)
Jak zarabiać na testowaniu oprogramowania(konferencja MeeTTech Piła 27.07.2016)Dariusz Kacban
 
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]Droptica
 

Similaire à Jak zacząć, aby nie żałować - czyli 50 twarzy PHP (20)

201105 OWASP Fuzzing interpretera PHP
201105 OWASP Fuzzing interpretera PHP201105 OWASP Fuzzing interpretera PHP
201105 OWASP Fuzzing interpretera PHP
 
Testowanie automatyczne 2024 INCO Academy
Testowanie automatyczne 2024 INCO AcademyTestowanie automatyczne 2024 INCO Academy
Testowanie automatyczne 2024 INCO Academy
 
PHPUnit - jak zacząć pisać testy automatyczne [PL]
PHPUnit - jak zacząć pisać testy automatyczne [PL]PHPUnit - jak zacząć pisać testy automatyczne [PL]
PHPUnit - jak zacząć pisać testy automatyczne [PL]
 
Shall we play a game? PL version
Shall we play a game? PL versionShall we play a game? PL version
Shall we play a game? PL version
 
CI oraz CD w złożonym projekcie o małym budżecie
CI oraz CD w złożonym projekcie o małym budżecieCI oraz CD w złożonym projekcie o małym budżecie
CI oraz CD w złożonym projekcie o małym budżecie
 
Xdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHPXdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHP
 
Zwiększanie produktywności programisty php (v2)
Zwiększanie produktywności programisty php (v2)Zwiększanie produktywności programisty php (v2)
Zwiększanie produktywności programisty php (v2)
 
Zwiększanie produktywności programisty php
Zwiększanie produktywności programisty phpZwiększanie produktywności programisty php
Zwiększanie produktywności programisty php
 
Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...
Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...
Łebski Development czyli kiedy i dlaczego tworzyć oprogramowanie pod klucz i ...
 
Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014
 
university day 1
university day 1university day 1
university day 1
 
Testowanie na 101 sposobów
Testowanie na 101 sposobówTestowanie na 101 sposobów
Testowanie na 101 sposobów
 
Pg Net Ci
Pg Net CiPg Net Ci
Pg Net Ci
 
Testowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnychTestowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnych
 
Extjs & netzke
Extjs & netzkeExtjs & netzke
Extjs & netzke
 
Olga Żądło - Robot Framework
Olga Żądło - Robot FrameworkOlga Żądło - Robot Framework
Olga Żądło - Robot Framework
 
It od kuchni w nokaut.pl
It od kuchni w nokaut.plIt od kuchni w nokaut.pl
It od kuchni w nokaut.pl
 
IT od kuchni w Nokaut.pl
IT od kuchni w Nokaut.pl IT od kuchni w Nokaut.pl
IT od kuchni w Nokaut.pl
 
Jak zarabiać na testowaniu oprogramowania(konferencja MeeTTech Piła 27.07.2016)
Jak zarabiać na testowaniu oprogramowania(konferencja MeeTTech Piła 27.07.2016)Jak zarabiać na testowaniu oprogramowania(konferencja MeeTTech Piła 27.07.2016)
Jak zarabiać na testowaniu oprogramowania(konferencja MeeTTech Piła 27.07.2016)
 
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
 

Plus de Piotr Horzycki

Serial(ize) killers, czyli jak popsuliśmy API
Serial(ize) killers, czyli jak popsuliśmy APISerial(ize) killers, czyli jak popsuliśmy API
Serial(ize) killers, czyli jak popsuliśmy APIPiotr Horzycki
 
Mity, które blokują Twoją karierę
Mity, które blokują Twoją karieręMity, które blokują Twoją karierę
Mity, które blokują Twoją karieręPiotr Horzycki
 
Architecture tests: Setting a common standard
Architecture tests: Setting a common standardArchitecture tests: Setting a common standard
Architecture tests: Setting a common standardPiotr Horzycki
 
Software development myths that block your career
Software development myths that block your careerSoftware development myths that block your career
Software development myths that block your careerPiotr Horzycki
 
Software Composition Analysis in PHP
Software Composition Analysis in PHP Software Composition Analysis in PHP
Software Composition Analysis in PHP Piotr Horzycki
 
How to count money with Java and not lose it
How to count money with Java and not lose itHow to count money with Java and not lose it
How to count money with Java and not lose itPiotr Horzycki
 
How to count money using PHP and not lose money
How to count money using PHP and not lose moneyHow to count money using PHP and not lose money
How to count money using PHP and not lose moneyPiotr Horzycki
 
New kids on the block: Conducting technical onboarding
New kids on the block: Conducting technical onboardingNew kids on the block: Conducting technical onboarding
New kids on the block: Conducting technical onboardingPiotr Horzycki
 
Time-driven applications
Time-driven applicationsTime-driven applications
Time-driven applicationsPiotr Horzycki
 

Plus de Piotr Horzycki (9)

Serial(ize) killers, czyli jak popsuliśmy API
Serial(ize) killers, czyli jak popsuliśmy APISerial(ize) killers, czyli jak popsuliśmy API
Serial(ize) killers, czyli jak popsuliśmy API
 
Mity, które blokują Twoją karierę
Mity, które blokują Twoją karieręMity, które blokują Twoją karierę
Mity, które blokują Twoją karierę
 
Architecture tests: Setting a common standard
Architecture tests: Setting a common standardArchitecture tests: Setting a common standard
Architecture tests: Setting a common standard
 
Software development myths that block your career
Software development myths that block your careerSoftware development myths that block your career
Software development myths that block your career
 
Software Composition Analysis in PHP
Software Composition Analysis in PHP Software Composition Analysis in PHP
Software Composition Analysis in PHP
 
How to count money with Java and not lose it
How to count money with Java and not lose itHow to count money with Java and not lose it
How to count money with Java and not lose it
 
How to count money using PHP and not lose money
How to count money using PHP and not lose moneyHow to count money using PHP and not lose money
How to count money using PHP and not lose money
 
New kids on the block: Conducting technical onboarding
New kids on the block: Conducting technical onboardingNew kids on the block: Conducting technical onboarding
New kids on the block: Conducting technical onboarding
 
Time-driven applications
Time-driven applicationsTime-driven applications
Time-driven applications
 

Jak zacząć, aby nie żałować - czyli 50 twarzy PHP

  • 1. JAK ZACZĄĆ, ABY NIE ŻAŁOWAĆ CZYLI 50 TWARZY PHP PIOTR HORZYCKI GDAŃSKIE WYDAWNICTWO OŚWIATOWE
  • 2. „Granice mojego języka oznaczają granice mojego świata” Ludwig Wittgenstein
  • 3. Skąd popularność PHP? ● Niski próg wejścia (łatwo zacząć). ● Bardzo dużo tutoriali, książek. ● Duża społeczność na całym świecie. ● Stosowany zarówno w małych domowych projektach, jak i dużych serwisach komercyjnych ● Stale rosnąca wydajność
  • 4. PHP powstał w 1994 roku jako prosty zbiór narzędzi do monitorowania ruchu na stronie – Personal Home Page Tools, upubliczniony dopiero rok później. PHP/FI 2.0 – prosty język skryptowy: Suppose you have a form: <FORM ACTION="/cgi-bin/php.cgi/~userid/display.html" METHOD=POST> <INPUT TYPE="text" name="name"> <INPUT TYPE="text" name="age"> <INPUT TYPE="submit"> </FORM> Your display.html file could then contain something like: <?echo "Hi $name, you are $age years old!<p>"> It's that simple! PHP/FI automatically creates a variable for each form input field in your form. źródło: http://php.net/manual/phpfi2.php
  • 5. ● PHP 3: przepisany silnik, zwiększona wydajność i bezpieczeństwo ● PHP 4: początki programowania obiektowego ● PHP 5: modyfikatory dostępu do atrybutów/metod, stopniowe ulepszenia w kolejnych wersjach: PDO, obsługa wyjątków, namespace, domknięcia, wyrażenia lambda ● PHP 6: nieudana próba obsługi unicode, projekt porzucono ● PHP 7: taki, jaki znamy dziś: znaczny refaktoring silnika, mniejsze zużycie RAM i czasu procesora; skalarne typy parametrów (int, string), nowe operatory (coalesce, spaceship)
  • 6. PHP-owy szał i mroki średniowiecza
  • 7. Popularne błędy bezpieczeństwa w skryptach PHP (małych i dużych) ● brak odpowiedniego filtrowania danych wejściowych ● SQL injection ● cross-site scripting ● file inclusion ● nadpisywanie zmiennych globalnych
  • 8. Co wyszło z użycia? ● magic_quotes: niezgrabne zabezpieczenie przed SQL Injection, zależne od konfiguracji serwera, polegało na automatycznym dodawaniu backslasha przed cudzysłowami i apostrofami w danych wejściowych; sprawiało więcej szkód niż pożytku, zastąpione przez PDO i prepared statements ● register_globals: zmienne tworzone automatycznie na podstawie GET i POST, co przyczyniało się do dziur bezpieczeństwa ● funkcje mysql_* - zastąpione przez obiektowe odpowiedniki lub PDO
  • 9. Problemy z programowaniem w PHP ● Dużo przestarzałych materiałów ● Sprzyja pisaniu "na szybko" ● Nie wymusza jednego paradygmatu ● Brak konsekwencji w budowie biblioteki standardowej (str_pad, strstr...) ● Zachowanie często zależy od konfiguracji ● Jest interpretowany, więc wiele błędów wychodzi po uruchomieniu – dlatego przydaje się statyczna analiza kodu
  • 11. Jaki powinien być nasz kod? ● Zrozumiały dla innych ● Łatwy w rozbudowie ● Stabilny ● Testowalny
  • 12. Piszę skrypty „na szybko” Zrobię to „po swojemu” Tworzę przemyślaną architekturę Używam sprawdzonych rozwiązań vs
  • 13. Pułapki "małych" projektów ● "To będzie prosta aplikacja" ● "Tego nikt raczej nie będzie zmieniał" ● "Niewielu ludzi będzie z tego korzystać" ● "To taki wewnętrzny projekt, tylko dla nas" ● "To tylko na chwilę, za miesiąc to zaoramy" ● "To się raczej nie zdarzy" Projekty informatyczne prawie zawsze rozrastają się i działają dłużej, niż przewidywano
  • 14. Korzystaj z dorobku innych! ● standardy PHP-FIG: PSR-2, PSR-4, PSR-7… ● frameworki ze wsparciem komercyjnym ● popularne paczki Composera, np. http://moneyphp.org/ ● wzorce projektowe Gang of Four adaptowane dla PHP https://github.com/domnikl/DesignPatternsPHP ● Domain-Driven Design: https://leanpub.com/ddd-in-php/read ● Architektura warstwowa: http://alistair.cockburn.us/Hexagonal+architecture
  • 15. Narzędzia są tworzone przez ludzi takich jak Ty – omylnych. Twórz elastyczne systemy, w których narzędzia można łatwo wymieniać.
  • 16. Composer ● zastąpił PEAR ● podobny do bundlera z Ruby ● łatwa, semantyczna kontrola wersji ● automatyzacja ● generuje autoloader PSR-4 ● dobry sposób na modularyzację własnego kodu
  • 17. Automatyczne ładowanie klas src |-- SomeClass.php ← PiotrMyAppSomeClass tests |-- SomeClassTest.php ← PiotrMyAppTestsSomeClassTest composer.json: { "autoload": { "psr-4": { "PiotrMyApp": "src/", "PiotrMyAppTests": "tests/" } } composer dump-autoload i już...
  • 18. Statyczna analiza kodu ● Wykrywa popularne błędy, niedoróbki (code smells) ● Bada złożoność kodu, liczbę zależności, czytelność, podatność na błędy... ● Pilnuje standardu formatowania kodu PSR-2 ● Uruchamiana lokalnie, przed commitem oraz automatycznie po umieszczeniu kodu w repozytorium (część Continuous Integration) ● Przykładowo: PHP Code Sniffer, PHPMetrics, PHPStan
  • 19.
  • 20. Skąd wiesz, że Twój program działa? ● Najpierw testy, potem implementacja. ● Wykonywane przed i po commicie. ● Są formą dokumentacji. ● Kod nie może pójść na produkcję, jeśli testy się nie powiodły. class OrderTest extends PHPUnitFrameworkTestCase { public function testTotalAmount() { $order = new Order(); $order->addItem(new Product(), Money::PLN(‘100’), 3); $this->assertEquals(30000, $order->getTotalAmount()); } }
  • 21. ● Projektanci i testerzy piszą testy akceptacyjne, które mogą być automatycznie uruchamiane ● Testy akceptacyjne są formą dokumentacji, która żyje, a nie idzie w zapomnienie jak dokumenty Worda Skąd wiesz, że Twój program działa?
  • 22. Behat: Feature: ls In order to see the directory structure As a UNIX user I need to be able to list the current directory's contents Scenario: List 2 files in a directory Given I am in a directory "test" And I have a file named "foo" And I have a file named "bar" When I run "ls" Then I should get: """ bar foo """ źródło: http://docs.behat.org/en/v2.5/quick_intro.html Skąd wiesz, że Twój program działa?
  • 23. PHPSpec: namespace spec; use PhpSpecObjectBehavior; class MarkdownSpec extends ObjectBehavior { function it_converts_plain_text_to_html_paragraphs() { $this->toHtml("Hi, there")->shouldReturn("<p>Hi, there</p>"); } } źródło: http://www.phpspec.net/en/stable/manual/getting-started.html Skąd wiesz, że Twój program działa?
  • 24. Codeception: class LoginCest { public function tryLogin(FunctionalTester $I) { $I->amOnPage('/'); $I->click('Login'); $I->fillField('Username', 'Miles'); $I->fillField('Password', 'Davis'); $I->click('Enter'); $I->see('Hello, Miles', 'h1'); } } źródło: http://codeception.com/docs/04-FunctionalTests Skąd wiesz, że Twój program działa?
  • 25. Czas wykonania kompletu testów powinien wynosić maksymalnie kilka minut źródło: https://www.symbio.com/solutions/quality-assurance/test-automation/
  • 26. Dlaczego nie stosujemy TDD? „U nas się takich rzeczy nie robi” „To się nie opłaca” „To tylko w książce tak dobrze wygląda” „Terminy nas gonią” „Musimy utrzymywać stary kod” Brakuje nam wprawy w używaniu TDD. Brakuje wprawy w pisaniu dobrych, pożytecznych testów. Jeśli robimy to codziennie, mamy to w nawyku – wtedy robimy to łatwo, przyjemnie i z korzyścią.
  • 27. Debugowanie ● "Metoda wędrującej d...py" ● Xdebug – debugowanie linia po linii, zdalne debugowanie, sprawdzanie pokrycia kodu testami ● "Whenever you are tempted to type something into a print statement or a debugger expression, write it as a test instead" – Martin Fowler
  • 28. Automatyzacja ● Composer (post-install, post-update) ● Skrypty basha ● Makefile ● Phing ● Continuous Integration/Delivery: Jenkins, GitLab CI, Travis...
  • 29. Jaką architekturę wybrać? ● surowy PHP nie wystarczy ● Model-View-Controller (pożyczone z Ruby on Rails) ● proste "modele" CRUD-owe nie wystarczają w dużych systemach ● Action-Domain-Response ● architektura warstwowa/heksagonalna...
  • 30. Baza danych ● Ponoć jest tylko "szczegółem implementacyjnym"... "The Principles of Clean Architecture by Uncle Bob Martin" https://www.youtube.com/watch?v=o_TH-Y78tt4 ● Kiedyś: zapytania sklejane ze stringów, częste błędy SQL injection, powolne wyszukiwanie... ● Dziś: systemy mapujące relacje na obiekty (Doctrine, Propel, Eloquent) ● Dziś: nierelacyjne bazy danych; MongoDB, Redis ● Dziś: szybkie wyszukiwanie (ElasticSearch) ● Dziś: Command-Query Responsibility Separation
  • 31. Kompilacja i wersjonowanie assetów ● gulp, webpack layout.scss articles.scss => style-02ab5c852d.css forum.scss
  • 32. Vagrant, Docker czy localhost? ● php -S – prosty serwer deweloperski ● Vagrant: maszyna wirtualna z przygotowaną konfiguracją (bash, Ansible, Chef...) ● Docker: kontenery, które łatwo można deployować na serwer testowy lub produkcyjny ● Środowiska deweloperskie, testowe i produkcyjne powinny być jak najbardziej zbliżone do siebie!
  • 33. ● Sentry: automatycznie zbiera i grupuje raporty, wykrywa regresje; dostępne jako SaaS lub samodzielna instalacja) Raportowanie błędów