Manifest miniaturního PHP

vztek, emoce, podvod

V předchozích dnech vzbudil v PHP komunitě pozornost a vlnu diskusí text Eda Finklera „The MicroPHP Manifesto“. Autor v něm upozorňuje, že ne každému a ne na všechno se vždy a univerzálně hodí velké frameworky, jako jsou Symfony nebo Zend. A je při tom radikální, jak už manifesty bývají…

Tento text vyšel na blogu Funkatron, jehož autorem je Ed Finkler. Český překlad zveřejňujeme s laskavým autorovým souhlasem.

Tradovaný příběh o vzniku punku je, že šlo o reakci na výstřelky tehdejšího rocku, především tzv. „progresivní“ větve. Reálné události byly nepochybně o něco komplikovanější, ale mám podezření, že na tom bude něco pravdy. Rokenrol začal být, zásluhou velkých jmen konce 60. a 70. let, nepřístupný pro průměrného posluchače. Kontrast třeba mezi skupinami Rush na straně jedné a Black Flag na straně druhé, ačkoli obě hrály „rock“, byl propastný.

Schválně, podívejte se na bicí soupravu Neila Pearta, bubeníka Rush:

A tohle jsou Black Flag na koncertu v Los Angeles v roce 1979:

Celí Black Flag by se vešli do prostoru, který zabírá bicí souprava Neila Pearta. A přesto hráli skvělej nářez, ze kterýho jste si sedli na prdel.

V posledních letech jako by se duch PHP pohyboval směrem k Neilu Peartovi. Spousta práce spousty chytrých lidí stvořila komplexní řešení. Spousta souborů, spousta vnořených adresářů a spousta pravidel. Často vídám PHP knihovny nebo komponenty, co vypadají nějak takto:

<?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();

Všechno tohle jen kvůli spuštění aplikace.

Neznamená to, že tenhle přístup je špatný per se. Ale když to vidím, zažívám vnitřní odmítavou reakci. Můj mozek křičí:

TOHLE.
KURVA.
ANI.
OMYLEM.

Nemůžu takhle psát. Nechci tak psát. A nemyslím si, že je nezbytně nutné psát právě takhle, abych mohl dělat skvělé věci a tvořit úžasné programy.

Postup, o kterém píšu, je začít s co nejmenším základem, nejlépe v podobě „mikroframeworku“. Pár jich pro PHP existuje – Slim, Epiphany, Breeze, Limonade a další. Když pak potřebuju další funkce, stáhnu si lehkou knihovnu, která mi pomůže vyřešit přesně ten úkol, co potřebuju řešit. Přehlednost a stručnost jsou pro mne nejdůležitější kritéria.

Dalším důležitým kritériem je fakt, že pokaždé, když použiju kód, který jsem nenapsal, beru na sebe závazek. Většinou nemám čas provádět audit celého kódu knihovny, takže její použití je spojené s určitou důvěrou. A každá další závislost znamená věřit víc. Nejen v to, že v knihovně nejsou chyby, ale taky v to, že pokud nějaké jsou, že budou opravené. Dozvím se o tom z mailing listu? Jak dlouho budou bugfixy zpětně kompatibilní? Budu muset upgradovat všechny své knihovny, když povýším verzi PHP? A tohle všechno za předpokladu, že autor bude mít stále čas a motivaci tyto problémy řešit. Pokud nebude, tak jsem právě do svého kódu zanesl technologický dluh.

Najít malou lehkou knihovnu, která nepotřebuje spoustu dalšího kódu, je těžší, než by se zdálo. Myslím si, že se vývojáři v PHP zajímají mnohem víc o vývoj frameworků a věcí pro ně. Je pravda, že některé zavedené frameworky udělaly velký krok k tomu, aby nebyly tak monolitické, a mnoho vývojářů na Twitteru mi doporučovalo jako řešení třeba komponenty ze Symfony. Bohužel to vypadá, že moje definice „lehkého“ není shodná s jejich.

Podívejte se na výstup cloc pro komponentu HTTP Kernel ze Symfony 2:

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

Teď totéž pro celý framework 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
-------------------------------------------------------------------------------

a nakonec pro framework 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
-------------------------------------------------------------------------------

Když je víc souborů a řádků kódu v jedné komponentě než v celém frameworku, co používám, tak ji opravdu nemohu nazvat „lehkou“.

Neznamená to, že ten kód je špatný, že je bezcenný nebo že snad tenhle přístup je obecně zlý. Je špatný pro mne. A myslím si, že nejsem sám.

Nechci být programátorská rocková superstar, co tvoří pompézní rockovou operu. Chci zmáčknout pár prostých akordů v punkové skupině, co zahraje v rockovém klubu bez šatny a bude to takový nářez, že vylezete ven a půjdete si založit vlastní kapelu. Takový chci být kodér.

Nechci být Neil Peart. Chci být Gregg Ginn.

Tak jsem napsal tohle. „MikroPHP manifest“, jestli chcete. Chci se jím řídit při vývoji v PHP. Možná se s ním ztotožníte.

Jsem vývojář v PHP

  • Nejsem vývojář v Zend Frameworku, Symphony nebo CakePHP
  • Myslím, že samotné PHP je komplikované dost

Rád dělám malé věci

  • Rád tvořím malé věci s prostými cíli
  • Rád dělám věci, co řeší problémy
  • Rád dělám malé věci, co spolupracují na řešení větších problémů

Chci psát co nejmíň

  • Chci psát co nejmíň kódu
  • Chci udržovat co nejmíň kódu
  • Chci dělat podporu co nejmenšímu kódu
  • Potřebuju si být jistý každým kusem kódu, co do svého projektu dám

Mám rád jednoduchý, čitelný kód

  • Chci psát kód, kterému snadno porozumíte
  • Chci psát kód, který je snadno testovatelný

PS: Začal jsem sbírat odkazy na malé PHP knihovny a frameworky. Jestli nějaké znáte, dejte mi vědět.

Redakční poznámka: Text je na první pohled radikální, jako většina manifestů a provolání. Když se začíná vývoj příliš vychylovat jedním směrem, přicházejí extrémní a záměrně zjednodušující provolání, která vzbuzují diskusi. A právě v diskusi je možné dobrat se podstaty problému. Na první přečtení si většina vývojářů pomyslí: Ten člověk se zbláznil, vždyť on volá proti všemu, co je v posledních letech bráno jako „vývojářský standard“ – používání knihoven, standardizovaných frameworků apod. Vždyť to je návrat do dob, kdy si každý vývojář znovuvynalézal kolo a bastlil kód, jak se mu to hodilo… Velké projekty přeci nelze takhle stavět, udržovat…

Jenže tak to není. Skutečné jádro Edova sdělení je někde jinde. Dalo by se shrnout do klasického rčení: „Použijte odpovídající nástroj“. Když chcete, jako Ed, psát „malé a chytré aplikace“, tak se přece nemusíte stydět za to, že nepoužijete velký framework, co je právě „v kursu“. A pokud při vývoji uděláte nějakou šikovnou mikroknihovnu pro řešení jednoho konkrétního problému, nestyďte se ji zveřejnit. Není přece ostuda, že jste nepoužili velký framework, když ho nepotřebujete!

K tématu: diskuse na Hacker News, diskuse na Reddit, polemika Anthonyho Ferrary.

Začal programovat v roce 1984 s programovatelnou kalkulačkou. Pokračoval k BASICu, assembleru Z80, Forthu, Pascalu, Céčku, dalším assemblerům, před časem v PHP a teď je rád, že neprogramuje…

Komentáře: 138

Přehled komentářů

belzebub jednoduche reseni: prestante pouzivat PHP
Diskobolos Re: jednoduche reseni: prestante pouzivat PHP
Smokie Re: jednoduche reseni: prestante pouzivat PHP
DiskoKoulos Re: jednoduche reseni: prestante pouzivat PHP
makaron Re: jednoduche reseni: prestante pouzivat PHP
DiskoKoulos Re: jednoduche reseni: prestante pouzivat PHP
Vojtěch Semecký Re: jednoduche reseni: prestante pouzivat PHP
miri Re: jednoduche reseni: prestante pouzivat PHP
Diskobolos Re: jednoduche reseni: prestante pouzivat PHP
Pepa Re: jednoduche reseni: prestante pouzivat PHP
Diskobolos Re: jednoduche reseni: prestante pouzivat PHP
Pepa Re: jednoduche reseni: prestante pouzivat PHP
Diskobolos Re: jednoduche reseni: prestante pouzivat PHP
Pepa Re: jednoduche reseni: prestante pouzivat PHP
miri Re: jednoduche reseni: prestante pouzivat PHP
kverulant Re: jednoduche reseni: prestante pouzivat PHP
Leoš Re: jednoduche reseni: prestante pouzivat PHP
Jaroslav Martinec Re: jednoduche reseni: prestante pouzivat PHP
Jaro Re: jednoduche reseni: prestante pouzivat PHP
mikiqex Re: jednoduche reseni: prestante pouzivat PHP
Vojtěch Semecký Re: jednoduche reseni: prestante pouzivat PHP
Ivan Re: jednoduche reseni: prestante pouzivat PHP
Jencek Re: jednoduche reseni: prestante pouzivat PHP
Pepa Re: jednoduche reseni: prestante pouzivat PHP
Oldisy3 Re: jednoduche reseni: prestante pouzivat PHP
Oldisy3 Re: jednoduche reseni: prestante pouzivat PHP
Milan Stoklasa Re: jednoduche reseni: prestante pouzivat PHP
Oldisy3 Re: jednoduche reseni: prestante pouzivat PHP
... Re: jednoduche reseni: prestante pouzivat PHP
Clary Re: jednoduche reseni: prestante pouzivat PHP
--- Re: jednoduche reseni: prestante pouzivat PHP
Pingy 10. hodina
Mard Re: 10. hodina
David Grudl TOHLE. KURVA. ANI. OMYLEM.
koja Re: TOHLE. KURVA. ANI. OMYLEM.
Paladin Re: TOHLE. KURVA. ANI. OMYLEM.
Pavel Šimerda Re: TOHLE. KURVA. ANI. OMYLEM.
miri Re: TOHLE. KURVA. ANI. OMYLEM.
. Re: Manifest miniaturního PHP
Alt+F4 Výkřik do tmy
Diskobolos Re: Výkřik do tmy
Milan Stoklasa Re: Výkřik do tmy
Diskobolos Re: Výkřik do tmy
Milan Stoklasa Re: Výkřik do tmy
Smokie Re: Výkřik do tmy
Nox Re: Výkřik do tmy
Pepa Re: Výkřik do tmy
Nox Re: Výkřik do tmy
Pepa Re: Výkřik do tmy
Smokie Re: Výkřik do tmy
Nox Re: Výkřik do tmy
Smokie Re: Výkřik do tmy
David Grudl Re: Výkřik do tmy
Jiří Landsman Re: Výkřik do tmy
Ani Re: Výkřik do tmy
Smokie Re: Výkřik do tmy
Smokie Re: Výkřik do tmy
bazo Re: Výkřik do tmy
Karel Re: Výkřik do tmy
Diskobolos Re: Výkřik do tmy
Inkvizitor Re: Výkřik do tmy
Diskobolos Re: Výkřik do tmy
Inkvizitor Re: Výkřik do tmy
https://www.google.com/accounts/o8/id?id=AItOawlnAywB4AvKqH0YGU_e_e5u8ccUwCod4kA Re: Výkřik do tmy
KapitánRUM Názor toho pána
stewe Re: Názor toho pána
Pepa Re: Názor toho pána
KapitánRUM Re: Názor toho pána
Baldur Cecko se také vyvyjí
Čelo Re: Cecko se také vyvyjí
. Paladin Re: Cecko se také vyvyjí
MW Re: Cecko se také vyvyjí
. Paladin Re: Cecko se také vyvyjí
František Kučera PHP vs. Java
srigi Re: PHP vs. Java
. Paladin Re: PHP vs. Java
shade Re: Cecko se také vyvyjí
Gekon Článek o ničem
Diskobolos Re: Článek o ničem
Gekon Re: Článek o ničem
Pepa Re: Článek o ničem
maryo Re: Manifest miniaturního PHP
Diskobolos Re: Manifest miniaturního PHP
wdolek Re: Manifest miniaturního PHP
Diskobolos Re: Manifest miniaturního PHP
maryo Re: Manifest miniaturního PHP
Martin Hasoň Manifest x správná volba
Milan Stoklasa Co jsem si nenapsal sám, tomu nevěřím
Martin Malý Re: Co jsem si nenapsal sám, tomu nevěřím
František Kučera Re: Co jsem si nenapsal sám, tomu nevěřím
Martin Malý Re: Co jsem si nenapsal sám, tomu nevěřím
František Kučera Re: Co jsem si nenapsal sám, tomu nevěřím
Yenn Re: Co jsem si nenapsal sám, tomu nevěřím
Milan Stoklasa Re: Co jsem si nenapsal sám, tomu nevěřím
Martin Malý Re: Co jsem si nenapsal sám, tomu nevěřím
Diskobolos Re: Co jsem si nenapsal sám, tomu nevěřím
alancox Re: Co jsem si nenapsal sám, tomu nevěřím
David Grudl Re: Co jsem si nenapsal sám, tomu nevěřím
alancox Bulvarizace PHP
Diskobolos Re: Bulvarizace PHP
Martin Malý Re: Bulvarizace PHP
Inkvizitor Re: Bulvarizace PHP
Martin Malý Re: Bulvarizace PHP
František Kučera Re: Bulvarizace PHP
Čelo Re: Bulvarizace PHP
lenochware miniframework
maras Re: miniframework
cleb Originál
OnGe Re: Originál
cleb Re: Originál
Milan Stoklasa Re: Originál
Martin Malý Re: Originál
Oldisy3 Co dodat
Diskobolos Re: Co dodat
Balvan Re: Co dodat
Astapov Re: Co dodat
RDA Zadny framework = nejlepsi framework
vidya Re: Zadny framework = nejlepsi framework
Nox Re: Zadny framework = nejlepsi framework
Pepa a co takhle se trochu rozhlídnout kolem sebe?
Inkvizitor Re: a co takhle se trochu rozhlídnout kolem sebe?
backup ja porad nerozumim tomu odeleni dat a zobrazeni
Nox Re: ja porad nerozumim tomu odeleni dat a zobrazeni
mauron85 Re: ja porad nerozumim tomu odeleni dat a zobrazeni
Nox Re: ja porad nerozumim tomu odeleni dat a zobrazeni
Kit PHP je framework
Tomáš Fejfar Není to jazykem
Milan Stoklasa Re: Není to jazykem
DiskoKoulos Re: Není to jazykem
Milan Stoklasa Re: Není to jazykem
DiskoKoulos Re: Není to jazykem
Palo Re: Není to jazykem
Palo Re: Není to jazykem
100% Lenin Hmm, vo čem, že to je?
n0 Chlapec má pravdu
Martin Hasoň Seriózní pohledy
---- Radikalni to vubec neni, neni to cesta ven, ale v PHP to nejlepsi
ville I Nette Framework se dá použít jako micro framework,
Zdroj: http://www.zdrojak.cz/?p=3591