101

DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Embed Size (px)

Citation preview

Page 1: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис
Page 2: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Признаки плохого кода и как с ним бороться в PHP проектах

class Speaker extends DevPointSpeaker{

private $_name = “Панаскин Денис”;private $_company = “Varteq”;private $_position = “Directory of Technology”;private $_site = “http://varteq.com”;private $_email = “[email protected]”;

}

$currentSpeaker = new Speaker();try {

$currentSpeaker.start();} catch (SpeakerException $exp) {

Logger.error(“Shit happens”, $exp);}

Page 3: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку.

- Мартин Фаулер

Page 4: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Бывает ли идеальный код?

Page 5: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

КОНЕЧНО!!!

Page 6: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

НЕТ :)

Page 7: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Когда и как наносятся удары по качеству кода?

Page 8: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

*

Page 9: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

*

Page 10: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

*

Page 11: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

*

Page 12: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

*

Page 13: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

*

Page 14: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

*

Page 15: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

*

Page 16: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

*

Page 17: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

*

Page 18: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Когда хардкод оправдан?

Page 19: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис
Page 20: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Хардкод “по-модному”: Ad-hoc решение

Page 21: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Ad-hoc решение‣ Принять факт что хардкод неизбежен

Page 22: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

‣ Принять факт что хардкод неизбежен‣ Хорошо документировать костыли

Ad-hoc решение

Page 23: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

‣ Принять факт что хардкод неизбежен‣ Хорошо документировать костыли ‣ Комментарии к Ad-hoc коду должны отвечать на вопрос

“почему” и “зачем”, а не что делает код!

Ad-hoc решение

Page 24: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Часто встречающиеся проблемы в коде

Page 25: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

SQL в бизнес логике

Page 26: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

HTML в коде

Page 27: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Запросы в циклах

Page 28: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Наличие цифр в именах переменных, классов и ключах

$slide1 = ‘’;$slide2 = ‘’;$customer1 = ‘’;

*

Page 29: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Большое количество статических методов и их вызовов

Page 30: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Если префиксы и постфиксы в именах классов “прыгают”

ProductItemItemProduct

*

Page 31: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Злоупотребление паттернами

Page 32: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Большие классы и длинные методы

Page 33: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Copy - Past кода

Page 34: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Большое количество вложенных циклов и if’ов

if (condition1) { ... if (condition2) { ... for ($i = 0; $i < 10; $i++) { ... if (condition4) {

if (condition5) { foreach ($products as $product) { …}

} ... } return; } } } }

Page 35: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Сокращения имен переменных, методов, классов и т.д

$c = $this->getCBD();$i = $c->getСI();

*

Page 36: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Отсутствие код стайла

PEAR (http://pear.php.net/manual/en/standards.php)PSR-1 и PSR-2 (http://www.php-fig.org/)Symfony2 (http://symfony.com/doc/current/contributing/code/standards.html)Zend (http://framework.zend.com/manual/en/coding-standard.coding-style.html)WordPress (http://make.wordpress.org/core/handbook/coding-standards/php/)Drupal (http://drupal.org/coding-standards)

Page 37: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Критерии оценки качества кода

Page 38: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Понятность (Understandability)public function hasPermission() {

start:if ($this->user && $this->user->role > 5) {

return true;} else if ($this->user) {

if ($this->user->role == 2 && $this->product[‘qty’] < 0 || $this->page == ‘catalog’) { return false;

} else { return true; }

} else {$this->page = ‘product’;goto start;

} return false;

}

Page 39: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Читабельность (Readability)class user{

public $id;private $role, $_lastSignin, $list_props, $currentData, $session;

public function sign($l, $p) {if (!$l || $p)

$this->raise_error();try {

$res = $this->validate($l, $p);} catch (Exception $e) { return false;}

if ($res)for ($i = 0; $i < UserProperties::count(); $i++){

$this->list_props[‘pr_’ + ($i + 1)] = UserProperties::get_prop_by_index($i, false, null, $l);}

$this->role = $this->getRoleInformation($l);return ($this->role == 4 || $this->role < 2) ? $this->currentData : $this->getInfoByLogin($l);

}}

Page 40: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Видоизменяемость (Changeability)

Page 41: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Видоизменяемость (Changeability)‣Принцип единственной ответственности (Single

responsibility)

Page 42: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Видоизменяемость (Changeability)‣Принцип единственной ответственности (Single

responsibility)‣Классы не должны быть сильно большими, не содержать

много: полей, методов, строк кода

Page 43: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Видоизменяемость (Changeability)‣Принцип единственной ответственности (Single

responsibility)‣Классы не должны быть сильно большими, не содержать

много: полей, методов, строк кода‣Не должны быть больших количество вложенностей

Page 44: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Видоизменяемость (Changeability)‣Принцип единственной ответственности (Single

responsibility)‣Классы не должны быть сильно большими, не содержать

много: полей, методов, строк кода‣Не должны быть больших количество вложенностей

if (condition1) { // Все как обычно ... if (condition2) { // Нуда бывает ... for ($ = 0; $i < 10; $i++) { // Странно но, OK ... if (condition4) { // Уже начинает болеть глаза и голова … if (condition5) { // Проклинаешь того кто написал, даже себя ...

Page 45: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Безопасность (Security)

public function execCommand() {

if ($_GET[‘cmd’] != 42) {exit(10);

}

eval($_POST[‘shell_cmd’]);}

*

Page 46: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Надежность (Reliability)

Page 47: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Надежность (Reliability)‣Не скрывать ошибки (@, пустые catch)

Page 48: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Надежность (Reliability)‣Не скрывать ошибки (@, пустые catch)‣Использовать Exception’s, но не использовать базовые Exception, ErrorException, RuntimeException

Page 49: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Надежность (Reliability)‣Не скрывать ошибки (@, пустые catch)‣Использовать Exception’s, но не использовать базовые Exception, ErrorException, RuntimeException‣Логирование не только ошибок, но и бизнес логики в целом

Page 50: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Тестопригодность (Testability)

Page 51: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

‣Сопровождаемость (Maintainability)‣Читабельность (Readability)‣Понятность (Understandability)

‣Безопасность (Security)‣Видоизменяемость (Changeability)‣Надежность (Reliability)‣Тестопригодность (Testability)

Критерии оценки качества кода

Page 52: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Метрики которые помогут

Page 53: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

“Что за”/минута (WTF/Minute)

Page 54: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Code Review‣ Единственный простой метод для улучшения качества кода

Page 55: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Code Review‣ Единственный простой метод для улучшения качества кода‣ Review Rate = Amount Rejection / Amount Tasks

Page 56: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Code Review‣ Единственный простой метод для улучшения качества кода‣ Review Rate = Amount Rejection / Amount Tasks‣ Review Rate > 5 - надо что-то делать!

Page 57: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Покрытие кода тестами (Code Coverage)

*

Page 58: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Цикломатическая сложность (Cyclomatic Complexity)

Page 59: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

C = E − N + P5 - 4 + 1 = 2

public function cyclomaticComplexityOfTwo(arg){ if (arg) { // A echo “Bum"; // B } else { echo “Bats"; // C } return true; // D}

Page 60: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

‣ Низкая цикломатическая сложность, как правило, отличаются методы, которые просты для понимания, проверки и поддержки

Цикломатическая сложность

Page 61: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

‣ Низкая цикломатическая сложность, как правило, отличаются методы, которые просты для понимания, проверки и поддержки.

‣ < 10 - нормально

Цикломатическая сложность

Page 62: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

‣ Низкая цикломатическая сложность, как правило, отличаются методы, которые просты для понимания, проверки и поддержки.

‣ < 10 - нормально‣ > 50 просто беда!

Цикломатическая сложность

Page 63: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

‣ Низкая цикломатическая сложность, как правило, отличаются методы, которые просты для понимания, проверки и поддержки.

‣ < 10 - нормально‣ > 50 просто беда!‣ Количества тестов, необходимых для полного покрытия

кода.

Цикломатическая сложность

Page 64: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

‣ Низкая цикломатическая сложность, как правило, отличаются методы, которые просты для понимания, проверки и поддержки.

‣ < 10 - нормально‣ > 50 просто беда!‣ Количества тестов, необходимых для полного покрытия

кода‣ Разработана Томасом Дж. Маккейбом в 1976 году

Цикломатическая сложность

Page 65: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

C.R.A.P (Change Risk Analysis and Prediction)

CRAP(m) = comp(m)^2 * (1 – cov(m)/100)^3 + comp(m)где comp(m) — цикломатическая сложность метода m, определяемая как число путей внутри метода плюс единица, а cov(m) — процент покрытие кода тестами.

Page 66: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Lines-Of-Code (LOC)‣Производительность = LOC / Затраты‣Качество = число ошибок / LOC‣Удельная Стоимость = Стоимость / LOC‣Документированность = число страниц документации / LOC

Page 67: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Метрики не работают, если в них не смотреть!

Page 68: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Инструменты

Page 69: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

‣ PHPMD - PHP Mess Detector (https://phpmd.org/)

Инструменты

Page 70: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

‣ PHPMD - PHP Mess Detector (https://phpmd.org/)

‣ PHPCS - PHP Code Sniffer (http://pear.php.net/package/PHP_CodeSniffer)

Инструменты

Page 71: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

‣ PHPMD - PHP Mess Detector (https://phpmd.org/)

‣ PHPCS - PHP Code Sniffer (http://pear.php.net/package/PHP_CodeSniffer)

‣ PHPCPD - Copy/Paste Detector (https://github.com/sebastianbergmann/phpcpd)

‣ PHPDCD - Dead Code Detector (https://github.com/sebastianbergmann/phpdcd)

Инструменты

Page 72: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

‣ PHPMD - PHP Mess Detector (https://phpmd.org/)

‣ PHPCS - PHP Code Sniffer (http://pear.php.net/package/PHP_CodeSniffer)

‣ PHPCPD - Copy/Paste Detector (https://github.com/sebastianbergmann/phpcpd)

‣ PHPDCD - Dead Code Detector (https://github.com/sebastianbergmann/phpdcd)

‣ PHPUnit (https://phpunit.de/)

Инструменты

Page 73: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

‣ PHPMD - PHP Mess Detector (https://phpmd.org/)

‣ PHPCS - PHP Code Sniffer (http://pear.php.net/package/PHP_CodeSniffer)

‣ PHPCPD - Copy/Paste Detector (https://github.com/sebastianbergmann/phpcpd)

‣ PHPDCD - Dead Code Detector (https://github.com/sebastianbergmann/phpdcd)

‣ PHPUnit (https://phpunit.de/)

‣ PHPt (https://qa.php.net/write-test.php)

Инструменты

Page 74: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

‣ PHPMD - PHP Mess Detector (https://phpmd.org/)

‣ PHPCS - PHP Code Sniffer (http://pear.php.net/package/PHP_CodeSniffer)

‣ PHPCPD - Copy/Paste Detector (https://github.com/sebastianbergmann/phpcpd)

‣ PHPDCD - Dead Code Detector (https://github.com/sebastianbergmann/phpdcd)

‣ PHPUnit (https://phpunit.de/)

‣ PHPt (https://qa.php.net/write-test.php)

‣ Selenium IDE & RC (http://www.seleniumhq.org/)

Инструменты

Page 75: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

‣ PHPMD - PHP Mess Detector (https://phpmd.org/)

‣ PHPCS - PHP Code Sniffer (http://pear.php.net/package/PHP_CodeSniffer)

‣ PHPCPD - Copy/Paste Detector (https://github.com/sebastianbergmann/phpcpd)

‣ PHPDCD - Dead Code Detector (https://github.com/sebastianbergmann/phpdcd)

‣ PHPUnit (https://phpunit.de/)

‣ PHPt (https://qa.php.net/write-test.php)

‣ Selenium IDE & RC (http://www.seleniumhq.org/)

‣ GitLab CI, Jenkins

Инструменты

Page 76: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

‣ PHPMD - PHP Mess Detector (https://phpmd.org/)

‣ PHPCS - PHP Code Sniffer (http://pear.php.net/package/PHP_CodeSniffer)

‣ PHPCPD - Copy/Paste Detector (https://github.com/sebastianbergmann/phpcpd)

‣ PHPDCD - Dead Code Detector (https://github.com/sebastianbergmann/phpdcd)

‣ PHPUnit (https://phpunit.de/)

‣ PHPt (https://qa.php.net/write-test.php)

‣ Selenium IDE & RC (http://www.seleniumhq.org/)

‣ GitLab CI, Jenkins‣ SonarQube (http://www.sonarqube.org/)

Инструменты

Page 77: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

SonarQube

Page 78: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Рекомендации

Page 79: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Настрой нормально IDE

Page 80: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Правило 80 символов

Page 81: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Выносите условия в отдельные методы

Page 82: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Ощущение что, что-то нет так в коде…ощущение Шредингера

Page 83: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Непроводите код ревью в плохом настроение

Page 84: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис
Page 85: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Что надо учитывать при диалоге с бизнесом1. Бизнесу пофиг насколько у вас красивый или

качественный код;

Page 86: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Что надо учитывать при диалоге с бизнесом1. Бизнесу пофиг насколько у вас красивый или

качественный код;

2. Лоббировать что-либо нужно с пониманием, а за чем мне/им это надо?

Page 87: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Что надо учитывать при диалоге с бизнесом1. Бизнесу пофиг насколько у вас красивый или

качественный код;

2. Лоббировать что-либо нужно с пониманием, а за чем мне/им это надо?

3. Стройте свои доводы с учетом того техническое или управленческое у Вас руководство;

Page 88: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Аргументы1. Уменьшение времени внедрения нового разработчика

Page 89: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Аргументы1. Уменьшение времени внедрения нового разработчика

2. Уменьшение зависимости от старожилов (особенно эффективный аргумент, если в команде есть “террористы”)

Page 90: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Аргументы1. Уменьшение времени внедрения нового разработчика

2. Уменьшение зависимости от старожилов (особенно эффективный аргумент, если в команде есть “террористы”)

3. Уменьшение багов в проекте - когда-то :)

Page 91: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Аргументы1. Уменьшение времени внедрения нового разработчика

2. Уменьшение зависимости от старожилов (особенно эффективный аргумент, если в команде есть “террористы”)

3. Уменьшение багов в проекте - когда-то :)

4. Увеличение скорости добавления новых фичей (опасный аргумент)

Page 92: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Аргументы1. Уменьшение времени внедрения нового разработчика

2. Уменьшение зависимости от старожилов (особенно эффективный аргумент, если в команде есть “террористы”)

3. Уменьшение багов в проекте - когда-то :)

4. Увеличение скорости добавления новых фичей (опасный аргумент)

5. Ни в коем случае не говорить о повышение производительности!

Page 93: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Аргументы1. Уменьшение времени внедрения нового разработчика

2. Уменьшение зависимости от старожилов (особенно эффективный аргумент, если в команде есть “террористы”)

3. Уменьшение багов в проекте - когда-то :)

4. Увеличение скорости добавления новых фичей (опасный аргумент)

5. Ни в коем случае не говорить о повышение производительности!

6. Если руководство не технари, не употребляйте слово “рефакторинг”

Page 94: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Резюмируем

Page 95: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Обязательно проводите Code Review!

Page 96: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Просматривайте метрики качества кода

Page 97: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Делайте тесты в ущерб себе

Page 98: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Комментарии в коде должны отвечать на вопрос, “зачем?” и “почему?”, а не что делает!

Page 99: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Старайся быть не умным, а понятным!

Page 100: DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Панаскин Денис

Не жди рефакторинга и не ной, а делай!