SlideShare a Scribd company logo
1 of 42
Download to read offline
zápisky	
  z	
  fronty
                         Lukáš	
  @almadcz	
  Linhart

Ahoj, já jsem Almad
Historie	
  webu




                    (stručná	
  a	
  nepřesná)
Proč mě poslouchat a zabývat se node.js je dobrá otázka, takže nejprve historické okénko
Web	
  ’95



Vznik webu: stránky jsou statické, jen nahrajeme HTML přes FTP. Easy-peasy, super.

Kdo umí vyslovit HTML bez zakoktání, bere velké peníze.
Web	
  27.8.2001
Dynamické “části”, menu, uživatelská jména a informace o posledním přihlášení, datum --
tedy šablony. Prorazil šablonovací jazyk PHP nad SSI a CGI, v jednoduchosti a graduální učící
křivce je síla.

Statická část se bouří, argumentuje rychlostí a mladostí “nových” a chce psát moduly v C,
případně řešit vše pomocí vkládání přes SSI (server-side includes).

Kdo umí vyslovit “CMS” nebo “SEO” bez zakoktání a nainstalovat Wordpress, bere velké
peníze.
Web	
  ’05
CMS (content management systém, “redakční systémy”) a jejich následovníci. (Jedna) centrální
databáze, MVC framework, Rails, Django.

PHPkisti se bouří, argumentují pomalostí a neozkoušeností a Davídek Nettuje.
Web	
  ’12	
  	
  	
  	
  




Více datových zdrojů, relační, grafové, dokumentové databáze, 3rd party APIs (více v dalších
slidech)

JavaScriptaři vymýšlí node.js. Djangisti argumentují neefektivitou, postačující rychlostí a
novostí bez knihoven.

Kdo umí vyslovit “UX” bez zakoktání a nakreslit čtvereček, bere velké peníze.
Server	
  push	
  je	
  standard
Chtěl	
  jsi	
  se	
  odhlásit?
Více	
  datových	
  zdrojů




Analytická data v hadoopu, cache v memcached, grafová data v neo4j jste-li bohatí, mnohé
druhy dat v redisu, dokumentová data v mongu/couchi.
Y	
  U	
  NO	
  ORM	
  object?
nerelacni databaze se mnohdy nemapuji dobre na objekty
Data	
  z	
  jiných	
  služeb
Časté používání API jiných služeb.
haters	
  gonna	
  hate
node.js je jen jedna z variant. Kazdopadne, Djangisti a Rubysti argumentuji novosti, absenci
zakladni knihovny, pomalosti, neozkousenosti...
Smyčka
Event loop. Jeden ze způsobů řešení parelelních přístupů, “obchází” cenu za kontext switch.

Něco jako cooperative multitasking ve Windows 3.11.
V8




Jedna z nejlepších language-specific VM, brutálně rychlá. Mozkový výkon by se dal utratit líp,
ale co se dá dělat.

Byť se tak místy snaží tvářit, pořád to samozřejmě není full-fledged platforma, které jsou
rozumné jenom dvě (JVM a .NET CLI).
JavaScript
Starý, ale lepší jazyk, než si myslíte. Má své chyby, ale jsou všeobecně známé. Nový
assembler webu.
...všude...




Děsivá představa pro mnohé, ale kupodivu tím ten jazyk dostává lepší rozměr: šetří se
kongitivní kontext-switche z hranic mezi systémy.
 	
  	
  Kafe	
  pomáhá




CoffeeScript opravuje spoustu problematických míst JS, doporučuju.
Částečně ovšem ruší tu výhodu z předchozího slajdu, takže je dobré jím nahrazovat
konzistentně.
Neblokující	
  I/O
Neblokující != rychlejší. Je tu ovšem lepší odolnost proti problémům se sítí etc., kdy requesty
“umřou”, ale původní vlákno typicky stejně blokuje až do timeoutu.
Existující	
  komunita
JS umí spousta lidí, co měli tu smůlu, že pracovali na frontendu. Znamená to, že velmi rychle
vznikají knihovny na všechno a ”platforma” se posouvá dopředu překvapivě rychle.
Streamování
Výchozí přístup je, že se nebufferuje. Jak přichází data do systému (po chuncích po buffer
flushích), tak se zpracovávají. Člověk díky tomu designuje systémy na tohle zpracování tak
nějak defaultně, což je většínou v kontrastu s přístupem jinde. S pamětí to dělá dobré věci.
JavaScript meetup 29.11.
         Felix Geisendörfer (node.js core commiter)

         Writing high performance binary parser in
         node.js


                                  http://praguejs.cz/




...a hlasujte pro kvadrukoptéru, bude určitě levnější a zábavnější!!!11!!11!
Estetika
CoffeeScript: Když si člověk dá práci se zarovnáním šipek a rovnítek (editory pomáhají), kód
se velmi dobře čte. Vzhledem k tomu, že pokud to výkonnost dovoluje, je čitelnost snad
nejdůležitější atributu kódu...
tail	
  -­‐f	
  /var/log/messages	
  |	
  coffee	
  logserver.coffee




Čteme input a posíláme ho v realtime do browseru. Super flexibilní v unix
ekosystému...zdarma prakticky na čtyři řádky.
Plný funkční kód s HTML bordelem je na https://gist.github.com/3756594
Problémy
A nyní, konečně sada varování.
CPU




Na rozdíl od I/O, CPU je blokující. Cokoliv co se zasekne na procesoru (jako třeba regexp
catastrophic backtracking) “zabije” celý server.
Funkce



              getData	
  =	
  -­‐>	
  “mock	
  data”



Mějmě jednoduchou funkci, která vrací nějaká data -- ještě budeme řešit jaká, takže si
vrátíme něco co zatím stačí.
Změna	
  zdroje	
  dat

      getData	
  =	
  (cb)	
  -­‐>
      	
  	
  	
  	
  Model.findOne()	
  (m)	
  -­‐>
      	
  	
  	
  	
  	
  	
  	
  	
  cb	
  m.data


...pak se k tomu vrátíme a data od někud skutečně vezmeme, třeba z databáze a vrátíme je
onomu callbacku...
...který tam původně nebyl -> změna signatury funkce a flow všeho co ji používá.
Rule of thumb: pokud by se vaše funkce mohla dotknout libovolného I/O, rovnou si
předávejte callback.
Chybějící	
  callback
E.T. volat domu: stává se, že chyba v aplikaci se projeví tak, že člověk zapomene zavolat
finální callback/render do browseru, tj. žádný traceback, nic. Debugging toho je občas mírně
frustrující.
Přestínění
CoffeeScript: scoping je dementní.
newFunction	
  =	
  -­‐>	
  log	
  =	
  'abc'


                	
  	
  newFunction	
  =	
  function()	
  {
                	
  	
  	
  	
  var	
  log;
                	
  	
  	
  	
  return	
  log	
  =	
  'abc';
                	
  	
  };



Pakliže funkce ve vyšším scope neexistuje, správně se vytvoří s var, tj. jenom pro podřízený
scope --- výborně, opravuje to jednu z poměrně frustrujících věcí v JS (člověk omylem plevelí
globální scope).
log	
  =	
  require	
  './log'
                   newFunction	
  =	
  -­‐>	
  log	
  =	
  'abc'


                  	
  	
  log	
  =	
  require('./log');

                  	
  	
  newFunction	
  =	
  function()	
  {
                  	
  	
  	
  	
  return	
  log	
  =	
  'abc';
                  	
  	
  };


...nicméně pokud už tam stejná proměnna existuje (samozřejmě nezávisle na tom, jakého
typu), je místo toho přepsána. To znamená, že funkce nejsou zcela zapouzdřené -- jsou
ovlivňovány kontextem ze svého nadřazeného scope. IMO nedobrá volba.
API	
  je	
  pro	
  konzervy
Trochu souvisí s předchozími poznámkami. Komunita je mladá a kreativní a dynamická a
změn zpětné kompatibility se nebojí, s čímž je potřeba počítat. Node samotné už nicméně
dosti stabilní je na změny API dává pozor, ekosystém k tomu ještě musí dojít.
Výjimky	
  zabíjí
Neodchycená výjimka zabije celý proces/server a většinou to za vás nikdo moc neřeší:
standardní pattern je výjimky nevyhazovat, ale vracet v callbacích jako první parametr. Stát se
to ovšem z vašeho kódu může a je potřeba na to dávat pozor.

(Třeba node-raven se to snaží řešit přes raven.patchGlobal, ale funguje to tak nějak všelijak.)
Škálování
    The guys that are getting paid the big bucks to
    deliver scalable solutions aren’t up at night
    feverishly rewriting their systems in Node.
    They’re doing what they’ve always done:
    measuring, testing, benchmarking, thinking
    hard, keeping up with the academic literature
    that pertains to their problems. That’s what
    scaling in the large necessitates.
                                        -- Alex Payne
Když řikám škálování tak myslim cestu ke Škálování, nikoli stránky velikostí čínského eshopu
jako seznam nebo centrum.
Concurrency	
  lock-­‐in




Když člověk roste ke škálování, mění se přístupové vzorce. Díky tomu se v čase mění i
vhodná řešení. V node.js je člověk zamčen, nemá možnost volby -- All Hail To Mighty
Evenloop. Tohle časem člověka může bolet...na druhou stranu, v momentě, kdy řeší takové
problémy, tak to znamená, že je na tom dobře.
Kam	
  s	
  ním?
I/O bound věci
Distribuce dat (a APIs)
Proxy
Realtime / server push
Tam, kde se dájí sdílet data mezi serverem a klientem (tj. javascript-heavy appky nebo při
sdílení klíčové komponenty, jako třeba DSL/parseru).
The Way of Node
        • Node	
  is	
  a	
  platform.
        • Node	
  is	
  JavaScript.
        • Node	
  is	
  callbacks	
  &	
  Streams.
        • Node	
  is	
  not	
  pretending	
  it	
  is	
  blocking	
  when	
  it	
  is	
  not.
        • Node	
  is	
  not	
  going	
  to	
  include	
  that	
  module.
        • Node	
  is	
  for	
  building.
        • Node	
  is	
  a	
  community.
        • Node	
  is	
  faster.
        • Node	
  is	
  fun.
                                                                      -­‐-­‐	
  Mikeal	
  Rogers



Převzato z http://www.mikealrogers.com/posts/the-way-of-node.html , thx & kudos!
Až budete psát příští aplikaci, zamyslete se, jestli na daný problém více nesedí vhodnější
technologie, jestli jen neohýbate ty co znáte, protože jste po kotníky zakopání v nějaké
komfortní zóně.
No a kdyby vám to ve vaší firmě nechteli dovolit...
...dovolíme vám to u nás. http://apiary.io/jobs
Thank You
                                                                                    (aka Credits)
                                          Everything under CC commercial on flickr through compfights -- thanks you too!

•   http://pinkie.ponychan.net/chan/files/src/133479594662.png                                   •   http://www.flickr.com/photos/yakobusan/2995035580/sizes/o/in/photostream/




•   http://www.flickr.com/photos/sukanto_debnath/519690623/sizes/o/in/photostream/               •   http://www.flickr.com/photos/striatic/2191404675/sizes/z/in/photostream/




•   http://www.flickr.com/photos/nicholasro/4784567537/sizes/z/in/photostream/                   •   http://www.flickr.com/photos/boltron/4461019149/




•   http://www.flickr.com/photos/7989285@N07/1794265047/sizes/z/in/photostream/                  •   http://www.flickr.com/photos/olibac/3462198490/sizes/o/in/photostream/




•   http://www.flickr.com/photos/28157757@N05/5715697350/sizes/l/in/photostream/                 •   http://www.flickr.com/photos/anieto2k/5401318057/sizes/l/in/photostream/




•   http://www.flickr.com/photos/oskay/265899784/sizes/l/in/photostream/                         •   http://www.flickr.com/photos/68387408@N00/2661844560/




•   http://www.flickr.com/photos/tambako/4831699383/sizes/l/in/photostream/                      •   http://www.flickr.com/photos/raindrift/7095243379/in/set-­‐72157629492908038/




•   http://www.flickr.com/photos/astragony/4852775794/sizes/l/in/photostream/                    •   http://www.flickr.com/photos/13589188@N00/3164471672/




•   http://www.flickr.com/photos/albertoalerigi/2886157131/sizes/l/in/photostream/               •   http://www.flickr.com/photos/67471595@N00/1353578358/




•   http://www.flickr.com/photos/tambako/2361526167/sizes/l/in/photostream/                      •   http://www.flickr.com/photos/26063220@N00/3480359060/




•   http://www.flickr.com/photos/jam343/4952338/sizes/o/in/photostream/




•   http://www.flickr.com/photos/stolensnapshot/3333052115/sizes/l/in/photostream/




•   http://www.flickr.com/photos/seeminglee/601883302/sizes/o/in/photostream/

More Related Content

Similar to node.js: zápisky z fronty (Battle guide to node.js)

Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)Péhápkaři
 
Výběr vhodných technologii pro startup v prostředí cloudu
Výběr vhodných technologii pro startup v prostředí clouduVýběr vhodných technologii pro startup v prostředí cloudu
Výběr vhodných technologii pro startup v prostředí clouduJan Kodera
 
Vývojářské Nástroje a Techniky
Vývojářské Nástroje a TechnikyVývojářské Nástroje a Techniky
Vývojářské Nástroje a TechnikyMartin Maly
 
Borek Bernard: TypeScript - příčetný jazyk pro web
Borek Bernard: TypeScript - příčetný jazyk pro webBorek Bernard: TypeScript - příčetný jazyk pro web
Borek Bernard: TypeScript - příčetný jazyk pro webDevelcz
 
Noční můry webového vývojáře
Noční můry webového vývojářeNoční můry webového vývojáře
Noční můry webového vývojářeMichal Špaček
 
Czjug Zari 2008
Czjug Zari 2008Czjug Zari 2008
Czjug Zari 2008RENESTEIN
 
RocDevs/PHPPrague - Proč by sakra někdo měl chtít dělat eshop?
RocDevs/PHPPrague - Proč by sakra někdo měl chtít dělat eshop?RocDevs/PHPPrague - Proč by sakra někdo měl chtít dělat eshop?
RocDevs/PHPPrague - Proč by sakra někdo měl chtít dělat eshop?Tomáš Strejček
 
Závislosti, injekce a vůbec
Závislosti, injekce a vůbecZávislosti, injekce a vůbec
Závislosti, injekce a vůbecDavid Grudl
 
20110511 Vývoj software - produktivně, efektivně, kvalitně
20110511 Vývoj software - produktivně, efektivně, kvalitně20110511 Vývoj software - produktivně, efektivně, kvalitně
20110511 Vývoj software - produktivně, efektivně, kvalitněJiří Mareš
 
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & Microsevices
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & MicrosevicesČtvrtkon #71 - Jan Kaštánek - Java & Docker & Microsevices
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & MicrosevicesCtvrtkoncz
 
Čtvrtkon #71 - Marian Benčat - Angular a NativeScript
Čtvrtkon #71 - Marian Benčat - Angular a NativeScriptČtvrtkon #71 - Marian Benčat - Angular a NativeScript
Čtvrtkon #71 - Marian Benčat - Angular a NativeScriptCtvrtkoncz
 
Představení Ruby on Rails
Představení Ruby on RailsPředstavení Ruby on Rails
Představení Ruby on Railsigloonet
 
Funkční testování – chybějící vrchol pyramidy (WebExpo 2016)
Funkční testování – chybějící vrchol pyramidy (WebExpo 2016)Funkční testování – chybějící vrchol pyramidy (WebExpo 2016)
Funkční testování – chybějící vrchol pyramidy (WebExpo 2016)Ondřej Machulda
 
Dark Side of iOS [mDevCamp 2013]
Dark Side of iOS [mDevCamp 2013]Dark Side of iOS [mDevCamp 2013]
Dark Side of iOS [mDevCamp 2013]Kuba Břečka
 
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...Péhápkaři
 
Smalltalk prakticky [CZ]
Smalltalk prakticky [CZ]Smalltalk prakticky [CZ]
Smalltalk prakticky [CZ]Tomáš Kukol
 

Similar to node.js: zápisky z fronty (Battle guide to node.js) (20)

Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
 
Výběr vhodných technologii pro startup v prostředí cloudu
Výběr vhodných technologii pro startup v prostředí clouduVýběr vhodných technologii pro startup v prostředí cloudu
Výběr vhodných technologii pro startup v prostředí cloudu
 
Vývojářské Nástroje a Techniky
Vývojářské Nástroje a TechnikyVývojářské Nástroje a Techniky
Vývojářské Nástroje a Techniky
 
Borek Bernard: TypeScript - příčetný jazyk pro web
Borek Bernard: TypeScript - příčetný jazyk pro webBorek Bernard: TypeScript - příčetný jazyk pro web
Borek Bernard: TypeScript - příčetný jazyk pro web
 
Noční můry webového vývojáře
Noční můry webového vývojářeNoční můry webového vývojáře
Noční můry webového vývojáře
 
Czjug Zari 2008
Czjug Zari 2008Czjug Zari 2008
Czjug Zari 2008
 
TNPW2-2011-06
TNPW2-2011-06TNPW2-2011-06
TNPW2-2011-06
 
RocDevs/PHPPrague - Proč by sakra někdo měl chtít dělat eshop?
RocDevs/PHPPrague - Proč by sakra někdo měl chtít dělat eshop?RocDevs/PHPPrague - Proč by sakra někdo měl chtít dělat eshop?
RocDevs/PHPPrague - Proč by sakra někdo měl chtít dělat eshop?
 
Linuxalt 2010
Linuxalt 2010Linuxalt 2010
Linuxalt 2010
 
Závislosti, injekce a vůbec
Závislosti, injekce a vůbecZávislosti, injekce a vůbec
Závislosti, injekce a vůbec
 
20110511 Vývoj software - produktivně, efektivně, kvalitně
20110511 Vývoj software - produktivně, efektivně, kvalitně20110511 Vývoj software - produktivně, efektivně, kvalitně
20110511 Vývoj software - produktivně, efektivně, kvalitně
 
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & Microsevices
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & MicrosevicesČtvrtkon #71 - Jan Kaštánek - Java & Docker & Microsevices
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & Microsevices
 
Čtvrtkon #71 - Marian Benčat - Angular a NativeScript
Čtvrtkon #71 - Marian Benčat - Angular a NativeScriptČtvrtkon #71 - Marian Benčat - Angular a NativeScript
Čtvrtkon #71 - Marian Benčat - Angular a NativeScript
 
Představení Ruby on Rails
Představení Ruby on RailsPředstavení Ruby on Rails
Představení Ruby on Rails
 
Funkční testování – chybějící vrchol pyramidy (WebExpo 2016)
Funkční testování – chybějící vrchol pyramidy (WebExpo 2016)Funkční testování – chybějící vrchol pyramidy (WebExpo 2016)
Funkční testování – chybějící vrchol pyramidy (WebExpo 2016)
 
Dark Side of iOS [mDevCamp 2013]
Dark Side of iOS [mDevCamp 2013]Dark Side of iOS [mDevCamp 2013]
Dark Side of iOS [mDevCamp 2013]
 
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
 
TNPW2-2013-05
TNPW2-2013-05TNPW2-2013-05
TNPW2-2013-05
 
Smalltalk prakticky [CZ]
Smalltalk prakticky [CZ]Smalltalk prakticky [CZ]
Smalltalk prakticky [CZ]
 
TNPW2-2012-05
TNPW2-2012-05TNPW2-2012-05
TNPW2-2012-05
 

node.js: zápisky z fronty (Battle guide to node.js)

  • 1. zápisky  z  fronty Lukáš  @almadcz  Linhart Ahoj, já jsem Almad
  • 2. Historie  webu (stručná  a  nepřesná) Proč mě poslouchat a zabývat se node.js je dobrá otázka, takže nejprve historické okénko
  • 3. Web  ’95 Vznik webu: stránky jsou statické, jen nahrajeme HTML přes FTP. Easy-peasy, super. Kdo umí vyslovit HTML bez zakoktání, bere velké peníze.
  • 4. Web  27.8.2001 Dynamické “části”, menu, uživatelská jména a informace o posledním přihlášení, datum -- tedy šablony. Prorazil šablonovací jazyk PHP nad SSI a CGI, v jednoduchosti a graduální učící křivce je síla. Statická část se bouří, argumentuje rychlostí a mladostí “nových” a chce psát moduly v C, případně řešit vše pomocí vkládání přes SSI (server-side includes). Kdo umí vyslovit “CMS” nebo “SEO” bez zakoktání a nainstalovat Wordpress, bere velké peníze.
  • 5. Web  ’05 CMS (content management systém, “redakční systémy”) a jejich následovníci. (Jedna) centrální databáze, MVC framework, Rails, Django. PHPkisti se bouří, argumentují pomalostí a neozkoušeností a Davídek Nettuje.
  • 6. Web  ’12         Více datových zdrojů, relační, grafové, dokumentové databáze, 3rd party APIs (více v dalších slidech) JavaScriptaři vymýšlí node.js. Djangisti argumentují neefektivitou, postačující rychlostí a novostí bez knihoven. Kdo umí vyslovit “UX” bez zakoktání a nakreslit čtvereček, bere velké peníze.
  • 7. Server  push  je  standard
  • 8. Chtěl  jsi  se  odhlásit?
  • 9. Více  datových  zdrojů Analytická data v hadoopu, cache v memcached, grafová data v neo4j jste-li bohatí, mnohé druhy dat v redisu, dokumentová data v mongu/couchi.
  • 10. Y  U  NO  ORM  object? nerelacni databaze se mnohdy nemapuji dobre na objekty
  • 11. Data  z  jiných  služeb Časté používání API jiných služeb.
  • 12. haters  gonna  hate node.js je jen jedna z variant. Kazdopadne, Djangisti a Rubysti argumentuji novosti, absenci zakladni knihovny, pomalosti, neozkousenosti...
  • 13.
  • 14. Smyčka Event loop. Jeden ze způsobů řešení parelelních přístupů, “obchází” cenu za kontext switch. Něco jako cooperative multitasking ve Windows 3.11.
  • 15. V8 Jedna z nejlepších language-specific VM, brutálně rychlá. Mozkový výkon by se dal utratit líp, ale co se dá dělat. Byť se tak místy snaží tvářit, pořád to samozřejmě není full-fledged platforma, které jsou rozumné jenom dvě (JVM a .NET CLI).
  • 16. JavaScript Starý, ale lepší jazyk, než si myslíte. Má své chyby, ale jsou všeobecně známé. Nový assembler webu.
  • 17. ...všude... Děsivá představa pro mnohé, ale kupodivu tím ten jazyk dostává lepší rozměr: šetří se kongitivní kontext-switche z hranic mezi systémy.
  • 18.      Kafe  pomáhá CoffeeScript opravuje spoustu problematických míst JS, doporučuju. Částečně ovšem ruší tu výhodu z předchozího slajdu, takže je dobré jím nahrazovat konzistentně.
  • 19. Neblokující  I/O Neblokující != rychlejší. Je tu ovšem lepší odolnost proti problémům se sítí etc., kdy requesty “umřou”, ale původní vlákno typicky stejně blokuje až do timeoutu.
  • 20. Existující  komunita JS umí spousta lidí, co měli tu smůlu, že pracovali na frontendu. Znamená to, že velmi rychle vznikají knihovny na všechno a ”platforma” se posouvá dopředu překvapivě rychle.
  • 21. Streamování Výchozí přístup je, že se nebufferuje. Jak přichází data do systému (po chuncích po buffer flushích), tak se zpracovávají. Člověk díky tomu designuje systémy na tohle zpracování tak nějak defaultně, což je většínou v kontrastu s přístupem jinde. S pamětí to dělá dobré věci.
  • 22. JavaScript meetup 29.11. Felix Geisendörfer (node.js core commiter) Writing high performance binary parser in node.js http://praguejs.cz/ ...a hlasujte pro kvadrukoptéru, bude určitě levnější a zábavnější!!!11!!11!
  • 23. Estetika CoffeeScript: Když si člověk dá práci se zarovnáním šipek a rovnítek (editory pomáhají), kód se velmi dobře čte. Vzhledem k tomu, že pokud to výkonnost dovoluje, je čitelnost snad nejdůležitější atributu kódu...
  • 24. tail  -­‐f  /var/log/messages  |  coffee  logserver.coffee Čteme input a posíláme ho v realtime do browseru. Super flexibilní v unix ekosystému...zdarma prakticky na čtyři řádky. Plný funkční kód s HTML bordelem je na https://gist.github.com/3756594
  • 25. Problémy A nyní, konečně sada varování.
  • 26. CPU Na rozdíl od I/O, CPU je blokující. Cokoliv co se zasekne na procesoru (jako třeba regexp catastrophic backtracking) “zabije” celý server.
  • 27. Funkce getData  =  -­‐>  “mock  data” Mějmě jednoduchou funkci, která vrací nějaká data -- ještě budeme řešit jaká, takže si vrátíme něco co zatím stačí.
  • 28. Změna  zdroje  dat getData  =  (cb)  -­‐>        Model.findOne()  (m)  -­‐>                cb  m.data ...pak se k tomu vrátíme a data od někud skutečně vezmeme, třeba z databáze a vrátíme je onomu callbacku...
  • 29. ...který tam původně nebyl -> změna signatury funkce a flow všeho co ji používá. Rule of thumb: pokud by se vaše funkce mohla dotknout libovolného I/O, rovnou si předávejte callback.
  • 30. Chybějící  callback E.T. volat domu: stává se, že chyba v aplikaci se projeví tak, že člověk zapomene zavolat finální callback/render do browseru, tj. žádný traceback, nic. Debugging toho je občas mírně frustrující.
  • 32. newFunction  =  -­‐>  log  =  'abc'    newFunction  =  function()  {        var  log;        return  log  =  'abc';    }; Pakliže funkce ve vyšším scope neexistuje, správně se vytvoří s var, tj. jenom pro podřízený scope --- výborně, opravuje to jednu z poměrně frustrujících věcí v JS (člověk omylem plevelí globální scope).
  • 33. log  =  require  './log' newFunction  =  -­‐>  log  =  'abc'    log  =  require('./log');    newFunction  =  function()  {        return  log  =  'abc';    }; ...nicméně pokud už tam stejná proměnna existuje (samozřejmě nezávisle na tom, jakého typu), je místo toho přepsána. To znamená, že funkce nejsou zcela zapouzdřené -- jsou ovlivňovány kontextem ze svého nadřazeného scope. IMO nedobrá volba.
  • 34. API  je  pro  konzervy Trochu souvisí s předchozími poznámkami. Komunita je mladá a kreativní a dynamická a změn zpětné kompatibility se nebojí, s čímž je potřeba počítat. Node samotné už nicméně dosti stabilní je na změny API dává pozor, ekosystém k tomu ještě musí dojít.
  • 35. Výjimky  zabíjí Neodchycená výjimka zabije celý proces/server a většinou to za vás nikdo moc neřeší: standardní pattern je výjimky nevyhazovat, ale vracet v callbacích jako první parametr. Stát se to ovšem z vašeho kódu může a je potřeba na to dávat pozor. (Třeba node-raven se to snaží řešit přes raven.patchGlobal, ale funguje to tak nějak všelijak.)
  • 36. Škálování The guys that are getting paid the big bucks to deliver scalable solutions aren’t up at night feverishly rewriting their systems in Node. They’re doing what they’ve always done: measuring, testing, benchmarking, thinking hard, keeping up with the academic literature that pertains to their problems. That’s what scaling in the large necessitates. -- Alex Payne Když řikám škálování tak myslim cestu ke Škálování, nikoli stránky velikostí čínského eshopu jako seznam nebo centrum.
  • 37. Concurrency  lock-­‐in Když člověk roste ke škálování, mění se přístupové vzorce. Díky tomu se v čase mění i vhodná řešení. V node.js je člověk zamčen, nemá možnost volby -- All Hail To Mighty Evenloop. Tohle časem člověka může bolet...na druhou stranu, v momentě, kdy řeší takové problémy, tak to znamená, že je na tom dobře.
  • 38. Kam  s  ním? I/O bound věci Distribuce dat (a APIs) Proxy Realtime / server push Tam, kde se dájí sdílet data mezi serverem a klientem (tj. javascript-heavy appky nebo při sdílení klíčové komponenty, jako třeba DSL/parseru).
  • 39. The Way of Node • Node  is  a  platform. • Node  is  JavaScript. • Node  is  callbacks  &  Streams. • Node  is  not  pretending  it  is  blocking  when  it  is  not. • Node  is  not  going  to  include  that  module. • Node  is  for  building. • Node  is  a  community. • Node  is  faster. • Node  is  fun. -­‐-­‐  Mikeal  Rogers Převzato z http://www.mikealrogers.com/posts/the-way-of-node.html , thx & kudos!
  • 40. Až budete psát příští aplikaci, zamyslete se, jestli na daný problém více nesedí vhodnější technologie, jestli jen neohýbate ty co znáte, protože jste po kotníky zakopání v nějaké komfortní zóně. No a kdyby vám to ve vaší firmě nechteli dovolit...
  • 41. ...dovolíme vám to u nás. http://apiary.io/jobs
  • 42. Thank You (aka Credits) Everything under CC commercial on flickr through compfights -- thanks you too! • http://pinkie.ponychan.net/chan/files/src/133479594662.png • http://www.flickr.com/photos/yakobusan/2995035580/sizes/o/in/photostream/ • http://www.flickr.com/photos/sukanto_debnath/519690623/sizes/o/in/photostream/ • http://www.flickr.com/photos/striatic/2191404675/sizes/z/in/photostream/ • http://www.flickr.com/photos/nicholasro/4784567537/sizes/z/in/photostream/ • http://www.flickr.com/photos/boltron/4461019149/ • http://www.flickr.com/photos/7989285@N07/1794265047/sizes/z/in/photostream/ • http://www.flickr.com/photos/olibac/3462198490/sizes/o/in/photostream/ • http://www.flickr.com/photos/28157757@N05/5715697350/sizes/l/in/photostream/ • http://www.flickr.com/photos/anieto2k/5401318057/sizes/l/in/photostream/ • http://www.flickr.com/photos/oskay/265899784/sizes/l/in/photostream/ • http://www.flickr.com/photos/68387408@N00/2661844560/ • http://www.flickr.com/photos/tambako/4831699383/sizes/l/in/photostream/ • http://www.flickr.com/photos/raindrift/7095243379/in/set-­‐72157629492908038/ • http://www.flickr.com/photos/astragony/4852775794/sizes/l/in/photostream/ • http://www.flickr.com/photos/13589188@N00/3164471672/ • http://www.flickr.com/photos/albertoalerigi/2886157131/sizes/l/in/photostream/ • http://www.flickr.com/photos/67471595@N00/1353578358/ • http://www.flickr.com/photos/tambako/2361526167/sizes/l/in/photostream/ • http://www.flickr.com/photos/26063220@N00/3480359060/ • http://www.flickr.com/photos/jam343/4952338/sizes/o/in/photostream/ • http://www.flickr.com/photos/stolensnapshot/3333052115/sizes/l/in/photostream/ • http://www.flickr.com/photos/seeminglee/601883302/sizes/o/in/photostream/