Распространенное мнение о появлении панка, состоит в том, что панк был реакцией на крайности современного рока, в частности прогрессивного рока того времени. Реальность, безусловно, намного сложнее, но я подозреваю, что доля правды в этом есть. Рок-н-ролл в поздние 60-е и 70-е, похоже, был областью “Золотых Богов”, недоступной простому смертному. Контраст между группами типа Rush и Black Flag был огромен.
Шутки ради, давайте взглянем на ударника группы Rush Нила Пирта. Вот его барабанная установка:
<img src="https://www.pvsm.ru/images/d3ac586ee5e8f58acdaae3a1c0b815fd.jpg"/>
А вот Black Flag, на выступлении в Лос-Анджелесе в 1979:
Группу Black Flag целиком можно уместить на площади, занимаемой барабанной установкой Нила Пирта. И они все-равно будут продолжать исполнять улетные вещи и зажигать по полной.
За несколько последних лет, дух PHP, видимо, пошел по пути Нила Пирта. Огромное количество работы, сделанной огромным количеством умных людей, превратилось в сложные и многословные решения. Куча файлов, куча вложенных директорий и куча правил. Я часто вижу PHP-библиотеки/компоненты, которые выглядят так:
<?php chdir(dirname(__DIR__)); require_once (getenv('ZF2_PATH') ?: 'vendor/ZendFramework/library') . '/Zend/Loader/AutoloaderFactory.php'; ZendLoaderAutoloaderFactory::factory(array('ZendLoaderStandardAutoloader' => array())); $appConfig = include 'config/application.config.php'; $listenerOptions = new ZendModuleListenerListenerOptions($appConfig['module_listener_options']); $defaultListeners = new ZendModuleListenerDefaultListenerAggregate($listenerOptions); $defaultListeners->getConfigListener()->addConfigGlobPath('config/autoload/*.config.php'); $moduleManager = new ZendModuleManager($appConfig['modules']); $moduleManager->events()->attachAggregate($defaultListeners); $moduleManager->loadModules(); // Create application, bootstrap, and run $bootstrap = new ZendMvcBootstrap($defaultListeners->getConfigListener()->getMergedConfig()); $application = new ZendMvcApplication; $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
Замечания и поправки к переводу приветствуются.
Автор: truezemez