SlideShare a Scribd company logo
1 of 40
Download to read offline
CZYM JEST ZŁOŻONOŚĆ?
Identyfikacja i rozwiązywanie podstawowych problemów
Ciprian Alexandru Pitis
O mnie
GOG.com
Senior Web Developer
Czym się zajmuję?
Rozwijam i utrzymuję kod
W międzyczasie szukam złotego Graala
designu aplikacji ;)
GOG.com
Historia Start w 2008 pod skrzydłami CD Projekt - zespół 10 osób
Obecnie zatrudnionych jest ponad 70 osób
Obecna
pozycja
#1 globalnej dystrybucji klasycznych gier na PC i Mac
#2 globalnej dystrybucji gier indie na PC i Mac
Partnerzy 220+ twórców i wydawców gier
Klienci Ponad 2.7 miliona unikalnych wejść miesięcznie z całego
świata
Gry Ponad 800 tytułów w katalogu
Ponad 39 milionów gier na kontach użytkowników
Agenda
1. Czym jest złożoność?
2. Dlaczego złożoność jest problematyczna?
3. Złożoność a design kodu
4. Złożoność poznawcza
5. Podsumowanie i wnioski
Czym jest złożoność?
CZYM JEST ZŁOŻONOŚĆ?
• Trudność w zrozumieniu, wykonaniu i zweryfikowaniu poprawności
projektu.
• Im większa liczba możliwych interakcji w procesie, tym więcej
rzeczy może pójść nie tak.
Dlaczego złożoność jest problematyczna?
CZŁOWIEK TO NIE MASZYNA
• Ludzki umysł nie może ogarnąć nieskończonej ilości informacji.
• Według badań, człowiek może myśleć o maksymalnie 4 rzeczach na raz.
• Zbyt dużo informacji na raz to ryzyko nieświadomej pomyłki.
Dlaczego złożoność jest problematyczna?
TOKSYCZNY WPŁYW NA PROJEKT
• Złożoność rodzi złożoność.
• Zamiast myśleć o istocie problemu i sposobie rozwiązania musimy
myśleć o stanie obecnym i o tym jak zaadaptować się do nowych
warunków.
Złożoność a design kodu
PODSTAWOWE METRYKI
Cyclomatic Complexity
(CC)
Liczba linearnie niezależnych ścieżek, w kodzie z
jednym punktem wyjścia równa jest liczbie punktów
decyzyjnychNPath Complexity (NP) Liczba możliwych różnych przebiegów w kodzie
Afferent Coupling (CA) Liczba klas, które polegają na danej implementacji
Efferent Coupling (CE) Liczba klas, na których polega dana klasa
Stability (I) Wartość: CE / (CA + CE), określa ogólną stabilność,

0 to całkowita stabilność, 1 to całkowita niestabilność
Złożoność a design kodu
function fizzBuzz($n)
{
$output = "";
if ($output % 3 == 0) {
$output .= "Fizz";
}
if ($output % 5 == 0) {
$output .= "Buzz";
}
return $output;
}
Złożoność a design kodu
REKOMENDOWANE LIMITY (wg PMD i
phpMD)
• CC <= 10
• NPath <= 200
• Powyżej podanych metryk, kod przeważnie zaczyna robić się trudny

do zrefaktorowania i zrozumienia.
http://phpmd.org/rules/index.html#code-size-rules
Złożoność a design kodu
TESTY JEDNOSTKOWE
• Chronią przed niepożądanymi zmianami.
• Pozwalają na bardziej swobodną refaktoryzację.
Złożoność a design kodu
• Kod ma 100% code coverage, 100% path coverage.
• Jesteśmy kryci przed każdą pomyłką?
• .. niestety nie. Ale prawie.
$this->assertEquals(fizzBuzz(2) == "");
$this->assertEquals(fizzBuzz(9) == "Fizz");
$this->assertEquals(fizzBuzz(10) == "Buzz");
$this->assertEquals(fizzBuzz(30) == "FizzBuzz");
Złożoność a design kodu
ROZBIJANIE PROBLEMÓW:

SEPARATION OF CONCERNS
• Nasze aplikacje rozwiązują jakiś (duży) problem, najczęściej biznesowy.
• Każdy problem można rozbić na więcej pod-problemów.
Złożoność a design kodu
OBSŁUŻENIE ŻĄDANIA HTTP KLIENTA
PRZESŁANIE OBIEKTU
REQUEST DO KONTROLERA
URUCHOMIENIE BUNDLI
STWORZENIE OBIEKTU
REQUEST
WYBRANIE ROUTE’A NA
PODSTAWIE ŚCIEŻKI
ŻĄDANIA HTTP
ODESŁANIE ODPOWIEDZI
WYTWORZENIE OBIEKTU TYPU RESPONSE
ODPYTANIE BAZY DANYCH
O ŻĄDANE INFORMACJE
GENERACJA WIDOKU
DLA UŻYTKOWNIKA
URUCHOMIENIE INNYCH
ŻĄDANYCH PROCESÓW
ZAPYTANIE DO
BAZY DANYCH
GENERACJA
SZABLONÓW TWIG
ZAPYTANIE
DO CACHE
OTRZYMANIE OBIEKTU TYPU RESPONSE
Złożoność a design kodu
OBSŁUŻENIE ŻĄDANIA HTTP KLIENTA
URUCHOMIENIE BUNDLI
STWORZENIE OBIEKTU
REQUEST
WYBRANIE ROUTE’A NA
PODSTAWIE ŚCIEŻKI
ŻĄDANIA HTTP
PRZESŁANIE OBIEKTU
REQUEST DO KONTROLERA
WYTWORZENIE OBIEKTU TYPU RESPONSE
ODPYTANIE BAZY DANYCH
O ŻĄDANE INFORMACJE
GENERACJA WIDOKU
DLA UŻYTKOWNIKA
URUCHOMIENIE INNYCH
ŻĄDANYCH PROCESÓW
ZAPYTANIE DO
BAZY DANYCH
GENERACJA
SZABLONÓW TWIG
ZAPYTANIE
DO CACHE
Złożoność a design kodu
OBSŁUŻENIE ŻĄDANIA HTTP KLIENTA
URUCHOMIENIE BUNDLI
STWORZENIE OBIEKTU
REQUEST
WYBRANIE ROUTE’A NA
PODSTAWIE ŚCIEŻKI
ŻĄDANIA HTTP
PRZESŁANIE OBIEKTU
REQUEST DO KONTROLERA
WYTWORZENIE OBIEKTU TYPU RESPONSE
URUCHOMIENIE INNYCH
ŻĄDANYCH PROCESÓW
GENERACJA WIDOKU
DLA UŻYTKOWNIKA
GENERACJA
SZABLONÓW TWIG
ODPYTANIE BAZY DANYCH
O ŻĄDANE INFORMACJE
ZAPYTANIE DO
BAZY DANYCH
ZAPYTANIE
DO CACHE
Złożoność a design kodu
OBSŁUŻENIE ŻĄDANIA HTTP KLIENTA
PRZESŁANIE OBIEKTU
REQUEST DO KONTROLERA
URUCHOMIENIE BUNDLI
STWORZENIE OBIEKTU
REQUEST
WYBRANIE ROUTE’A NA
PODSTAWIE ŚCIEŻKI
ŻĄDANIA HTTP
WYTWORZENIE OBIEKTU TYPU RESPONSE
URUCHOMIENIE INNYCH
ŻĄDANYCH PROCESÓW
GENERACJA WIDOKU
DLA UŻYTKOWNIKA
GENERACJA
SZABLONÓW TWIG
ODPYTANIE BAZY DANYCH
O ŻĄDANE INFORMACJE
ZAPYTANIE DO
BAZY DANYCH
ZAPYTANIE
DO CACHE
ODESŁANIE ODPOWIEDZI
OTRZYMANIE OBIEKTU TYPU RESPONSE
Złożoność a design kodu
DOBRE OBIEKTY TO MAŁE OBIEKTY
• Uniwersalna zasada: „preferuj gęstszą sieć mniejszych obiektów od rzadszej
sieci większych obiektów” - Nigel Thorne
• Single Responsibility Principle
• Design By Contract (Liskov Substitute Principle)
• Dependency Inversion Principle
• Interface Segregation Principle
• Tell, don’t ask
http://stackoverflow.com/questions/243274/best-practice-with-unit-testing-abstract-classes
Złożoność a design kodu
SINGLE RESPONSIBILITY PRINCIPLE
• Każdy obiekt powinien mieć jedną odpowiedzialność.
• “Odpowiedzialność to powód do modyfikacji” - Robert C. Martin
Złożoność a design kodu
class AppKernel { … }
class Controller { … }
class TwigEngine implements EngineInterface { … }
Złożoność a design kodu
DESIGN BY CONTRACT
• Wprowadzenie jasnego kontraktu umożliwia jawne przekazanie informacji.
• Te informacje to m.in to, czego dana klasa oczekuje, co i w jakim wypadku zwraca,
a także wyjątki które może zwrócić i co one oznaczają.
• Brak typów wartościowych (int, string…) oraz zwracanych wartości w PHP niestety
to utrudniają, ale annotacje PHPDoc (@param, @return, @throws) i dobre IDE
pomagają w utrzymaniu dyscypliny.
Złożoność a design kodu
interface UserRepository {
public function findOne(UserId $userId);
}
class MysqlUserRepository {
private $connection;
public function __construct(Connection $connection) {
$this->connection = $connection;
}
public function findOne(UserId $userId) {
return $this->connection->query("SELECT * from users WHERE id = :uid", [$userId->value()]);
}
}
class InMemoryUserRepository { […] }
Złożoność a design kodu
DEPENDENCY INVERSION PRINCIPLE
• Nie powinno być „hierarchii klasowej”. Zamiast tego, wszystko powinno być
zależne od abstrakcyjnych interfejsów.
• Abstrakcja nie powinna polegać na implementacji (to ma być złączone z
poniższym).
• Implementacja powinna polegać na abstrakcji.
Złożoność a design kodu
class BlogController {
public function __construct(BlogPagesRepository $repository ) { … }
}
interface BlogPagesRepository { … }
class MysqlBlogPagesRepository implements BlogPagesRepository { … }
class MongoDbPagesRepository implements BlogPagesRepository { … }
Złożoność a design kodu
INTERFACE SEGREGATION PRINCIPLE
• Klient nie powinien zależeć od metod, którego nie potrzebuje.
• Ułatwia tworzenie implementacji do granularnych interfejsów.
Złożoność a design kodu
interface VisitorInterface {
public function getIP();
}
interface UserInterface {
public function getId();
}
class HttpUser implements VisitorInterface, UserInterface { … }
class Crawler implements VisitorInterface { … }
class CliUser implements UserInterface { … }
Złożoność a design kodu
TELL, DON’T ASK
• Mów obiektom co mają robić, nie pytaj ich o stan.
• Stawiaj warunki tam, gdzie są one zasadne dla danego problemu.
Złożoność a design kodu
// BasketController.php
if($customer->getCountOfItemsInBasket() < 3) {
$customer->addToBasket($item);
}
ŹLE (IMPLEMENTACJA KLASY CUSTOMER WYCIEKA DO KONTROLERA):
Złożoność a design kodu
//BasketController.php
$customer->addToBasket($item);
//Customer.php
public function addToBasket($item) {
if($this->getCountOfItemsInBasket() < 3) {
[…]
}
}
DOBRZE:
Złożoność a design kodu
KORZYŚCI ZE STOSOWANIA
• Odizolowanie problemów od siebie = Większa elastyczność
• Mniejsze problemy = Mniejsza złożoność
Złożoność a design kodu
SCOPE
• Każdy kod posiada jakiś scope, w którym ma
zadeklarowane swoje wartości.
• Wszystkie dane w scopie powinny być mu jawnie
przekazane poprzez parametry.
Złożoność a design kodu
PROBLEMY ZE SCOPE’EM
• Global variable: global $var;
• Mutability: setFoo($foo) - Dla obiektów które nie przenoszą danych
• Zależność od implementacji
Złożoność a design kodu
POMOCNE NARZĘDZIA
phpMD Na podstawie reguł alarmuje Nas, gdy dana klasa/
metoda może okazać się problematyczna w utrzymaniu
PHP Code Sniffer Sprawdza zgodność z standardami PSR
PHP Code Analyzer Wykonuje analizę statyczną kodu, inferencję typów ,
wykrywa proste błędy
Solidne IDE Wspomaga pisanie i formatowanie kodu, minimalizuje
ryzyko wystąpienia pomyłki mechanicznej ( syntax error,
zły typ, zła klasa, zła metoda.. etc. )
Złożoność poznawcza kodu
ZŁOŻONOŚĆ KOGNITYWNA
• Jawność tego, co dzieje się w kodzie dla osoby czytającej
• Często pomijana (ze względu na swoją
„nietechniczność”), ale jest nie mniej ważna od złożoności
samego kodu
Złożoność poznawcza kodu
ODBIÓR JEST WSZYSTKIM
• Czytelność kodu (Coding Style)
• Język wykorzystywany w aplikacji
• Domain Driven Design, Ubiquitous Language - metodologia,
która minimalizuje narzut w odbiorze
Podsumowanie i wnioski
WNIOSKI
• Zdanie sobie sprawę z tego, co dokładnie sprawia, że kod ciężej
utrzymać to pół sukcesu.
• Pisanie łatwego kodu jest trudne - przepisanie trudnego kodu może być

jeszcze trudniejsze.
• Sprawdzone rozwiązania z zakresu projektowania aplikacji pomagają w

ograniczeniu złożoności aplikacji do koniecznego minimum.
• Czytelność i nazewnictwo są tak samo ważne co sam kod.
Podsumowanie i wnioski
CO ZYSKUJE DEVELOPER I PRODUCT OWNER?
• Czas
• Elastyczność w adaptacji do nowych wymogów biznesowych
• Elastyczność w tworzeniu technicznych implementacji
• Podatność na zmiany, odporność na uszkodzenia produktu
PYTANIA?
SZUKAMY WEBDEVÓW
Więcej informacji u mnie lub na stronie GOG.com/work
DZIĘKUJĘ ZA UWAGĘ
…i zapraszam potem do dyskusji przy pizzy ;)

More Related Content

What's hot

Apache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaApache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użycia
Wojciech Lichota
 

What's hot (20)

Websockety w PHP
Websockety w PHPWebsockety w PHP
Websockety w PHP
 
DynamoDB – podstawy modelowania danych dla opornych
DynamoDB – podstawy modelowania danych dla opornychDynamoDB – podstawy modelowania danych dla opornych
DynamoDB – podstawy modelowania danych dla opornych
 
Jak zostać mobile deweloperem w 1 dzień
Jak zostać mobile deweloperem w 1 dzieńJak zostać mobile deweloperem w 1 dzień
Jak zostać mobile deweloperem w 1 dzień
 
PHP-PM. Hit czy kit?
PHP-PM. Hit czy kit?PHP-PM. Hit czy kit?
PHP-PM. Hit czy kit?
 
Metaprogramowanie w JS
Metaprogramowanie w JSMetaprogramowanie w JS
Metaprogramowanie w JS
 
“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...
“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...
“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...
 
WordCamp Gdynia 2016
WordCamp Gdynia 2016WordCamp Gdynia 2016
WordCamp Gdynia 2016
 
Testowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStackTestowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStack
 
4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...
4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...
4Developers 2015: Szybciej niż Struś Pędziwiatr - WebSockets w aplikacjach we...
 
Kubernetes (Canary) Deployments
Kubernetes (Canary) DeploymentsKubernetes (Canary) Deployments
Kubernetes (Canary) Deployments
 
Jak poprawić Core Web Vitals w aplikacji Next.js
Jak poprawić Core Web Vitals w aplikacji Next.jsJak poprawić Core Web Vitals w aplikacji Next.js
Jak poprawić Core Web Vitals w aplikacji Next.js
 
Uwierzytelnianie dwuetapowe (2FA) w Drupalu [PL]
Uwierzytelnianie dwuetapowe (2FA) w Drupalu [PL]Uwierzytelnianie dwuetapowe (2FA) w Drupalu [PL]
Uwierzytelnianie dwuetapowe (2FA) w Drupalu [PL]
 
PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...
PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...
PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...
 
Apache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaApache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użycia
 
LXC - kontener pingwinów
LXC - kontener pingwinówLXC - kontener pingwinów
LXC - kontener pingwinów
 
Wordpress dla początkujących szkolenie / warsztat 09/10 migracje, backup, mul...
Wordpress dla początkujących szkolenie / warsztat 09/10 migracje, backup, mul...Wordpress dla początkujących szkolenie / warsztat 09/10 migracje, backup, mul...
Wordpress dla początkujących szkolenie / warsztat 09/10 migracje, backup, mul...
 
Drupal jako modularny i rozszerzalny CMS [PL]
Drupal jako modularny i rozszerzalny CMS [PL]Drupal jako modularny i rozszerzalny CMS [PL]
Drupal jako modularny i rozszerzalny CMS [PL]
 
Architektura serwera gier online
Architektura serwera gier onlineArchitektura serwera gier online
Architektura serwera gier online
 
Xdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHPXdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHP
 
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
 

Viewers also liked

Aluminum Brazing Presentation Utilizing Magnetic Field Controllers
Aluminum Brazing Presentation Utilizing Magnetic Field ControllersAluminum Brazing Presentation Utilizing Magnetic Field Controllers
Aluminum Brazing Presentation Utilizing Magnetic Field Controllers
Fluxtrol Inc.
 
UK Airports after Brexit
UK Airports after BrexitUK Airports after Brexit
UK Airports after Brexit
Ilya Burkin
 

Viewers also liked (20)

Lean UX - How to start with Lean Startup in User Experience
Lean UX - How to start with Lean Startup in User ExperienceLean UX - How to start with Lean Startup in User Experience
Lean UX - How to start with Lean Startup in User Experience
 
Event sourcing w PHP (by Piotr Kacała)
Event sourcing w PHP (by Piotr Kacała)Event sourcing w PHP (by Piotr Kacała)
Event sourcing w PHP (by Piotr Kacała)
 
Nutrition
NutritionNutrition
Nutrition
 
Kadıkoy'un cesmeleri Kaynaktan Mahalleye Ab-ı Hayat
Kadıkoy'un cesmeleri Kaynaktan Mahalleye Ab-ı HayatKadıkoy'un cesmeleri Kaynaktan Mahalleye Ab-ı Hayat
Kadıkoy'un cesmeleri Kaynaktan Mahalleye Ab-ı Hayat
 
Muslim christianrelations edited
Muslim christianrelations editedMuslim christianrelations edited
Muslim christianrelations edited
 
Purpose of l ife (06)
Purpose of l ife (06)Purpose of l ife (06)
Purpose of l ife (06)
 
RFNY-2013 - Invest In Moscow - City For Business
RFNY-2013 - Invest In Moscow - City For BusinessRFNY-2013 - Invest In Moscow - City For Business
RFNY-2013 - Invest In Moscow - City For Business
 
Aluminum Brazing Presentation Utilizing Magnetic Field Controllers
Aluminum Brazing Presentation Utilizing Magnetic Field ControllersAluminum Brazing Presentation Utilizing Magnetic Field Controllers
Aluminum Brazing Presentation Utilizing Magnetic Field Controllers
 
UK Airports after Brexit
UK Airports after BrexitUK Airports after Brexit
UK Airports after Brexit
 
The status of_woman_in_islam
The status of_woman_in_islamThe status of_woman_in_islam
The status of_woman_in_islam
 
Islamic occasions
Islamic occasionsIslamic occasions
Islamic occasions
 
سفراء السلام للمبتعثين ) د. خالد الدوسري )
سفراء السلام  للمبتعثين )  د. خالد الدوسري ) سفراء السلام  للمبتعثين )  د. خالد الدوسري )
سفراء السلام للمبتعثين ) د. خالد الدوسري )
 
The Research Identity Connection: Boosting visibility and impact of your rese...
The Research Identity Connection: Boosting visibility and impact of your rese...The Research Identity Connection: Boosting visibility and impact of your rese...
The Research Identity Connection: Boosting visibility and impact of your rese...
 
Tues. March 7th Pine River Announcements
Tues. March 7th Pine River Announcements  Tues. March 7th Pine River Announcements
Tues. March 7th Pine River Announcements
 
Mecca is Mystery Babylon
Mecca is Mystery BabylonMecca is Mystery Babylon
Mecca is Mystery Babylon
 
Case Alert Compass - AG's opinion
Case Alert   Compass - AG's opinionCase Alert   Compass - AG's opinion
Case Alert Compass - AG's opinion
 
ROI marketingowe
ROI marketingoweROI marketingowe
ROI marketingowe
 
R. Villano - Foto (p.te 9)
R. Villano -  Foto (p.te 9)R. Villano -  Foto (p.te 9)
R. Villano - Foto (p.te 9)
 
ACTION/ADVENTURE RETREAT IN KOH YAO NOI, THAILAND
ACTION/ADVENTURE RETREAT IN KOH YAO NOI, THAILANDACTION/ADVENTURE RETREAT IN KOH YAO NOI, THAILAND
ACTION/ADVENTURE RETREAT IN KOH YAO NOI, THAILAND
 
OpenAIRE guidelines for data and literature repositories webinar_28022017
OpenAIRE guidelines for data and literature repositories webinar_28022017OpenAIRE guidelines for data and literature repositories webinar_28022017
OpenAIRE guidelines for data and literature repositories webinar_28022017
 

Similar to Czym jest złożoność ?

C# i .NET
C# i .NETC# i .NET
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz
 
PHP5. Bezpieczne programowanie. Leksykon kieszonkowy
PHP5. Bezpieczne programowanie. Leksykon kieszonkowyPHP5. Bezpieczne programowanie. Leksykon kieszonkowy
PHP5. Bezpieczne programowanie. Leksykon kieszonkowy
Wydawnictwo Helion
 
Seminarium .Net CF 2004
Seminarium .Net CF 2004Seminarium .Net CF 2004
Seminarium .Net CF 2004
Tomasz Cieplak
 
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NETProgramowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Mikołaj Olszewski
 

Similar to Czym jest złożoność ? (20)

Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatyczny
 
Iron Python I Dlr
Iron Python I DlrIron Python I Dlr
Iron Python I Dlr
 
Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHPJak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
 
Praktyczne code reviews - PHPConPl
Praktyczne code reviews - PHPConPlPraktyczne code reviews - PHPConPl
Praktyczne code reviews - PHPConPl
 
Wstęp do Clean Architecture
Wstęp do Clean ArchitectureWstęp do Clean Architecture
Wstęp do Clean Architecture
 
C# i .NET
C# i .NETC# i .NET
C# i .NET
 
university day 1
university day 1university day 1
university day 1
 
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
 
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnychGanymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
 
Dependency Injection w Androidzie
Dependency Injection w AndroidzieDependency Injection w Androidzie
Dependency Injection w Androidzie
 
Praca z Legacy Code
Praca z Legacy CodePraca z Legacy Code
Praca z Legacy Code
 
Legacy code
Legacy codeLegacy code
Legacy code
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
 
PHP5. Bezpieczne programowanie. Leksykon kieszonkowy
PHP5. Bezpieczne programowanie. Leksykon kieszonkowyPHP5. Bezpieczne programowanie. Leksykon kieszonkowy
PHP5. Bezpieczne programowanie. Leksykon kieszonkowy
 
Seminarium .Net CF 2004
Seminarium .Net CF 2004Seminarium .Net CF 2004
Seminarium .Net CF 2004
 
Produkcja aplikacji internetowych
Produkcja aplikacji internetowychProdukcja aplikacji internetowych
Produkcja aplikacji internetowych
 
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NETProgramowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 
Testowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnychTestowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnych
 
Developing native-like Windows application using JavaScript, SSE, eZ Platform...
Developing native-like Windows application using JavaScript, SSE, eZ Platform...Developing native-like Windows application using JavaScript, SSE, eZ Platform...
Developing native-like Windows application using JavaScript, SSE, eZ Platform...
 

More from GOG.com dev team

The story of GOG.com Cache - PHPers 2014 ( PL )
 The story of GOG.com Cache - PHPers 2014 ( PL ) The story of GOG.com Cache - PHPers 2014 ( PL )
The story of GOG.com Cache - PHPers 2014 ( PL )
GOG.com dev team
 

More from GOG.com dev team (9)

In-depth caching in Varnish - GOG Varnish Meetup, march 2019
In-depth caching in Varnish - GOG Varnish Meetup, march 2019In-depth caching in Varnish - GOG Varnish Meetup, march 2019
In-depth caching in Varnish - GOG Varnish Meetup, march 2019
 
Always up to date, testable and maintainable documentation with OpenAPI
Always up to date, testable and maintainable documentation with OpenAPIAlways up to date, testable and maintainable documentation with OpenAPI
Always up to date, testable and maintainable documentation with OpenAPI
 
Symfony without the framework
Symfony without the frameworkSymfony without the framework
Symfony without the framework
 
Versioning challenges in micro services of Gwent
Versioning challenges in micro services of GwentVersioning challenges in micro services of Gwent
Versioning challenges in micro services of Gwent
 
Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze...
Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze...Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze...
Przetwarzanie rozproszone z wykorzystaniem komunikacji asynchronicznej w grze...
 
Design Thinking Workshop: Empathy in the User Experience
Design Thinking Workshop: Empathy in the User ExperienceDesign Thinking Workshop: Empathy in the User Experience
Design Thinking Workshop: Empathy in the User Experience
 
Varnish cache
Varnish cacheVarnish cache
Varnish cache
 
The story of GOG.com Cache - 4developers 2014 ( PL )
The story of GOG.com Cache - 4developers 2014 ( PL )The story of GOG.com Cache - 4developers 2014 ( PL )
The story of GOG.com Cache - 4developers 2014 ( PL )
 
The story of GOG.com Cache - PHPers 2014 ( PL )
 The story of GOG.com Cache - PHPers 2014 ( PL ) The story of GOG.com Cache - PHPers 2014 ( PL )
The story of GOG.com Cache - PHPers 2014 ( PL )
 

Czym jest złożoność ?

  • 1. CZYM JEST ZŁOŻONOŚĆ? Identyfikacja i rozwiązywanie podstawowych problemów Ciprian Alexandru Pitis
  • 2. O mnie GOG.com Senior Web Developer Czym się zajmuję? Rozwijam i utrzymuję kod W międzyczasie szukam złotego Graala designu aplikacji ;)
  • 3. GOG.com Historia Start w 2008 pod skrzydłami CD Projekt - zespół 10 osób Obecnie zatrudnionych jest ponad 70 osób Obecna pozycja #1 globalnej dystrybucji klasycznych gier na PC i Mac #2 globalnej dystrybucji gier indie na PC i Mac Partnerzy 220+ twórców i wydawców gier Klienci Ponad 2.7 miliona unikalnych wejść miesięcznie z całego świata Gry Ponad 800 tytułów w katalogu Ponad 39 milionów gier na kontach użytkowników
  • 4. Agenda 1. Czym jest złożoność? 2. Dlaczego złożoność jest problematyczna? 3. Złożoność a design kodu 4. Złożoność poznawcza 5. Podsumowanie i wnioski
  • 5. Czym jest złożoność? CZYM JEST ZŁOŻONOŚĆ? • Trudność w zrozumieniu, wykonaniu i zweryfikowaniu poprawności projektu. • Im większa liczba możliwych interakcji w procesie, tym więcej rzeczy może pójść nie tak.
  • 6. Dlaczego złożoność jest problematyczna? CZŁOWIEK TO NIE MASZYNA • Ludzki umysł nie może ogarnąć nieskończonej ilości informacji. • Według badań, człowiek może myśleć o maksymalnie 4 rzeczach na raz. • Zbyt dużo informacji na raz to ryzyko nieświadomej pomyłki.
  • 7. Dlaczego złożoność jest problematyczna? TOKSYCZNY WPŁYW NA PROJEKT • Złożoność rodzi złożoność. • Zamiast myśleć o istocie problemu i sposobie rozwiązania musimy myśleć o stanie obecnym i o tym jak zaadaptować się do nowych warunków.
  • 8. Złożoność a design kodu PODSTAWOWE METRYKI Cyclomatic Complexity (CC) Liczba linearnie niezależnych ścieżek, w kodzie z jednym punktem wyjścia równa jest liczbie punktów decyzyjnychNPath Complexity (NP) Liczba możliwych różnych przebiegów w kodzie Afferent Coupling (CA) Liczba klas, które polegają na danej implementacji Efferent Coupling (CE) Liczba klas, na których polega dana klasa Stability (I) Wartość: CE / (CA + CE), określa ogólną stabilność,
 0 to całkowita stabilność, 1 to całkowita niestabilność
  • 9. Złożoność a design kodu function fizzBuzz($n) { $output = ""; if ($output % 3 == 0) { $output .= "Fizz"; } if ($output % 5 == 0) { $output .= "Buzz"; } return $output; }
  • 10. Złożoność a design kodu REKOMENDOWANE LIMITY (wg PMD i phpMD) • CC <= 10 • NPath <= 200 • Powyżej podanych metryk, kod przeważnie zaczyna robić się trudny
 do zrefaktorowania i zrozumienia. http://phpmd.org/rules/index.html#code-size-rules
  • 11. Złożoność a design kodu TESTY JEDNOSTKOWE • Chronią przed niepożądanymi zmianami. • Pozwalają na bardziej swobodną refaktoryzację.
  • 12. Złożoność a design kodu • Kod ma 100% code coverage, 100% path coverage. • Jesteśmy kryci przed każdą pomyłką? • .. niestety nie. Ale prawie. $this->assertEquals(fizzBuzz(2) == ""); $this->assertEquals(fizzBuzz(9) == "Fizz"); $this->assertEquals(fizzBuzz(10) == "Buzz"); $this->assertEquals(fizzBuzz(30) == "FizzBuzz");
  • 13. Złożoność a design kodu ROZBIJANIE PROBLEMÓW:
 SEPARATION OF CONCERNS • Nasze aplikacje rozwiązują jakiś (duży) problem, najczęściej biznesowy. • Każdy problem można rozbić na więcej pod-problemów.
  • 14. Złożoność a design kodu OBSŁUŻENIE ŻĄDANIA HTTP KLIENTA PRZESŁANIE OBIEKTU REQUEST DO KONTROLERA URUCHOMIENIE BUNDLI STWORZENIE OBIEKTU REQUEST WYBRANIE ROUTE’A NA PODSTAWIE ŚCIEŻKI ŻĄDANIA HTTP ODESŁANIE ODPOWIEDZI WYTWORZENIE OBIEKTU TYPU RESPONSE ODPYTANIE BAZY DANYCH O ŻĄDANE INFORMACJE GENERACJA WIDOKU DLA UŻYTKOWNIKA URUCHOMIENIE INNYCH ŻĄDANYCH PROCESÓW ZAPYTANIE DO BAZY DANYCH GENERACJA SZABLONÓW TWIG ZAPYTANIE DO CACHE OTRZYMANIE OBIEKTU TYPU RESPONSE
  • 15. Złożoność a design kodu OBSŁUŻENIE ŻĄDANIA HTTP KLIENTA URUCHOMIENIE BUNDLI STWORZENIE OBIEKTU REQUEST WYBRANIE ROUTE’A NA PODSTAWIE ŚCIEŻKI ŻĄDANIA HTTP PRZESŁANIE OBIEKTU REQUEST DO KONTROLERA WYTWORZENIE OBIEKTU TYPU RESPONSE ODPYTANIE BAZY DANYCH O ŻĄDANE INFORMACJE GENERACJA WIDOKU DLA UŻYTKOWNIKA URUCHOMIENIE INNYCH ŻĄDANYCH PROCESÓW ZAPYTANIE DO BAZY DANYCH GENERACJA SZABLONÓW TWIG ZAPYTANIE DO CACHE
  • 16. Złożoność a design kodu OBSŁUŻENIE ŻĄDANIA HTTP KLIENTA URUCHOMIENIE BUNDLI STWORZENIE OBIEKTU REQUEST WYBRANIE ROUTE’A NA PODSTAWIE ŚCIEŻKI ŻĄDANIA HTTP PRZESŁANIE OBIEKTU REQUEST DO KONTROLERA WYTWORZENIE OBIEKTU TYPU RESPONSE URUCHOMIENIE INNYCH ŻĄDANYCH PROCESÓW GENERACJA WIDOKU DLA UŻYTKOWNIKA GENERACJA SZABLONÓW TWIG ODPYTANIE BAZY DANYCH O ŻĄDANE INFORMACJE ZAPYTANIE DO BAZY DANYCH ZAPYTANIE DO CACHE
  • 17. Złożoność a design kodu OBSŁUŻENIE ŻĄDANIA HTTP KLIENTA PRZESŁANIE OBIEKTU REQUEST DO KONTROLERA URUCHOMIENIE BUNDLI STWORZENIE OBIEKTU REQUEST WYBRANIE ROUTE’A NA PODSTAWIE ŚCIEŻKI ŻĄDANIA HTTP WYTWORZENIE OBIEKTU TYPU RESPONSE URUCHOMIENIE INNYCH ŻĄDANYCH PROCESÓW GENERACJA WIDOKU DLA UŻYTKOWNIKA GENERACJA SZABLONÓW TWIG ODPYTANIE BAZY DANYCH O ŻĄDANE INFORMACJE ZAPYTANIE DO BAZY DANYCH ZAPYTANIE DO CACHE ODESŁANIE ODPOWIEDZI OTRZYMANIE OBIEKTU TYPU RESPONSE
  • 18. Złożoność a design kodu DOBRE OBIEKTY TO MAŁE OBIEKTY • Uniwersalna zasada: „preferuj gęstszą sieć mniejszych obiektów od rzadszej sieci większych obiektów” - Nigel Thorne • Single Responsibility Principle • Design By Contract (Liskov Substitute Principle) • Dependency Inversion Principle • Interface Segregation Principle • Tell, don’t ask http://stackoverflow.com/questions/243274/best-practice-with-unit-testing-abstract-classes
  • 19. Złożoność a design kodu SINGLE RESPONSIBILITY PRINCIPLE • Każdy obiekt powinien mieć jedną odpowiedzialność. • “Odpowiedzialność to powód do modyfikacji” - Robert C. Martin
  • 20. Złożoność a design kodu class AppKernel { … } class Controller { … } class TwigEngine implements EngineInterface { … }
  • 21. Złożoność a design kodu DESIGN BY CONTRACT • Wprowadzenie jasnego kontraktu umożliwia jawne przekazanie informacji. • Te informacje to m.in to, czego dana klasa oczekuje, co i w jakim wypadku zwraca, a także wyjątki które może zwrócić i co one oznaczają. • Brak typów wartościowych (int, string…) oraz zwracanych wartości w PHP niestety to utrudniają, ale annotacje PHPDoc (@param, @return, @throws) i dobre IDE pomagają w utrzymaniu dyscypliny.
  • 22. Złożoność a design kodu interface UserRepository { public function findOne(UserId $userId); } class MysqlUserRepository { private $connection; public function __construct(Connection $connection) { $this->connection = $connection; } public function findOne(UserId $userId) { return $this->connection->query("SELECT * from users WHERE id = :uid", [$userId->value()]); } } class InMemoryUserRepository { […] }
  • 23. Złożoność a design kodu DEPENDENCY INVERSION PRINCIPLE • Nie powinno być „hierarchii klasowej”. Zamiast tego, wszystko powinno być zależne od abstrakcyjnych interfejsów. • Abstrakcja nie powinna polegać na implementacji (to ma być złączone z poniższym). • Implementacja powinna polegać na abstrakcji.
  • 24. Złożoność a design kodu class BlogController { public function __construct(BlogPagesRepository $repository ) { … } } interface BlogPagesRepository { … } class MysqlBlogPagesRepository implements BlogPagesRepository { … } class MongoDbPagesRepository implements BlogPagesRepository { … }
  • 25. Złożoność a design kodu INTERFACE SEGREGATION PRINCIPLE • Klient nie powinien zależeć od metod, którego nie potrzebuje. • Ułatwia tworzenie implementacji do granularnych interfejsów.
  • 26. Złożoność a design kodu interface VisitorInterface { public function getIP(); } interface UserInterface { public function getId(); } class HttpUser implements VisitorInterface, UserInterface { … } class Crawler implements VisitorInterface { … } class CliUser implements UserInterface { … }
  • 27. Złożoność a design kodu TELL, DON’T ASK • Mów obiektom co mają robić, nie pytaj ich o stan. • Stawiaj warunki tam, gdzie są one zasadne dla danego problemu.
  • 28. Złożoność a design kodu // BasketController.php if($customer->getCountOfItemsInBasket() < 3) { $customer->addToBasket($item); } ŹLE (IMPLEMENTACJA KLASY CUSTOMER WYCIEKA DO KONTROLERA):
  • 29. Złożoność a design kodu //BasketController.php $customer->addToBasket($item); //Customer.php public function addToBasket($item) { if($this->getCountOfItemsInBasket() < 3) { […] } } DOBRZE:
  • 30. Złożoność a design kodu KORZYŚCI ZE STOSOWANIA • Odizolowanie problemów od siebie = Większa elastyczność • Mniejsze problemy = Mniejsza złożoność
  • 31. Złożoność a design kodu SCOPE • Każdy kod posiada jakiś scope, w którym ma zadeklarowane swoje wartości. • Wszystkie dane w scopie powinny być mu jawnie przekazane poprzez parametry.
  • 32. Złożoność a design kodu PROBLEMY ZE SCOPE’EM • Global variable: global $var; • Mutability: setFoo($foo) - Dla obiektów które nie przenoszą danych • Zależność od implementacji
  • 33. Złożoność a design kodu POMOCNE NARZĘDZIA phpMD Na podstawie reguł alarmuje Nas, gdy dana klasa/ metoda może okazać się problematyczna w utrzymaniu PHP Code Sniffer Sprawdza zgodność z standardami PSR PHP Code Analyzer Wykonuje analizę statyczną kodu, inferencję typów , wykrywa proste błędy Solidne IDE Wspomaga pisanie i formatowanie kodu, minimalizuje ryzyko wystąpienia pomyłki mechanicznej ( syntax error, zły typ, zła klasa, zła metoda.. etc. )
  • 34. Złożoność poznawcza kodu ZŁOŻONOŚĆ KOGNITYWNA • Jawność tego, co dzieje się w kodzie dla osoby czytającej • Często pomijana (ze względu na swoją „nietechniczność”), ale jest nie mniej ważna od złożoności samego kodu
  • 35. Złożoność poznawcza kodu ODBIÓR JEST WSZYSTKIM • Czytelność kodu (Coding Style) • Język wykorzystywany w aplikacji • Domain Driven Design, Ubiquitous Language - metodologia, która minimalizuje narzut w odbiorze
  • 36. Podsumowanie i wnioski WNIOSKI • Zdanie sobie sprawę z tego, co dokładnie sprawia, że kod ciężej utrzymać to pół sukcesu. • Pisanie łatwego kodu jest trudne - przepisanie trudnego kodu może być
 jeszcze trudniejsze. • Sprawdzone rozwiązania z zakresu projektowania aplikacji pomagają w
 ograniczeniu złożoności aplikacji do koniecznego minimum. • Czytelność i nazewnictwo są tak samo ważne co sam kod.
  • 37. Podsumowanie i wnioski CO ZYSKUJE DEVELOPER I PRODUCT OWNER? • Czas • Elastyczność w adaptacji do nowych wymogów biznesowych • Elastyczność w tworzeniu technicznych implementacji • Podatność na zmiany, odporność na uszkodzenia produktu
  • 39. SZUKAMY WEBDEVÓW Więcej informacji u mnie lub na stronie GOG.com/work
  • 40. DZIĘKUJĘ ZA UWAGĘ …i zapraszam potem do dyskusji przy pizzy ;)