Як забезпечити якість коду при командній веб-розробки

  1. Інструменти для автоматизації code review PHP
  2. Інструменти для аналізу PHP-коду
  3. Інструменти для контролю сумісності коду з різними версіями PHP
  4. Інструменти для пошуку вразливостей в PHP-коді
  5. Що на виході
  6. PHP Code Sniffer
  7. PHP Mess Detector
  8. PHP Dead Code Detector
  9. PHP Copy Paste Detector
  10. PHP Static Analysis Tool
  11. Phan
  12. PHP Compatibility
  13. PHP 7 Compatibility Checker
  14. Qafoo Quality Analyzer
  15. PHP Metrics
  16. Підсумкова таблиця порівняння інструментів
  17. Апробація інструментів на 1С-Бітрікс
  18. висновок

Програміст - творча професія. Ми створюємо щось нове, керуючись своїми знаннями, внутрішнім розумінням якості і поставленими дедлайнами. дедлайни і знання поки залишимо осторонь і зосередимося на якості.

Навіть у двох братів-програмістів, які закінчили один вуз і працюють в одній компанії, це розуміння якості буде різним. А працювати доводиться в команді, і у колег не повинно виникати бажання викинути весь ваш код і написати все з нуля.

«Що таке поганий / хороший код» - питання риторичне. У нашій статті під якісним кодом ми будемо розуміти:

  • коректний з точки зору платформи (без запитів до БД в шаблонах компонентів, запити до БД з використанням індексів),
  • сумісний з актуальними версіями PHP (5.6, 7.0),
  • відповідний єдиним стандартам кодування , Прийнятим в команді,
  • без ляпів (Запити до БД в циклі, запити до зовнішніх систем на хітах),
  • без вразливостей (XSS, CSRF і т.д.).

З написанням хорошого коду відмінно справляються найдосвідченіші з нас: тімліда. Але їх мало (в штуках), а їх час коштує дорого. У менш досвідчених розробників бувають проблеми з усім перерахованим вище.

Як забезпечити якість коду з точки зору методології відомо. Потрібно розвивати в команді процеси Continuous Integration : Версіонування, тестування, code review. Ми вирішили розібратися: які інструменти підійдуть для автоматизації code review при промислової веб-розробки на PHP. А заодно перевіримо, як знайдені інструменти оцінять код нашого власного сайту і декількох рішень з Marketplace 1С-Бітрікс.

Інструменти для автоматизації code review PHP

Методика пошуку інструментів

Ми знайшли на github.com і packagist.org самі оцінювані і самі завантажувані проекти, пов'язані з аналізом коду PHP. В огляд ми включили тільки надійні (створені не вчора), підтримувані (є спільнота і контрибуторів) і популярні (кількість зірок-"лайків").

Виділили три категорії інструментів:

  • проводять аналіз коду з метою пошуку проблемних місць;
  • перевіряючі сумісність версій PHP 5-7;
  • перевіряючі уразливості.

Інструменти для аналізу PHP-коду

Інструменти для аналізу PHP-коду

PHP Code Sniffer аналізує PHP, CSS і JavaScript-файли на відповідність стандартам кодування, знаходить і виправляє помилки. Стандарт являє собою сукупність sniff-файлів, які задають правила. Кількість установок аналізатора з 2016 року перевищила ~ 330 тисяч. Використання зафіксовано в ~ 7500 проектах.

PHP CS Fixer - інструмент, розроблений автором фреймворка Symfony. Виявляє і виправляє помилки в коді. Крім проходження стандартам кодування (PSR-1, PSR-2 та ін.). Дозволяє писати власні правила. Підтримує PHP 7. Проект стрімко розвивається і набуває популярності як серед користувачів (~ 325 тисяч установок з початку 2016 року), так і у розробників (з 2017 року використовується в ~ 1500 проектах).

PHP Mess Detector визначає помилки коду, неоптимальні і ускладнені місця, невикористовувані змінні, методи, властивості. Дозволяє створювати призначені для користувача правила. Підтримує PHP 7. Зберігає звіти в трьох форматах: текстовий, html, xml. З 2016 року користувачі встановили ~ 315 тисяч разів, використовується в ~ 2000 проектах.

PHP Metrics - інструмент статичного аналізу для PHP. Видає інформацію про проект і використовуваних класах у вигляді згенерованого сайту. Підтримує PHP 7. З 2016 зареєстровано ~ 260 тисяч завантажень.

PHP Static Analysis Tool аналізує кількість і типи параметрів, що передаються конструкторам, методам і функціям; типи, які повертаються методами і функціями і т.д. Інструмент включає підтримку PHP 7 і надає написання власних правил. Кількість скачувань з 2016 року ~ 150 тисяч разів, використаний розробниками в ~ 200 проектах.

PHP Copy Paste Detector видає інформацію про дубльованих ділянках коду. Проект набирає популярність (кількість установок з 2016 року становить ~ 100 тисяч разів, використовується в ~ 1000 проектах).

Phan - статичний аналізатор для PHP. Перевіряє визначення та доступність методів, функцій, класів, traits, інтерфейсів, констант, властивостей і змінних, виявляє невикористаний код, перевіряє код на зворотну сумісність php7 до php5. З 2016 року зафіксовано ~ 80 тисяч раз завантажень.

PHP Dead Code Detector повідомляє користувачеві про функції та методи, які не використовуються в коді. Розвиток проекту було зупинено в 2015 році. Починаючи з 2016 року, кількість установок пішло на спад.

Qafoo Quality Analyzer - інструмент, призначений для візуалізації метрик вихідного коду. Починаючи з 2015 року, інструмент встановлений користувачами ~ 4800 раз.

Інструменти для контролю сумісності коду з різними версіями PHP

Інструменти для контролю сумісності коду з різними версіями PHP

PHP Compatibility - набір правил для PHP Code Sniffer, які перевіряють сумісність поточного коду з іншими версіями PHP, включаючи PHP 7. Починаючи з 2016 року, інструмент встановлений користувачами ~ 22 тисячі разів.

PHP 7 Compatibility Checker - інструмент для перевірки коду PHP 5.3 - 5.6 на сумісність з PHP 7. Знаходить потенційні проблеми в коді і генерує звіти, які містять імена файлів, номери рядків і короткий опис проблеми. При цьому проблеми двох типів: помилки, що викликають серйозні проблеми (фатальна помилка, помилка синтаксису і т.д.) і попередження, що призводять до логічних помилок. Починаючи з 2016 року, інструмент встановлений користувачами ~ 15 тисяч раз.

Інструменти для пошуку вразливостей в PHP-коді

Інструменти для пошуку вразливостей в PHP-коді

На жаль нам не вдалося знайти жодного проекту для аналізу вразливостей в PHP-коді, який заслуговував би на увагу. А жаль…

Висновок простий: не сподівайтеся що натисканням пари кнопок ви зможете знайти все уразливості в своєму коді. Замість цього вивчіть і застосовуйте правила безпеки, специфічні для вашої CMS / фреймворка.

Що на виході

PHP CS Fixer

Результат запуску PHP CS Fixer - єдиний патч-файл, в якому зазначаються:

  • файли, в яких виявлені помилки;
  • правила, які спрацювали;
  • зміни, що торкнулися рядки файлу: віддалені, що залишилися без змін, додані рядки.

приклад:


PHP Code Sniffer

Підсумок роботи PHP Code Sniffer - список файлів і супутніх їм повідомлень про те, скільки помилок може бути автоматично виправлено, а також таблиць з описами порушень у вигляді: рядок, вид (помилка, попередження), можливість виправлення, опис.

приклад:

приклад:

PHP Mess Detector

Звіт в PHP Mess Detector генерується в одному з трьох форматів: текстовий, html, xml. Отриманий файл містить інформацію про виявлені проблеми в файлах. Проблема описується початковій і кінцевій рядком, що спрацювали правилом і пояснюють повідомленням.

приклад:

приклад:

PHP Dead Code Detector

Звіт в PHP Dead Code Detector - це список невикористовуваних функцій і методів із зазначенням кількості займаних рядків, файлу і номера рядка в файлі.

приклад:

приклад:

PHP Copy Paste Detector

У звіт по PHP Copy Paste Detector заносяться файли, в яких дублюються рядки.

приклад:

приклад:

PHP Static Analysis Tool

У звіті PHP Static Analysis Tool для кожного файлу, в якому виявлені помилки, вказується номер рядка в файлі і опис помилки. В кінці звіту наводиться загальна кількість знайдених помилок.

приклад:

приклад:

Інструмент показав себе не кращим чином і був виключений з аналізу. Чому - читайте в кінці статті.

Phan

Результат роботи в Phan може бути виведений в наступних режимах: 'text', 'json', 'csv', 'codeclimate', 'checkstyle', і 'pylint'. У режимі 'csv' виводяться наступні стовпчики: файл, рядок, категорія помилки, phan-тип помилки, повідомлення.

приклад:

приклад:

PHP Compatibility

Результатом PHP Compatibility є список помилок і попереджень, знайдених під час перевірки на сумісність з вказаною версією PHP.

приклад:

приклад:

PHP 7 Compatibility Checker

При перевірці на сумісність PHP 7 Compatibility Checker генерує список порушень в коді: вказується файл, рядок, в якому пояснюється повідомлення і помилковий код.

приклад:

приклад:

Qafoo Quality Analyzer

Qafoo Quality Analyzer генерує звіт в форматі xml, де для кожного файлу наводиться список виявлених помилок з описом.

приклад:

приклад:

PHP Metrics

PHP Metrics після закінчення свого виконання генерує кількісний звіт по метриках і візуалізує отримані дані у вигляді створеного сайту.

приклад:

приклад:

Підсумкова таблиця порівняння інструментів


Що в звіті Інструмент пояснює, в чому помилка що вважати? Яка метрика? Своя конфігурація правил, свої правила PHP CS Fixer Патч-файл з переліком рекомендованих змін Немає Кількість рядків, які пропонує замінити інструмент Так PHP Code Sniffer Таблиці з переліком помилок та відміткою, які можна виправити автоматично Та 1. Кількість помилок
2. Кількість невиправних помилок Та PHP 7 Compatibility Checker Єдиний звіт, по кожній помилці: файл, рядок, пояснення суті помилки Так Кількість помилок Немає PHP Compatibility Єдиний звіт, по кожній помилці: файл, рядок, пояснення суті помилки Так Кількість помилок Та PHP Copy Paste Detector Єдиний звіт з переліком місць, де повторюється ту чи іншу ділянку коду Так * 1. Кількість "клонів"
2. Кількість повторюваних рядків Немає PHP Dead Code Detector Перелік невикористовуваних функцій і методів, файл з їх оголошенням і кількість рядків коду Так * 1. Кількість невикористовуваних функцій / методів
2. Кількість рядків, які займають такі функції / методи Ні PHP Mess Detector Перелік помилок: файл, рядок, правило Так Кількість помилок Та PHP Metrics Перелік помилок: файл, рядок, правило Так Кількість помилок Та PHP Static Analysis Tool Перелік помилок: файл, рядок, правило Так Кількість помилок Та Qafoo Quality Analyzer Перелік помилок: файл, серйозність помилки, рядок, правило Так 1. Кількість помилок
2. Кількість попереджень Так Phan Перелік помилок: файл, серйозність помилки, рядок, правило Так 1. Кількість помилок категорії low
2. Кількість помилок категорії normal
3. Кількість помилок категорії critical
Так

* - у інструменту єдине призначення, пояснення помилок не потрібно

Апробація інструментів на 1С-Бітрікс

Апробація інструментів на 1С-Бітрікс

Кожен з інструментів був випробуваний на коді:

  • тиражних рішень з Marketplace 1С-Бітрікс (3 платних рішення, 5 безкоштовних),
  • сучасного сайту ИнтерВолга (на 1С-Бітрікс),
  • застарілого сайту ИнтерВолга (на самопісний CMS).

Перш ніж підвести підсумки, повідомляємо що інструмент PHP Static Analysis Tool був дискваліфікований і виключений зі змагання. Причина - 90% його помилок це "невідома константа", "невідомий метод", "невідомий клас" ядра Бітрікс (ми перевіряли тільки папку з рішенням). Тобто, чим більше рішення використовувало API Bitrix, тим більше в ньому було "помилок". Спроба додати ядро ​​Бітрікс в аналіз привела до аварійного завершення роботи інструменту з помилкою "Клас Bitrix \ Main \ SystemException оголошений двічі". І дійсно, в ядрі безліч класів оголошених в різних місцях. Вирішивши "а давайте тимчасово приберемо цей клас", отримали іншу помилку. Прибрали її - отримали третю і т.д. Спроби припинили після 13-ої ітерації.

Тепер до підсумками порівняння рішень. Ми рахували не загальна кількість помилок, а кількість помилок на 1000 рядків коду.

ВАЖЛИВО!Щоб отримати максимально показову картину, ми підсумовували ВСЕ зауваження ВСІХ 15 інструментів.Чи не удівлятесь що число помилок часто більше числа рядків.

Місця розподілилися таким чином:

  1. Старий сайт ІВ (703 помилки на 1000 рядків)
  2. 1С-Бітрікс: Сучасний інтернет-магазин (1457 помилки на 1000 рядків)
  3. Новий сайт ІВ (1881 помилки на 1000 рядків)
  4. 1С-Бітрікс: Корпоративний сайт (1998 помилки на 1000 рядків)
  5. Платний ІМ (2506 помилки на 1000 рядків)
  6. Платний ІМ (2525 помилки на 1000 рядків)
  7. Платний ІМ (2682 помилки на 1000 рядків)
  8. Безкоштовний ІМ (3542 помилки на 1000 рядків)
  9. 1С-Бітрікс: Інформаційний портал (3578 помилки на 1000 рядків)
  10. Безкоштовний ІМ (7361 помилки на 1000 рядків)
ВАЖЛИВО!Щоб отримати максимально показову картину, ми підсумовували ВСЕ зауваження ВСІХ 15 інструментів.Чи не удівлятесь що число помилок часто більше числа рядків.

докладні результати наведені в таблиці .

Те, що найкращим став старий сайт ІВ нас щиро здивувало - ми очікували прямо протилежного результату. Цей проект має 2 рекордних показника - кількість помилок і кількість рядків коду. Так і вийшло, що на 1000 рядків коду проблем найменше. Але старий сайт - "почесний" учасник, подивимося на реальні результати.

Справжній переможець нашого дослідження - 1С-Бітрікс: Сучасний інтернет-магазин. Що можна про нього сказати за результатами дослідження:

  1. З 1000 рядків в цьому рішенні - в середньому 17 рядків "копіпаст".
  2. У 2 рядках є виклики застарілого API.
  3. Є 6 порушень при роботі з методами і полями.
  4. 284 рядки коду можна відформатувати автоматично за допомогою PHP CS Fixer.
  5. Майже немає проблем з сумісністю PHP.

Майже немає проблем з сумісністю PHP

Друге місце отримує новий сайт ИнтерВолга. Розроблявся силами всієї компанії в різні роки, він якось зміг не впустити високу планку якості, задану компанією 1С-Бітрікс.


Третє місце - 1С-Бітрікс: Корпоративний сайт. Знову 1С-Бітрікс показав усім, як треба робити сайти.

Найгіршим рішенням на думку "журі" визнаний безкоштовний ІМ з ТОПу маркетплейса.

Додамо ложку дьогтю в бочку меду компанії 1С-Бітрікс - другим з кінця виявилося теж їх рішення, на якій виросло не одне покоління програмістів.

Додамо ложку дьогтю в бочку меду компанії 1С-Бітрікс - другим з кінця виявилося теж їх рішення, на якій виросло не одне покоління програмістів

Передостаннє місце - 1С-Бітрікс: Інформаційний портал

Що стосується інструментів ... По-справжньому корисним, майже без застережень, показав себе PHP Copy Paste Detector - на нашому сайті, наприклад, він знаходив блоки коду по 50-100 рядків, що повторюються в 2-3 місцях. Єдине застереження - часто він лається на виклики вкладених компонентів (наприклад, catalog.element всередині catalog).

Відрізнити справжні помилки від помилкового спрацьовування було складно в PHP Dead Code Detector - тут виявлялися обробники подій, агенти, конструктори і інсталятори, які явно ніде не викликаються в коді або викликаються ззовні модулів.

Щодо PHP Static Analysis Tool вже було сказано, що майже всі його помилки були "помилкові спрацьовування".

Добре показав себе PHP Mess Detector: відстежив дрібну, але неприємну помилку статичного виклику динамічних методів і навпаки. У той же час він лаявся на кожен else, так як "else is never necessary and you can simplify the code to work without else".

Головний "хліб" таких інструментів, як Qafoo Quality Analyzer, PHP Code Sniffer, PHP CS Fixer: перевищення довжини рядків, переклади рядків в кінці файлу, короткі-довгі відкривають php-теги, прогалини після ключових слів if, for, while і т. п. З запропонованого інструментами набору правил ми вибрали найбільш схожі на стандарт оформлення коду 1С-Бітрікс , Але все одно отримали близько 50% помилкових спрацьовувань.

Корисну статистику надає PHP Metrics, якщо у вашій команді є розуміння, скільки операторів для класу вже "багато", а скільки - "ще нормально". аналогічно з цикломатическая складністю .

висновок

Сенс затії з інструментами перевірки якості коду був в тому, щоб з'ясувати який інструмент варто вибрати для автоматизації Code Review. Цю мету ми досягли і свій вибір зупинили на PHP CS Fixer і PHP Code Sniffer. Вони адекватні завданню, популярні, розвиваються, їх можна розширювати, і є маса вже готових тестів. Залишилося тільки адаптувати їх до реалій розробки сайтів на 1С-Бітрікс: Управління Сайтом.

Тепер, з тієї ж докладністю і завзятістю, з якими ми писали цей огляд, будемо впроваджувати ці інструменти в свою командну розробку.


Оцініть статтю:

Яка метрика?