WebExpo 2011

Školení, která pořádám

Letošní WebExpo se podle mě mimořádně vyvedlo. Spokojený jsem byl i loni, protože jsem drobné organizační problémy považoval za detaily, ale letos se jich konference zbavila a musím říct, že byla opravdu profesionálně připravená a zcela srovnatelná se zahraničními konferencemi. Na rozdíl od loňska nebudu popisovat všechny přednášky, na kterých jsem byl, ale jenom ty, které mě něčím zaujaly.

Doporučuji také komunitní poznámky z DevHall a DevRoom.

Jak napsat a otestovat tisíce řádků kvalitního objektového kódu

Konference pro mě začala už ve čtvrtek, protože jsem přišel na workshop o objektovém pojetí programování kluků z Medio (i když oficiální název byl trochu jiný). Bylo velmi zajímavé se pobavit o tom, jestli může být Square potomkem Rectangle (nebo snad naopak), jestli má být Cache interface nebo abstraktní třída nebo jak řešit ošetření chyb u nesouvisejících operací. Zajímavá byla debata o zodpovědnosti konstruktoru – na přednášce zaznělo dogma „Nedělat v konstruktoru žádnou práci“, což je třeba u třídy reprezentující připojení do databáze podle mě nesmysl. Na obědě jsme se bavili také o tom, jestli třída může znát své výchozí hodnoty – ať už formou statické vlastnosti nebo předáním hodnoty null místo objektu (to podle mě šikovně využívá NotORM). Obecně mi přišlo, že se kluci zbytečně bojí dědičnosti (která vyjadřuje vztah „je“) a místo ní se omezují jen na skládání objektů (které vyjadřuje vztah „má“) a implementaci rozhraní („umí“). Zajímavá byla i diskuze o Dependency Injection, při které jsem dospěl k tomu, že se mi nelíbí volání $userSevice->login($user) ve srovnání s $user->login(). Další věc je ta, že když přidám parametr do konstruktoru, tak to musím deklarovat ještě v konfiguraci DI (pokud nepoužívám magii).

Nakonec došlo i na testování se zaměřením na PHPUnit. Ten sice nepoužívám, ale docela mě zaujala možnost mockování (které osobně dělám až na co nejnižší možné úrovni, protože tím se mi zadarmo otestují nižší vrstvy na operacích, které aplikace skutečně používá). Ale i obrat whitebox testování může být někdy užitečný. Např. při blackbox testu operace uložení musíme data následně načíst, abychom ověřili, že se to podařilo. Při whitebox stačí ověřit, jestli se zavolala metoda pro uložení se správnými parametry.

Novinky z konference BUILD

Na přednášce Davida Grudla bylo znát, že výjimečně nepřednáší o něčem, co sám vytvořil. Jeho obvykle velmi vysoké úrovně přednášení se mu proto podle mě tentokrát nepovedlo dosáhnout.

Deployment PHP aplikací

Přednáška Jana Mittnera se mi líbila velmi. Bylo vidět, že nasazování PHP aplikací mají opravdu dobře zvládnuté. Bylo mi trochu líto, že v některých oblastech nešel trochu víc do hloubky, např. principu fungování DBDeploy mohlo být podle mě věnováno alespoň pár minut.

Test Driven Development v CoffeeScriptu

Přednášku Jirky Knesla jsem si bohužel moc neužil. Začala totiž popisem CoffeeScriptu, který znám, a tak jsem se pustil do připravování vlastní přednášky. Pak ale najednou koukám, že na obrazovce se volají jakési funkce test a asyncTest, které přesně nevím, kde se vzaly. Část o tom, jak zprovoznit testovací prostředí, mi tedy asi bohužel unikla.

Cassandra

Přednáška o NoSQL databázi Cassandra pro mě byla zajímavá především proto, že ji vytvořili ve Facebooku (i když ji už teď nepoužívají). Přednáška byla dobrá, ale přesto mi bylo líto, že jsem kvůli tomu přišel o přednášku o AngularJS, která prý byla výborná.

On-line mapy u nás a ve světě

Na přednášku o Mapy.cz jsem se těšil, protože tuto aplikaci považuji za velmi zdařilou a mapové aplikace mě zajímají obecně. Přednášejícímu se ale podle mě bohužel nepodařilo kvalitu aplikace a práci, která s tím byla spojená, ukázat příliš přesvědčivě. Rozhodně bych víc ocenil přednášku od současného vývojáře, než od produktového manažera.

Za hranicemi jQuery

Danovi Steigerwaldovi se na přednášce podařilo ukázat, že se v JavaScriptovém vývoji opravdu dobře orientuje a část svých znalostí dokázal předat i publiku. Na přednášce se podle mě zbytečně zdržoval některými obecnými tématy (např. Dependency Injection), takže nezbyl čas na detailnější popis toho, jaké přednosti frameworky za hranicemi jQuery vlastně mají. Jeho rozdělení na frameworky první až třetí generace se nicméně okamžitě ujalo a odkazovali na něj i další přednášející. Zajímavá byla i zmínka o novém jazyku Dart, který má ambice JavaScript nahradit. Danovo školení vývoje aplikací v JavaScriptu bych si rozhodně nenechal ujít.

Serversideness

Douglas Crockford, jedna z největších osobností na konferenci, začal popisem programování v JavaScriptu na straně serveru. Pak bohužel neukázal, jaké problémy jsou s tím spojené, a rovnou přešel k řešení těchto problémů. Kvůli tomu na mě přednáška působila poněkud roztříštěným dojmem bez sjednocující nitě. Jako opakování principu closures, který má v JavaScriptu široké uplatnění, to ovšem bylo dobré. Člověk skoro nabyl dojmu, že nejpřirozenější funkce je taková, která přijímá callback a vrací zase callback. Vrtalo mi hlavou, jak se dá napsat funkce, která paralelně spustí více funkcí a zavolá callback, až skončí. Základní myšlenka je tahle (jak mi poradil Dan):

/** Paralelní spuštění více funkcí s dokončovací operací
* @param function[] pole funkcí, které se mají spustit
* @param function funkce spuštěná po jejich dokončení
* @return undefined
*/
function parallel(callbacks, done) {
	var count = callbacks.length;
	for (var i=0; i < callbacks.length; i++) {
		setTimeout((function (callback) {
			return function () {
				callback();
				count--;
				if (!count) {
					done();
				}
			}
		})(callbacks[i]), 10 * Math.random());
	}
}

PHP in 2011

Přednáška Rasmuse Lerdorfa, původního tvůrce PHP, byla vynikající. V prezentaci se mi líbily živé ukázky, které bez opuštění stránky komunikovaly se serverem. Dobrý byl i popis vlastností PHP 5.3 a 5.4, který šel nad rámec běžně uváděných informací. Např. mi došlo, že místo break 2 by bylo lepší použít goto nebo jsem se dozvěděl o zlepšení chybových hlášek v PHP 5.4 (to je k nezaplacení při školeních). V pasáži o HipHopu jsem se dozvěděl také o zajímavém chování PHP: funkce může dostat dva stejnojmenné parametry (HipHop na to upozorní, PHP ne):

<?php
function two_as($a, $a) {
    echo "$a\n";
}
two_as(1, 3);
?>

Při následné diskuzi jsme se bavili o tom, proč se některé věci do PHP 5.4 nejspíš nedostanou (např. new foo()->bar() má nekvalitní patch, který někdy způsobuje i pád PHP) a jaký bude další vývoj PHP (Rasmusovi osobně teď žádná zásadní vlastnost nechybí).

Scala - jazyk budoucnosti

Přednáška o Scale byla asi nejprofesionálnější na celé konferenci – práce s publikem, krásné slajdy, motivující přednes. Od jiných přednášejících jsem se přitom dozvěděl, že na generální zkoušce patřila přednáška naopak k tomu nejhoršímu – klobouk dolů za takový pokrok. Nejvíce mě zaujal současný trend jazyků, které se kompilují do něčeho jiného – CoffeScript do JavaScriptu, Scala do bytekódu Javy. Spatřuji na tom jisté výhody (možnost používat stávající knihovny a nástroje), ale i nevýhody (pomalejší běh, horší možnosti ladění). Jsem zvědav na přístup jazyka Dart, který by měl v kompatibilních prohlížečích běžet nativně a v nekompatibilních pomocí JavaScriptu.

ElasticSearch: Za hranice běžného fulltextového vyhledávání

Karmi dostál pověsti vynikajícího přednášejícího a ElasticSearch dokázal publiku „prodat“. Škoda, že se přednáška soustředila hlavně na možnosti rozkládání zátěže a schopnosti zotavit se z výpadku serveru a ne na samotné vlastnosti vyhledávání.

Druhý přednášející působil zmateně a i když k vyhledávání vytvořil zajímavé rozhraní, tak bych si přednášku víc užil, když by prezentaci nechal na Karmim.

Testování prakticky

Honza Král nabídl přehledný úvod do testování webových aplikací, i když z kódu jsem dvakrát nadšený nebyl. Komentář „tady vypočítáme nějaká data“ v definici pohledu (logika by přitom měla být v modelu) nebo vytváření objektů přímo v kódu testování příliš nepomáhá. Ani poznámka o tom, že některé metody není třeba testovat, mě příliš nenadchla – takové metody je někdy lepší z kódu úplně eliminovat. Ale jako testování 101 to myslím pro řadu lidí mohlo být užitečné.

Ajaxizace

Já jsem na WebExpo přihlásit přednášku o tom, jak urychlit webovou aplikaci tím, že se většina operací (návštěva odkazů a odeslání formulářů) bude dělat AJAXem. S tím mám velké zkušenosti z Admineru a chtěl jsem se o ně podělit. Původně jsem o tom chtěl napsat článek, ale téma se mi nedařilo příliš uchopit, tak jsem zvolil formu přednášky. A musím říct, že nelituji. Přednáška byla ryze technická a soustředila se především na popis problémů, se kterými by aplikace měla počítat. Nebylo to takové to konferenční show, ale mým cílem bylo především předat informace, což se mi doufám povedlo. Materiály jsou ke stažení.

CZ Podcast #54

V pátek jsem se dozvěděl, že bych měl být spolu s Honzou Králem hostem rozhovoru o práci v zahraničí. Já jsem v zahraničí ještě nepracoval a Honza momentálně pracuje pro českou pobočku, ale nakonec jsme se o čem bavit přece jen měli. V sále bylo jen pár posluchačů, protože většina dala přednost nadšenému projevu Johna Vanhary, kam jsem chtěl původně jít i já. Nakonec jsem stihl alespoň závěr přednášky (dotazy z publika) a i to stálo za to.

Závěr

Většina přednášek mě něčím zaujala a rozhodně nelituji, že jsem na WebExpu byl. Organizace i prostory konference se zlepšily, takže i na to už si málokdo může stěžovat. Nejsem si jist, že se WebExpu někdy podaří vyrůst mimo české prostředí, ale podle mě to není na škodu. Pokud se organizátorům bude dařit shánět vynikající české i zahraniční přednášející tak jako letos a české publikum to dokáže uživit, tak podle mě ani nevadí, že platící cizinci na konferenci prakticky nejsou.

Jakub Vrána, Osobní, 26.9.2011, diskuse: 13 (nové: 0)

Diskuse

Karel Minařík:

Jakube, že tys zase nedával úplně pozor? :) Půlka části o ElasticSearch přeci byla o „vlastnostech vyhledávání“ -- viz slide #63 http://www.slideshare.net/karmi/elastic-search-…-2011-prague a dále...

ikona Jakub Vrána OpenID:

Ale jo, dával. Jako půlka se mi to ale nezdálo a přišlo mi vyloženě škoda, že tolik času trávíte rozkládáním na více serverů. V posluchárně podle mě byla většina posluchačů, kteří hledají pomocí LIKE nebo nehledají vůbec (alespoň se mi zdálo ze zvednutých rukou) a potřebují nějak pořádně začít hledat na jednom serveru. Těch, kterým jeden server s pořádným fulltextem (např. Sphinx) nestačí, a potřebují to rozložit, by se mezi posluchači podle mě moc nenašlo.

venda:

nejsem žádnej lingua nazi, ale 9x "podle mě" je fakt docela síla.

Olda Šálek:

Rozhodně nejpovedenější ze všech ročníků webexpo. Já jsem spokojen, sice jsem byl většinou v mobile hall a v biz hall, ale do devel hall jsem taky zavítal.
Stihnout všechno se nedalo, zbytek si projdu až budou k dispozici záznamy.
Něco jsem taky sepsal na blog: http://mozektevidi.net/clanek/webexpo-2011-…-navstevnika

Na ajax jsem chtěl zajít, ale nakonec jsem dal přednost jiné přednášce a tak díky za materiály… už aby byl záznam :)

NoxArt:

Zní to výborně ... teď si člověk říká "že jsem tam nešel" :) Zapomněl jsem kde jsem zahlédl, že by záznamy mohly být zpřístupněny za nějakou částku i pro neúčastníky, snad je na tom něco pravdy...

Adam:

"Nakonec došlo i na testování se zaměřením na PHPUnit. Ten sice nepoužívám .."

Mohu se zeptat jak testujete aplikace? Ve vaší knize jsem viděl několik přístupů a zajímalo by mně, který preferujete.

ikona Jakub Vrána OpenID:

Často používám PHPT (http://qa.php.net/write-test.php), případně s nějakou modifikací. Adminer testuji pomocí Selenia. Vyhovují mi i testy Nette.

ikona v6ak:

„Nedělat v konstruktoru žádnou práci “ , což je třeba u třídy reprezentující připojení do databáze podle mě nesmysl."
Vždy je možné udělat nějakou factory method:
<?php
class DatabaseConnection{
  private function __construct(...){...}

  public static function connect(...){...}

}
?>

Jiná věc je otázka pragmatismu, ale myslím si, že:
* U ::connect je čitelnější side effect.
* Až tak často na potřebu konstruktoru se side effects nenarážím.

"Nejvíce mě zaujal současný trend jazyků, které se kompilují do něčeho jiného – CoffeScript do JavaScriptu, Scala do bytekódu Javy. Spatřuji na tom jisté výhody (možnost používat stávající knihovny a nástroje) , ale i nevýhody (pomalejší běh, horší možnosti ladění)."
K tomu bych měl pár poznámek a dotazů:
* A Cčko se taky kompiluje do něčeho jiného - obvykle do nativního kódu. Scala zde má v mnohém blíže k C než k CoffeeScriptu.
* Scala může vypadat jako jazyk 'zneužívající' JVM, ale JVM vpodstatě není určena jen pro Javu (přidání instrukce invokedynamic v Javě 7 to potvrzuje, jazyk Java ji asi moc nevyužije). Vztah jazyk Java : platforma Java (JVM, standardní knihovna apod.) je podobný vztahu C# : .NET.
* Pomalejší běh není nutný, to dost záleží na jazyku a případně jeho implementaci. Mimochodem, Scalu Twitter použil prý kvůli výkonu.
* Horší ladění: U překladu do JS to chápu (debugger mi zobrazí tak akorát vygenerované JS a nemohu jej snnadno porovnávat s původním kódem), u Scaly je situace (v případě použití JVM) jiná: při zapnutí ladicích informací se do class souboru ukládají informace jako LineNumberTable, které umožňují z pozice instrukce vyčíst řádek kódu. Myslím, že obvyklá implementace Javového debuggeru bude stavět na těchto informacích (aspoň já bych to tak napsal) a půjde ji přímo použít i na kód Scaly. Možná bude potřeba dodělat třeba zvýrazňování apod., což ale v IDE bude. (Nezkoušel jsem, na debuggery jsem si celkově moc nezvykl...)
* Určité ztížení ladění nastane u metod s názvy se speciálními znaky, např. + se přeloží na $plus. Já si na to ale zvykl velmi rychle. A ve srovnání s kompletní vlastní VM nám to dává u ladění spíše výhody.

ikona Jakub Vrána OpenID:

„Nedělat v konstruktoru žádnou práci“
Klíčová otázka je, jestli má __construct() volat connect(). Pokud ne, tak co mají dělat ostatní metody, které připojení vyžadují?

ikona v6ak:

Pozor, connect je statická metoda (podle té odpovědi jsi ji asi přehlédl), která lowlevelově vytvoří například socket a předá ho konstruktoru. Konstruktor ji určitě volat nebude.

ikona Jakub Vrána OpenID:

Ajo, to jsem fakt přehlédl. V tom případě se mi to celkem líbí i proto, že je to dobře rozšiřitelné, pokud bychom v budoucnu chtěli přidat druhý „konstruktor“ – např. statickou metodu lazyConnect().

Tomáš Fejfar:

> na přednášce zaznělo dogma „Nedělat v konstruktoru žádnou práci“, což je třeba u třídy reprezentující připojení do databáze podle mě nesmysl
Naopak u třídy databáze to smysl dává. Co když člověk jen nastaví do member proměnné username/password/db a připojí se JIT - ušetří to zdroje, pokud DB nebude vůbec potřeba nebo pokud se skript např. někde cestou před prvním requestem zacyklí... (a zůstalo by do timeoutu otevřené spojení)

ikona Jakub Vrána OpenID:

O tom jsme se na workshopu také bavili a podle mě by to rozhodně neměla být zodpovědnost této třídy. Ono totiž když se mi nepodaří připojit do databáze, tak je žádoucím výsledkem obvykle chybová stránka (HTTP kód 503). A když se bude do databáze připojovat lazy, tak se může připojit až v okamžiku, kdy jsem uživateli poslal začátek normální stránky – na poslání chybového kódu už bude pozdě.

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.