$30 off During Our Annual Pro Sale. View Details »

Statyczna analiza aplikacji Symfony

Statyczna analiza aplikacji Symfony

Statyczna analiza przeprowadzana jest na kodzie źródłowym bez jego uruchamiania. Jako, że bywa pomocna w recenzjach kodu, jest często częścią procesu ciągłej integracji (ang. Continuous Integration). Potrafi być także niezastąpiona w zdobywaniu wiedzy o nieznajomym projekcie.

Przez swoją obiektywność, statyczna analiza pozwala na skupienie się na rzeczach istotnych dla biznesu, zamiast kłócenia się o literówki, standardy, czy praktyki. Niektóre narzędzia potrafią nawet zidentyfikować problemy z projektem kodu, jego utrzymaniem, czy wykryć błędy. Pozostaje zapytać, czy powinniśmy bezwzględnie ufać narzędziom?

Podczas prelekcji, Kuba wyjaśnił jak wcielić statyczną analizę kodu w projekt oparty o Symfony, aby pogłębić swoją percepcję o jego jakości.

Jakub Zalas

June 13, 2019
Tweet

More Decks by Jakub Zalas

Other Decks in Programming

Transcript

  1. Statyczna analiza aplikacji Symfony
    Jakub Zalas

    View Slide

  2. @jakub_zalas
    Statyczna analiza kodu
    Analiza programu bez jego uruchamiania.

    View Slide

  3. @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
    • …

    View Slide

  4. @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")

    View Slide

  5. Badanie kodu

    View Slide

  6. https://github.com/symfony/demo

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. @jakub_zalas

    View Slide

  11. @jakub_zalas

    View Slide

  12. @jakub_zalas

    View Slide

  13. @jakub_zalas

    View Slide

  14. @jakub_zalas

    View Slide

  15. @jakub_zalas

    View Slide

  16. @jakub_zalas

    View Slide

  17. @jakub_zalas

    View Slide

  18. dephpend metrics src

    View Slide

  19. @jakub_zalas

    View Slide

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

    View Slide

  21. @jakub_zalas

    View Slide

  22. source: jenkins-php.org

    View Slide

  23. 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

    View Slide

  24. @jakub_zalas
    Złożoność cyklomatyczna
    1

    View Slide

  25. @jakub_zalas
    Złożoność cyklomatyczna

    View Slide

  26. @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 =

    View Slide

  27. @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

    View Slide

  28. @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 =

    View Slide

  29. @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

    View Slide

  30. @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 =

    View Slide

  31. @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

    View Slide

  32. @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

    View Slide

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

    View Slide

  34. @jakub_zalas
    churn run src

    View Slide

  35. @jakub_zalas
    churn run src

    View Slide

  36. 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

    View Slide

  37. @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

    View Slide

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

    View Slide

  39. @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/

    View Slide

  40. Widok zależności

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  44. Automatyzacja decyzji

    View Slide

  45. @jakub_zalas

    View Slide

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

    View Slide

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

    View Slide

  48. dephpend text src
    https://dephpend.com

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  52. depfile.yml

    View Slide

  53. @jakub_zalas

    View Slide

  54. @jakub_zalas

    View Slide

  55. @jakub_zalas

    View Slide

  56. Wykrywanie problemów

    View Slide

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

    View Slide

  58. @jakub_zalas
    phpinsights analyse
    https://phpinsights.com

    View Slide

  59. @jakub_zalas

    View Slide

  60. @jakub_zalas

    View Slide

  61. @jakub_zalas
    phpinsights.php

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  74. @jakub_zalas
    phpstan.neon

    View Slide

  75. psalm src
    https://psalm.dev

    View Slide

  76. psalm.xml

    View Slide

  77. phpmnd src

    View Slide

  78. Bezpieczeństwo

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  82. Monitorowanie wycofywanych funkcjonalności
    & kompatybilność wsteczna

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  86. Styl

    View Slide

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

    View Slide

  88. @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

    View Slide

  89. Jakość jako usługa

    View Slide

  90. View Slide

  91. @jakub_zalas

    View Slide

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

    View Slide

  93. @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

    View Slide

  94. @jakub_zalas
    Dziękuję za uwagę
    Kontakt:

    [email protected]
    @jakub_zalas
    @jakzal

    View Slide