Typické! O maďarské konferenci mloc.js a statickém typování při vývoji webových aplikací

To je tak typické! Ptáte se co? Že po mnoha letech alibistického ujišťování se, že statické typování v JavaScriptu není vlastně nutné, že lze vše pokrýt testy, se najednou jak houby po dešti rodí desítky projektů, jichž hlavním smyslem je přivést do vývoje webových aplikací statické typování. Záměrně píšu webové aplikace a ne javascriptové, protože to co se děje, už se netýká jen JavaScriptu.
Nálepky:
Co to je statické typování?
Ti, co vědí, mohou odstavec přeskočit a pro ty, co nevědí, jen lehký úvod. Statické typování je to, čím se liší skriptování od programování. Bez typů je kód jen hloupou sadou příkazů, bez soudržnosti a vnitřní logiky. Bez typů vidí počítač náš program asi takhle:
function foo(a, b, c) {
a.???
}
Co je to a
? Je to metoda nebo hodnota? Můžu na tom volat co? Nevíme. Kód bez typů je pouze interpretovaný text. Proč na tom záleží? Chceme-li do HTML stránky přidat Lightbox, typy nejsou nutné. Přidám Lightbox, reloadnu prohlížeč, a hned vidím, jestli vše funguje nebo ne. To ovšem už neplatí pro autora Lightboxu. Ten by byl naopak moc rád, kdyby po každé změně nemusel celou svou miniappku ručně proklikávat.
Ano už to slyším: „Na co máme testy? V ideálním růžovo-poníkatém světě máme přeci vše krásně otestované.“ Ano máme. A teď mi ukaž svou poslední aplikaci, a projdeme si, jaké testy v ní jsou. Tohle je na samostatný článek (napíšu později), takže to uzavřu historkou. Zrovna minulý týden jsem se bavil s programátorem, který rok pracoval na projektu, co rok předtím psal jeden nejmenovaný, teoreticky velmi vzdělaný, OOP, TDD atd. purista a dogmatik. Nešlo o nic složitého, prostě backend pro ukládání pár modelů. Po roce a více vývoje v produkci skoro nepoužitelné. Spousta bugů, mizerný výkon, špatná architektura. Ale unit testů tam bylo nekonečně. Jen neodhalily žádnou skutečnou chybu. Prostě tam jen tak tlely a zdržovaly při refaktorování.
Testy jsou must have pro knihovny určené k dalšímu použití. Stabilizují API, poskytují dokumentaci k použití. Aplikace je málokdy určená ke znovupoužití. Psát aplikaci tak, aby se od začátku dalo testovat a skutečně testovalo vše, skoro nikdo neumí. Napsat, že metoda getUser
vrací typ app.user.Model
, a že name
je typu string
, umí každý. Je tedy zřejmé, že unit testy statické typování nenahradí.
m-loc.js konference
Tohle vše si uvědomila firma prezi.com, a rozhodla se uspořádat zajímavou konferenci zasvěcenou statickému typování pro vývoj webových aplikací. Já jsem byl pozván na krátký lightening talk. Na větší přednášku už nezbyl prostor, takže pokud se chystáte jet někam přednášet, raději svůj talk navrhněte co nejdříve. Hlavní produkt Prezi je napsán v technologii Flash, což je pomalu, ale jistě odumírající platforma. Proto se vývojáři Prezi rozhlížejí po alternativách. A že jich je, když se podíváte na program konference.
Naprostá většina přístupů se řídí stejným principem: Když už jeden staticky kompilovaný jazyk máme, proč bychom to nemohli udělat tak, aby se kompiloval i do JavaScriptu? Takže jsme viděli C#, Scalu, Haxe, Dart a další jazyky kompilované do JavaScriptu. Šmahem je všechny odsuzuji jako akademické, a jen málo použitelné leaky abstraction projekty. Tedy krom Dartu, který je od začátku pro web (nejen) zamýšlen. Pak také izraelský sharpkit.net mne ohromil svou pragmatičností a kvalitou, avšak obávám se, že s pozvolným příchodem www.typescriptlang.org, raison d’etre SharpKitu pomine.
Jmenuji se Daniel Steigerwald a pomáhám firmám i jednotlivcům s vývojem webových aplikací. Pořádám školení, která si můžete objednat na javascript-skoleni.cz. Pokud máte dotazy, napište mi.
Jaké projekty považuji za reálné a proč
O Google Closure Tools jsem se zmínil zde zmínil už několikrát. Je to dnes jediná ready to production technologie. Což však už nemusí platit za rok.
Dart
Dart se kvapem vyvíjí. Ale má jeden problém. Není to JavaScript = neseženete na něj lidi. A to se hned tak nezmění. Kdybych měl vlastní firmu, s oddaným nefluktuačním týmem horlivým se učit nové věci, a nechtěl reuse existujícího javascriptového kódu, stál by Dart za zvážení.
TypeScript
TypeScript. Microsoft se probudil, a konečně vytvořil zajímavou a užitečnou technologii, která udeřila přesně hřebíček na hlavičku. Problém: Ohromná spousta již napsaného netypového kódu. Řešení: Dodat všem typy adhoc, viz. například github.com/borisyankov/DefinitelyTyped.
TypeScript není nový jazyk. Je to evoluční vylepšení JavaScriptu, se všemi jeho libůstkami. Přesně to, co svět potřeboval. Typy a progres směrem k ECMAScript 6, použitelné už dnes.
CoffeeScript
Můj milovaný CoffeeScript. Jak se zde ocitl, vždyť typy nemá? Nemá, ale ve spojení s typovými anotacemi Closure Compileru, tedy tak jak ho já používám v github.com/Steida/este, typy má. A ve velmi blízké budoucnosti jej čekají příjemné novinky. CoffeeScript 2 je překvapivě na první pohled identický s CoffeeScriptem 1.x Ty podstatné změny se odehrály uvnitř. Jeremy Ashkenas, autor CoffeeScriptu jej navrhl… ne zcela ideálně architektonicky, což zapříčinilo ne zcela jednoduché rozšiřování jazyka. Proto vznikl CoffeeScript 2, který napsal a navrhnul spoluautor předchozí verze. Peníze získal přes kickstarter.com. A výsledek se velmi povedl. Lepší je vše. Error reporting, parsování, AST stromy, změny jazyka, spolehlivost a další.
Závěr
Dart je nový vesmír IMHO se šancí zabít Javu na Androidu. TypeScript je starý dobrý vesmír, který známe, mírný progres v mezích zákona s opravdu chytře přidaným statickým typováním. Něco, na co bych babičku znalou JavaScriptu dokázal přeučit. A CoffeeScript? Velmi si slibuji od projektu https://github.com/michaelficarra/coffee-of-my-dreams. Do toho se Michael pustí hned, jak dokončí přepis CoffeeScriptu, a bude to bomba. Jak tedy vidíte, pro každého něco, a tak to má být.
„Statické typování je to, čím se liší skriptování od programování. Bez typů je kód jen hloupou sadou příkazů, bez soudržnosti a vnitřní logiky.“
Uff, to má být co? Já si vždycky myslel, že Zdroják je určen programátorům. Věta, že statické typování je to, co odlišuje skriptování od programování rozvinutá o hlubokomyslnou úvahu, že bez typů je kód sadou příkazů bez vnitřní logiky je pravděpodobně perlou tohoto měsíce na úrovni tvrzení, že motorista je pouze řidič automobilu protože motorkáři jezdí pouze na dvou kolech.
Jsem příznivcem toho, o čem autor píše a domnívám se, že typování je budoucnost JavaScriptu a tím i webu, ale autor je buď typový fanatik, nic o programování neví nebo se zbláznil.
Přidávám možnost, že jste třeba autorovi špatně (resp. nepřesně) porozuměl.
Máte pravdu. Bylo celkem pozdě v noci a dost mě to vyděsilo. Člověk POV v téhle úrovni přeci jen očekává spíše na soukromém blogu než na Zdrojáku.
Texty přinášející osobní názor vycházely na Zdrojáku odjakživa. Raději si zvykněte 8-)
1. „Můj milovaný CoffeeScript. Jak se zde ocitl, vždyť typy nemá? Nemá, ale ve spojení s typovými anotacemi Closure Compileru, tedy tak jak ho já používám v github.com/Steida/este, typy má.“
JS( a dlasie jeho syntakticke nadstavby) predsa typy maju.
Je rozdiel medzi
2 + 2; // 4
„2“ + 2; // „22“
operator „+“ s kazdym typom pracuje odlisne.
2. skryptovat sa da velmi pekne aj v silne (a staticky) typovych jazykoch (ako trebars F#) podla autora, ale asi F# nema typy lebo ich explicitne nemusi anotovat.
Rozdíl mezi výrazem silně typované, a staticky typované.
Když by to napsal (třeba) „Můj milovaný CoffeeScript. Jak se zde ocitl, vždyť staticky typovaný není? …“, tak by to prostě nebylo tak hezké vyjádření :-)
A snad ještě dodám: vnitřní logiku dává kódu leccos, ale typování to opravdu není. Naschvál, kolik lidí překvapí, že tím hlavním činitelem je v tomto procesu především programátor. S blbým kódem od neschopného autora testy neudělají vůbec nic i kdyby se jich upsal a s typy to je dost podobné. Velkých teoretiků, co produkují blbý kód je mimochodem docela dost. Nemluvě o tom, že nebýt dynamicky typovaných jazyků, museli bychom si je vymyslet protože nevznikly pro nic za nic. Psát webové aplikace v Javě (dosaďte si případně svůj oblíbený typový jazyk), nejspíš by se kupříkladu skoro nikdo nedoplatil. Ostatně typované jazyky vznikly zhusta mimo jiné proto, že kompiler potřeboval při tehdejší výkonosti techniky vědět s jakýmiže daty má tu čest.
A hádejme, co se dnes uvnitř kompilerů dynamicky typovaných jazyků děje. Ano, překvapivě si kompiler udržuje informaci o tom, jaký typ jaká proměnná obsahuje a případně provádí za programátora přetypování. On to totiž není bug, ale featura, ejhle! Třeba pro ty, kteří jsou schopni psát svůj kód dostatečně na úrovni na to, aby si mohli dovolit typy řešit jen v míře nejnezbytněji nutné.
Napsal jsem dost kódu v různých jazycích a obojí má své určení a své výhody a nevýhody. Pojímat tedy tuto problematiku tímto způsobem je mírně řečeno velmi nešťastné.
No tak ty seš tak dost dobrej ******. Samozřejmě že typování je dobra věc. Automaticky předchází problémům, zmenšuje chybovost. Psát typovým jazykem bude vždy levnější než bastlem nazývaným Javascript.
Absolutní absence typu je _právě_ to, co je výhodou JavaScriptu. Nemusím se starat o to, zda mám funkci co podporuje dané typy, nebo ne. Buď jsem blbej a pošlu tam něco, s čím si to neporadí, nebo to proběhne v naprostém pořádku. Nemusím „zbytečně“ pokaždé psát co chci za typ a ještě to rozkopírovat na 4 přetěžené funkce podle typu.
Nejlepší je optional typing. Tam kde typy potřebuji, tam je mám. Tam kde ne, tam je nemám. Tenhle princip používá také Dart.
Closure Compiler umí type inference, takže třeba uvnitř metod typy není třeba definovat. Anotacema chráním jen api method. Rozkopírování také není nutné, alespoň v Closure. Stačí anotace @override, ta definice typů přebere.
Vtipt je v tom, že v typově založených jazycích ani blbej být nemůžeš, tudíž tam ani nic nepošlel. Osobně obhájce bastlSkriptu nechápu. Osobně se chudákům co s tím ksindlem musí pracovat směju. A to se docela často koukám do zrcadla.
Není to nejpřesnější vyjádření, souhlasím. O to v článku ale nešlo.
> Dart se kvapem vyvíjí. Ale má jeden problém. Není to JavaScript = neseženete na něj lidi.
Dart není JavaScript, a proto na něj seženete lidi mnohem snáz. Dart se snadno naučí každý průměrný Javista, C#ista, PHPčkař, Rubyista, Pythonista, prostě každý, kdo měl kdy něco společného s nějakým civilizovaným objektovým jazykem založeným na třídách. JavaScript? Nenechte se vysmát.
V zásadě souhlasím. Omlouvám se, že jsem myšlenku více nerozvinul, ale tlačil mne čas. Znát jazyk nestačí. Je třeba znát i knihovny, frameworky, celý ekosystém. Dart se zkušený programátor za pár dnů naučí. Ale překlopit všechny dosavadní nástroje, postupy, atd. už zabere více času. I když dnes máme Closure, Angular, Backbone, tak spousta lidí nezná ani to.
Je to o mainstreamu a jednoduchosti použití. Situace je zatím taková, že Dart je možná parádní symfonie od Beethovena, ale většina si radši poslechne Madonnu (TypeScript).
Situace je taková, že dneska spousta lidí používá GWT, Script# a podobné, a spousta jiných lidí si stýská po Flashi/Flexu. Ono se to možná lidem z JS světa nezdá, ale takových je fakt hodně. Dart je pro takovéhle lidi první volba.
Jako Flexista musím poznamenat, že Dart pro mě rozhodně první volba není :)
A samozejmě nemám patent na rozum, a je dost možné, že za rok budu mluvit jinak. Jen blbec se nikdy nemýlí.
Jasně že jo. Ale ten argument o ekosystému je skvělý — podle mne ovšem proti JavaScriptu. Včera nebo předevčírem jsem četl tenhle článek: http://www.ramen.io/post/46936028144/we-are-switching-to-dart-why Lidi od blossom.io tam vyjmenovávají, jaké JS technologie používají: CoffeeScript, Underscore, jQuery, Backbone, Brunch… Dobře, nejsou to Closure Tools ani Angular :-), ale je na tom dobře vidět, kolik věcí potřebujete v JS světě _extra_, které v Dartu dostanete automaticky. Rozumný jazyk, rozumná standardní knihovna, rozumná knihovna pro DOM, a spousta dalšího (balíčkovací systém, generátor dokumentace, relativně rozumné IDE), to všechno není třeba hledat. To dostanete hned, jak si stáhnete SDK.
Jenže historie nás učí, že worse is better, takže jak to doopravdy bude…
Vždyť v JavaScriptu taky můžete psát programy se statickým typováním… V JavaScriptu jen nejste nuce to dělat a to je rozdíl od kompilovaných jazyků. Jestli přece zavarujete var a = 5. Tak proměnná a je číslo. A pokus už s proměnnou budete dále pracovat jako s číslem, tak má stále stejný typ a tím je její typ statický. Porovnávat ji pak můžete pomocí operátorů !== a === čímž zabráníte přetypovávání a máte skoro výkon aplikace se statickými proměnnými… Jen jste program nepsal tak dlouho, protože jste všude nemusel opakovat ten typ.
Samozřejmě, že tohle je jenom nástin, co v JS jde, ale do větší šířky už to moc nejde, když mrknem třeba na string… :-) Ale tohle jednou bude umět JavaScript taky. :-)
Tak to je vazne staticky typovy system jak noha.
Ostatne to, ze je potreba typy ve statickych typovych systemech stale opakovat je povera. Rozumnejsi jazyky (Scala, Haskell…) maji typovou inferenci. A polovinu toho, co je potreba napsat v kodu, za programatora napise IDE.
Predstava, ze se nepsanim typu nejaky cas usetril je naprosto zcestna. Kolik procent (promile?) casu travite tim, ze skutecne mlatite do klavesnice a pisete kod, co se pak objevi na produkci?
Nepsáním typu čas určitě neušetříme. Na druhou stranu, já za sebe tedy IDE psát svůj kód nenechávám. Stačí, že se občas musím hádat se svým okolím, nepotřebuji se tedy hádat ještě s tím, co mi má mou práci ulehčovat. Ale pravda, je to značně subjektivní.
Asi bych mel problem pouzivat IDE, kteremu se neda (v rozumne mire) verit.
Kolik jsi toho napsal solo a kolik v tymu???;-) BTW Vikendovky vynech…
Trochu mimo temy. Ale nemate info v akom stave je nativna podpora Dartu v Chromiu(Dartium)?
Není a ještě nějakou dobu nebude. Osobně bych odhadoval, že dřív než bude Dart ve verzi 1.0, se v Chromiu Dart VM neobjeví. A 1.0 bude nejdřív letos v létě, možná později.
Bohatší typový systém pomáhá zkracovat kód: Můžeme třeba přetěžovat funkce. Například následující funkce pro parsování
readInt
,readIntList
,readBool
můžeme pojmenovat jednodušeread
a psát kratšísum . read
(význam: rozparsuj seznam prvků a sečti je; tečka značí skládání funkcí) místosum . readIntList
(význam: rozparsuj seznam Intů a sečti je). Tohle v tzv. dynamicky typovaných jazycích nejde.Přetěžování je zlo. A samozřejmě existuje manuální dispatch, ale hádám, že o tom se ve vyšších kruzích nemluví ;-)
IMO rozumně použité přetěžování zpřehlední kód. Např.: V různých třídách / strukturách / záznamech mohu mít vlastnosti / metody / pole se stejným jménem. V jedné třídě mohu mít metody se stejným jménem. Operátorem
+
mohu sčítat celá čísla, čísla v plovoucí řádové čárce nebo provádět zřetězení. Samozřejmě, přetěžování může komplikovat programovací jazyk, což pak může vyústit k překvapivému chování kompilátoru nebo programu.Nepochopím, že v dnešní době někdo vytvoří typový systém bez parametrického polymorfismu (tj. bez podpory generik). Tohle se netýká jenom TypeScriptu, dalším příkladem je Go.
Google is your friend.
http://blogs.msdn.com/b/typescript/archive/2013/03/25/working-on-typescript-0-9-generics-overload-on-constants-and-compiler-performance.aspx
Aktuální verze TypeScriptu: 0.8.3. Odkazovaný blog je o připravované verzi 0.9. Z toho plyne, že máme zatím smůlu.
typescript.codeplex.com/SourceControl/list/changesets?branch=develop
Cau, pekne shrnuti, jelikoz jsem tam byl taky, dovolim si jen jednu poznamku:
Prezi to nema napsane ve Flashi, ale pouzivaji http://haxe.org/, akorat maji v soucasne dobe nejmocnejsi kompilator prave do Flashe…
Pár řádků o statickém typování, pár řádků o nějaké konferenci, pak zmínka o CoffeeScriptu a TypeScriptu a na závěr pár řádků o nějaké technologii, co má šanci zabít Javu na Androidu, ale s JS nemá nic moc společného. O čem vlastně ten článek je?
Tak vyjmenoval jste to dobře 8-) Hlavní téma by měl být patrné z nadpisu.
Haxe je akademický, málo použitelný leaky abstraction projekt? Šmahem Vás odsuzuji jako ignoranta.
Jen dejte pozor, abyste se při tom honění vzájemně neušmažili. 8-)
Steigerwalde, Steigerwalde. Ty kluku filutový.
>> Dart se kvapem vyvíjí.
To nemyslíš vážně. Dart je mrtvě narozené dítě. Ani vevnitř Googlu nikdo nepoužívá Dart.
>> Problém [TypeScriptu]: Ohromná spousta již napsaného netypového kódu.
To nemyslíš vážně, filuto. Co má TypeScript společné se „spoustou již napsaného netypového kódu?“ To je, jako bys řekl před 18 lety, že problém Javy je, že spousta kódu je napsaná v Cobolu.
ad Dart: Nejdřív platforma, potom aplikace v ní napsané. Obráceně to nejde. Na Dart už přecházejí firmy, např. zde http://news.dartlang.org/2013/04/why-blossom-is-switching-to-dart.html
ad TypeScript: Asi jste přehlédl fakt, že pomocí TypeScriptu a jeho type definitions lze přidat typy k již existujícímu kódu. V článku (který jste asi nečetl) je odkaz na seznam již existujících typových definic: https://github.com/borisyankov/DefinitelyTyped Jejich ranec.
Představa o nahrazení JavaScriptu něčím jako Dart je šílená asi stejně, jako argumentovat tím, že už na něj přešla celá jedna firma :-D Megalomanské sklony Google už přinesly pár zajímavých projektů, tady se ale obávám, že zůstane u zbožného přání.
cofeescript, typescript a dart moc lidi nepouziva a stale prevlada ciste jen javascript, takze kdyz se na projektu meni lidi tak radsi ho zacit psat v cistym JS nez v nejaky hovadine co nikdo neumi, nechce se ucit a rozhodne nema cas se do toho dostavat. A jen tak mimochodem … kompilovat Javascript ??? WTF ? PROC SAKRA ? Chcu to napsat v cemkoliv a hned pustit v prohlizeci … kor kdyz se jedna opravdu ciste jen o webovou aplikaci …