Slide 1

Slide 1 text

Statyczna analiza aplikacji Symfony Jakub Zalas

Slide 2

Slide 2 text

@jakub_zalas Statyczna analiza kodu Analiza programu bez jego uruchamiania.

Slide 3

Slide 3 text

@jakub_zalas Dzięki statycznej analizie możemy: • pogłębić wiedzę o projekcie • wykryć potencjalne błędy lub niewłaściwe założenia • wykryć problemy z jakością i utrzymać określony standard jakości • weryfikować czy decyzje architektoniczne są utrzymywane • wykryć problemy z bezpieczeństwem • przygotować się na wycofanie funkcjonalności • …

Slide 4

Slide 4 text

@jakub_zalas Zalety automatyzacji • inspekcje kodu skupione na istocie problemu (zamiast dyskusji ile spacji powinno mieć wcięcie) • komputer jest nieomylny i bezwzględny (nigdy nie zapomni wypomnieć Ci błędu) • mniej okazji do konfliktów w zespole (to komputer mówi “NIE")

Slide 5

Slide 5 text

Badanie kodu

Slide 6

Slide 6 text

https://github.com/symfony/demo

Slide 7

Slide 7 text

phplint --jobs 10 src https://github.com/overtrue/phplint

Slide 8

Slide 8 text

@jakub_zalas phploc src https://github.com/sebastianbergmann/phploc

Slide 9

Slide 9 text

@jakub_zalas phpmetrics --report-html=metrics . http://www.phpmetrics.org

Slide 10

Slide 10 text

@jakub_zalas

Slide 11

Slide 11 text

@jakub_zalas

Slide 12

Slide 12 text

@jakub_zalas

Slide 13

Slide 13 text

@jakub_zalas

Slide 14

Slide 14 text

@jakub_zalas

Slide 15

Slide 15 text

@jakub_zalas

Slide 16

Slide 16 text

@jakub_zalas

Slide 17

Slide 17 text

@jakub_zalas

Slide 18

Slide 18 text

dephpend metrics src

Slide 19

Slide 19 text

@jakub_zalas

Slide 20

Slide 20 text

pdepend --jdepend-chart=chart.png src https://github.com/pdepend/pdepend

Slide 21

Slide 21 text

@jakub_zalas

Slide 22

Slide 22 text

source: jenkins-php.org

Slide 23

Slide 23 text

Cyclomatic complexity Złożoność cyklomatyczna Metryka odzwierciedlająca stopień skomplikowania programu. Liczba niezależnych ścieżek wykonania programu Ścieżka jest niezależna, jeśli zawiera chociaż jeden fragment który nie jest częścią innej ścieżki

Slide 24

Slide 24 text

@jakub_zalas Złożoność cyklomatyczna 1

Slide 25

Slide 25 text

@jakub_zalas Złożoność cyklomatyczna

Slide 26

Slide 26 text

@jakub_zalas Złożoność cyklomatyczna M = E − N + 2P M - złożoność cyklomatyczna E - liczba krawedzi (strzałki) N - liczba węzłów (okręgi) P - liczba wezłów kończących graf + - 2 =

Slide 27

Slide 27 text

@jakub_zalas Złożoność cyklomatyczna 2 M = E − N + 2P M - złożoność cyklomatyczna E - liczba krawedzi (strzałki) N - liczba węzłów (okręgi) P - liczba wezłów kończących graf + - 2 = 4 4 1

Slide 28

Slide 28 text

@jakub_zalas Złożoność cyklomatyczna M = E − N + 2P M - złożoność cyklomatyczna E - liczba krawedzi (strzałki) N - liczba węzłów (okręgi) P - liczba wezłów kończących graf + - 2 =

Slide 29

Slide 29 text

@jakub_zalas Złożoność cyklomatyczna M = E − N + 2P M - złożoność cyklomatyczna E - liczba krawedzi (strzałki) N - liczba węzłów (okręgi) P - liczba wezłów kończących graf 2 + - 2 = 5 5 1

Slide 30

Slide 30 text

@jakub_zalas Złożoność cyklomatyczna M = E − N + 2P M - złożoność cyklomatyczna E - liczba krawedzi (strzałki) N - liczba węzłów (okręgi) P - liczba wezłów kończących graf + - 2 =

Slide 31

Slide 31 text

@jakub_zalas Złożoność cyklomatyczna M = E − N + 2P M - złożoność cyklomatyczna E - liczba krawedzi (strzałki) N - liczba węzłów (okręgi) P - liczba wezłów kończących graf 3 + - 2 = 8 7 1

Slide 32

Slide 32 text

@jakub_zalas Złożoność cyklomatyczna M = E − N + 2P M - złożoność cyklomatyczna E - liczba krawedzi (strzałki) N - liczba węzłów (okręgi) P - liczba wezłów kończących graf 9

Slide 33

Slide 33 text

@jakub_zalas Jak dużą złożoność jesteśmy w stanie ogarnąć? 1 10 20 50

Slide 34

Slide 34 text

@jakub_zalas churn run src

Slide 35

Slide 35 text

@jakub_zalas churn run src

Slide 36

Slide 36 text

Halstead metrics Metryka odzwierciedlająca stopień skomplikowania programu. Nacisk na złożoność obliczeniową Miara złożoności opierająca się na operatorach i argumentach

Slide 37

Slide 37 text

@jakub_zalas unikalna liczba operatorów unikalna liczba operandów całkowita liczba operatorów całkowita liczba operandów 3 2 3 3 Słownictwo / Vocabulary 5 Rozmiar / Size 6 Objętość / Volume ~14 Trudność / Difficulty 2.25 Wysiłek / Effort 31.5 Błędy / Errors 0.0046 Czas na implementację 1.75s

Slide 38

Slide 38 text

Maintainability index Odzwierciedla względną łatwość utrzymania kodu Wartość pomiędzy 0 a 100 0 - 9 tragedia 10 - 19 umiarkowany 20 - 100 dobry

Slide 39

Slide 39 text

@jakub_zalas 171 - 5.2 * ln(Halstead Volume) - 0.23 * (Cyclomatic Complexity) - 16.2 * ln(Lines of Code) https://blogs.msdn.microsoft.com/codeanalysis/2007/11/20/maintainability-index-range-and-meaning/

Slide 40

Slide 40 text

Widok zależności

Slide 41

Slide 41 text

@jakub_zalas dephpend dot -o dependencies.svg —depth 2 --no-classes src https://dephpend.com

Slide 42

Slide 42 text

phpda analyze https://mamuz.github.io/PhpDependencyAnalysis/

Slide 43

Slide 43 text

@jakub_zalas phpda analyze https://mamuz.github.io/PhpDependencyAnalysis/

Slide 44

Slide 44 text

Automatyzacja decyzji

Slide 45

Slide 45 text

@jakub_zalas

Slide 46

Slide 46 text

phpda analyze https://mamuz.github.io/PhpDependencyAnalysis/

Slide 47

Slide 47 text

phpda analyze https://mamuz.github.io/PhpDependencyAnalysis/

Slide 48

Slide 48 text

dephpend text src https://dephpend.com

Slide 49

Slide 49 text

@jakub_zalas dephpend text src | grep -e '^App \\Entity' https://dephpend.com

Slide 50

Slide 50 text

@jakub_zalas dephpend text src \ | grep -e '^App \\Entity' \ | grep 'Symfony \\Component \\DependencyInjection' \ && echo "Failed to meet a dependency criteria!” https://dephpend.com

Slide 51

Slide 51 text

@jakub_zalas deptrac --formatter-graphviz \ --formatter-graphviz-dump-image=dependencies.png https://github.com/sensiolabs-de/deptrac

Slide 52

Slide 52 text

depfile.yml

Slide 53

Slide 53 text

@jakub_zalas

Slide 54

Slide 54 text

@jakub_zalas

Slide 55

Slide 55 text

@jakub_zalas

Slide 56

Slide 56 text

Wykrywanie problemów

Slide 57

Slide 57 text

phpcpd src https://github.com/sebastianbergmann/phpcpd

Slide 58

Slide 58 text

@jakub_zalas phpinsights analyse https://phpinsights.com

Slide 59

Slide 59 text

@jakub_zalas

Slide 60

Slide 60 text

@jakub_zalas

Slide 61

Slide 61 text

@jakub_zalas phpinsights.php

Slide 62

Slide 62 text

@jakub_zalas phan --init --init-level 1 && phan --color https://github.com/phan/phan

Slide 63

Slide 63 text

@jakub_zalas phpstan analyse --level 0 src https://github.com/phpstan/phpstan phpstan analyse -l 2 src

Slide 64

Slide 64 text

@jakub_zalas phpstan analyse --level 3 src https://github.com/phpstan/phpstan

Slide 65

Slide 65 text

@jakub_zalas phpstan analyse --level 4 src https://github.com/phpstan/phpstan

Slide 66

Slide 66 text

@jakub_zalas phpstan analyse --level 5 src https://github.com/phpstan/phpstan

Slide 67

Slide 67 text

@jakub_zalas phpstan analyse --level 6 src https://github.com/phpstan/phpstan

Slide 68

Slide 68 text

@jakub_zalas phpstan analyse --level 6 src https://github.com/phpstan/phpstan

Slide 69

Slide 69 text

@jakub_zalas phpstan analyse --level 6 src https://github.com/phpstan/phpstan

Slide 70

Slide 70 text

@jakub_zalas phpstan analyse --level 7 src https://github.com/phpstan/phpstan

Slide 71

Slide 71 text

@jakub_zalas phpstan analyse --level 7 src https://github.com/phpstan/phpstan

Slide 72

Slide 72 text

@jakub_zalas phpstan analyse --level 7 src https://github.com/phpstan/phpstan

Slide 73

Slide 73 text

@jakub_zalas phpstan analyse --level max src https://github.com/phpstan/phpstan

Slide 74

Slide 74 text

@jakub_zalas phpstan.neon

Slide 75

Slide 75 text

psalm src https://psalm.dev

Slide 76

Slide 76 text

psalm.xml

Slide 77

Slide 77 text

phpmnd src

Slide 78

Slide 78 text

Bezpieczeństwo

Slide 79

Slide 79 text

phpqa security-checker security:check https://github.com/sensiolabs/security-checker

Slide 80

Slide 80 text

psecio-parse scan src https://github.com/psecio/parse

Slide 81

Slide 81 text

psecio-parse rules https://github.com/psecio/parse

Slide 82

Slide 82 text

Monitorowanie wycofywanych funkcjonalności & kompatybilność wsteczna

Slide 83

Slide 83 text

deprecation-detector check --log-html=deprecated.html src https://github.com/sensiolabs-de/deprecation-detector

Slide 84

Slide 84 text

phpcf src https://github.com/wapmorgan/PhpCodeFixer

Slide 85

Slide 85 text

roave-backward-compatibility-check roa:a --from v1.4.0 https://github.com/Roave/BackwardCompatibilityCheck

Slide 86

Slide 86 text

Styl

Slide 87

Slide 87 text

php-cs-fixer fix src --diff https://cs.symfony.com

Slide 88

Slide 88 text

@jakub_zalas Własny serwer nieustannej integracji ;) mkdir -p jenkins/jenkins_home && cd jenkins
 curl -Ls http: //mirrors.jenkins.io/war-stable/latest/jenkins.war \ -o jenkins.war
 JENKINS_HOME=$(pwd)/jenkins_home java -jar jenkins.war

Slide 89

Slide 89 text

Jakość jako usługa

Slide 90

Slide 90 text

No content

Slide 91

Slide 91 text

@jakub_zalas

Slide 92

Slide 92 text

@jakub_zalas https://twitter.com/ChristinGorman/status/1137996442214252544

Slide 93

Slide 93 text

@jakub_zalas https://github.com/jakzal/phpqa • analyze - Visualizes metrics and source code • behat - Helps to test business expectations • churn - Discovers good candidates for refactoring • composer-normalize - Composer plugin to normalize composer.json files • dephpend - Detect flaws in your architecture • deprecation-detector - Finds usages of deprecated code • deptrac - Enforces dependency rules between software layers • design-pattern - Detects design patterns • diffFilter - Applies QA tools to run on a single pull request • ecs - Sets up and runs coding standard checks • infection - AST based PHP Mutation Testing Framework • parallel-lint - Checks PHP file syntax • paratest - Parallel testing for PHPUnit • pdepend - Static Analysis Tool • phan - Static Analysis Tool • php-coupling-detector - Detects code coupling issues • php-cs-fixer - PHP Coding Standards Fixer • php-formatter - Custom coding standards fixer • php-semver-checker - Suggests a next version according to semantic versioning • phpDocumentor - Documentation generator • phpbench - PHP Benchmarking framework • phpa - Checks for weak assumptions • phpca - Finds usage of non-built-in extensions • phpcb - PHP Code Browser • phpcbf - Automatically corrects coding standard violations • phpcf - Finds usage of deprecated features • phpcov - a command-line frontend for the PHP_CodeCoverage library • phpcpd - Copy/Paste Detector • phpcs - Detects coding standard violations • phpda - Generates dependency graphs • phpdoc-to-typehint - Automatically adds type hints and return types based on PHPDocs • phpinsights - Analyses code quality, style, architecture and complexity • phplint - Lints php files in parallel • phploc - A tool for quickly measuring the size of a PHP project • phpmd - A tool for finding problems in PHP code • phpmetrics - Static Analysis Tool • phpmnd - Helps to detect magic numbers • phpspec - SpecBDD Framework • phpstan - Static Analysis Tool • phpunit - The PHP testing framework • psalm - Finds errors in PHP applications • psecio-parse - Scans code for potential security-related issues • rector - Tool for instant code upgrades and refactoring • roave-backward-compatibility-check - Tool to compare two revisions of a class API to check f • security-checker - Checks composer dependencies for known security vulnerabilities • simple-phpunit - Provides utilities to report legacy tests and usage of deprecated code • testability - Analyses and reports testability issues of a php codebase

Slide 94

Slide 94 text

@jakub_zalas Dziękuję za uwagę Kontakt: [email protected] @jakub_zalas @jakzal