Pull to refresh

The MicroPHP Manifesto

Reading time 5 min
Views 1.9K
Original author: Ed Finkler
Распространенное мнение о появлении панка, состоит в том, что панк был реакцией на крайности современного рока, в частности прогрессивного рока того времени. Реальность, безусловно, намного сложнее, но я подозреваю, что доля правды в этом есть. Рок-н-ролл в поздние 60-е и 70-е, похоже, был областью “Золотых Богов”, недоступной простому смертному. Контраст между группами типа Rush и Black Flag был огромен.

Шутки ради, давайте взглянем на ударника группы Rush Нила Пирта. Вот его барабанная установка:



А вот Black Flag, на выступлении в Лос-Анджелесе в 1979:



Группу Black Flag целиком можно уместить на площади, занимаемой барабанной установкой Нила Пирта. И они все-равно будут продолжать исполнять улетные вещи и зажигать по полной.

За несколько последних лет, дух PHP, видимо, пошел по пути Нила Пирта. Огромное количество работы, сделанной огромным количеством умных людей, превратилось в сложные и многословные решения. Куча файлов, куча вложенных директорий и куча правил. Я часто вижу PHP-библиотеки/компоненты, которые выглядят так:

<?php
chdir(dirname(__DIR__));
require_once (getenv('ZF2_PATH') ?: 'vendor/ZendFramework/library') . '/Zend/Loader/AutoloaderFactory.php';
Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array()));

$appConfig = include 'config/application.config.php';

$listenerOptions = new Zend\Module\Listener\ListenerOptions($appConfig['module_listener_options']);
$defaultListeners = new Zend\Module\Listener\DefaultListenerAggregate($listenerOptions);
$defaultListeners->getConfigListener()->addConfigGlobPath('config/autoload/*.config.php');

$moduleManager = new Zend\Module\Manager($appConfig['modules']);
$moduleManager->events()->attachAggregate($defaultListeners);
$moduleManager->loadModules();

// Create application, bootstrap, and run
$bootstrap = new Zend\Mvc\Bootstrap($defaultListeners->getConfigListener()->getMergedConfig());
$application = new Zend\Mvc\Application;
$bootstrap->bootstrap($application);
$application->run()->send();

И все это, только лишь для того, чтобы запустить ваше приложение.

Это не значит, что этот подход плох, как таковой. Но когда я вижу это, у меня возникает инстинктивная негативная реакция. Мой мозг орет:
FUCK.
THAT.
SHIT.

(не смог подобрать лучших слов – прим. переводчика)

Я не могу делать этого. Я этого не хочу. И я не думаю, что мы должны, делать это так, чтобы создавать всякие клевые штуки.

Подход, который я практикую в последнее время, заключается в том, чтобы начинать с как можно более легковесной основы, с микрофреймворка.

В мире PHP их представляют Slim, Epiphany, Breeze, Limonade, и другие. Для дополнительного функционала я беру легковесные библиотеки, которые помогают мне решить поставленные задачи. Четкость и краткость – это то, на что я обращаю внимание в первую очередь.

Еще одна важная деталь, на которую я смотрю, когда использую чужой код — обязательства. Обычно у меня нет времени на полный аудит кода библиотек, поэтому здесь нужно в какой-то степени доверять тому, кто писал этот код. И с каждой новой зависимостью количество кода, которому нужно доверять, растет. Нужно знать о наличии ошибок и уязвимостей и о том как они будут обработаны. Будут ли анонсы в списке рассылки? Сколько времени потребуется для исправлений и не сломают ли они обратной совместимости? Должен ли я буду обновлять все мои зависимости, если я обновлюсь до следующей версии PHP. Все это строится на предположении, что автор будет иметь время и желание исправлять эти ошибки. Если нет, то вы только что добавили кучу технического долга в ваш код.

Поиск легковесных библиотек, которые не тянут за собой кучу зависимостей, намного сложнее чем должен быть. В основном, я думаю, что это связано с тем, что разработчики сейчас более заинтересованны в разработке под конкретный фреймворк. Некоторая работа была проделана, чтобы сделать зрелые фреймворки менее монолитными и многие разработчики в Твиттере советовали попробовать компоненты Symfony, как вариант. К сожалению, оказалось, что у нас слишком разные представления о легковесности.

Вот вывод cloc для клона репозитория symfony2 HTTP Kernel component:

Mon Dec 26 19:42:23 EST 2011
coj@PsychoMantis ~/Sites > cloc HttpKernel
      94 text files.
      93 unique files.
      12 files ignored.

http://cloc.sourceforge.net v 1.53  T=0.5 s (164.0 files/s, 18736.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
PHP                             72           1175           3440           4290
Bourne Shell                    10             56            155            252
-------------------------------------------------------------------------------
SUM:                            82           1231           3595           4542
-------------------------------------------------------------------------------

Вот то же самое для фреймворка Slim:

Mon Dec 26 19:42:27 EST 2011
coj@PsychoMantis ~/Sites > cloc Slim
      54 text files.
      51 unique files.
      13 files ignored.

http://cloc.sourceforge.net v 1.53  T=0.5 s (82.0 files/s, 17752.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
PHP                             31            660           4473           3280
Bourne Shell                    10             56            155            252
-------------------------------------------------------------------------------
SUM:                            41            716           4628           3532
-------------------------------------------------------------------------------

и для фреймворка Epiphany:

Mon Dec 26 19:42:30 EST 2011
coj@PsychoMantis ~/Sites > cloc Epiphany
      83 text files.
      70 unique files.
      31 files ignored.

http://cloc.sourceforge.net v 1.53  T=0.5 s (102.0 files/s, 5246.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
PHP                             40            218            309           1632
Bourne Shell                    10             56            155            252
HTML                             1              0              0              1
-------------------------------------------------------------------------------
SUM:                            51            274            464           1885
-------------------------------------------------------------------------------

Когда в компоненте больше файлов и строк кода, чем во всем моем базовом фреймворке, я не могу назвать это легковесным.

Это не значит, что это плохо. Это не значит, что это неверный подход. Но, для меня, безусловно, этот подход неверен. И я думаю, я такой не один.

Я не хочу быть прог-рок-звездой и писать претенциозные рок-оперы. Я хочу играть офигительно мощные аккорды в панк-рок группе, которая делает шоу в домике без сцены и раскачает вас так, что вы пойдете и создадите собственную группу. Таким кодером я хочу быть.

Я не хочу быть Нилом Пиртом. Я хочу быть Грегом Джинном.

Поэтому я написал это. Такой себе «micro PHP manifesto», если хотите. Я планирую использовать это как путеводитель в моей PHP-разработке. Возможно, вы тоже найдете для себя в этом что-нибудь полезное.

Я PHP-разработчик
  • Я не разработчик Zend Framework или Symfony или CakePHP
  • Я думаю, что PHP достаточно сложен

Мне нравится делать маленькие вещи
  • Мне нравится делать маленькие вещи, имеющие простые цели
  • Мне нравится делать вещи, которые решают проблемы
  • Мне нравится делать маленькие вещи, которые работают вместе для решения больших проблем

Я хочу писать меньше кода, а не больше
  • Я хочу писать меньше кода, а не больше
  • Я хочу управлять меньшим количеством кода, а не большим
  • Я хочу поддерживать меньшее количество кода, а не большее
  • Я должен обосновать каждый кусок кода, который включаю в проект

Мне нравится простой, читабельный код
  • Я хочу писать понятный код
  • Я хочу иметь легко проверяемый код


Сайт манифеста: microphp.org
О авторе манифеста: funkatron.com/about.html

Замечания и поправки к переводу приветствуются.
Tags:
Hubs:
+51
Comments 87
Comments Comments 87

Articles