Scala in Depth - podrobná recenze

Joshua Suereth vytvořil v podobě své knihy Scala in Depth perfektní kuchařku, sadu best practices, která poskytuje "kuchtíkům ve Scale" tolik potřebný rámec a ideje pro využití mnoha zajímavých vlastností jazyka, který přirozeně kombinuje vlastnosti objektově orientovaného (OOP) i funkcionálního programování - dvě dosud typicky odděleně používaná paradigmata.

Je lehké se naučit Scalu?

Obálka knihy

Pro ovládnutí celého jazyka a souvisejících technik jak z OOP, tak z  funkcionálního programování a technik nově vznikajících z jejich synergie je potřeba přeci jen nastudovat více materiálu, aby bylo možné je používat efektivně.

Kompletně se naučit Scalu je tedy náročnější, ale při dnešním trendu ostatních mainstreamových programovacích jazyků - absorbovat stále více prvků z funkcionálních jazyků - se tato investice určitě vyplatí: Naučíte se jazyk, který umožňuje přirozeně prolínat výhody funkcionálního programování a OOP.

Ostatní jazyky se snaží přejímat stále více funkcionálních konstrukcí, takže i zde je potřeba investovat stále více času do pochopení principů funkcionálního programování (nejen OOP) a využití jeho výhod při návrhu a tvorbě aplikací.

I když je možné Scalu poměrně rychle začít využívat pro psaní jednoduchých programů, pro perspektivní psaní vlastních kvalitních knihoven/frameworků je potřeba zajít dále a naučit se Scalu "celou" (včetně hlubšího pochopení typového systému, implicitního systému apd.) - viz. klasifikace úrovní osvojení Scaly podle Martina Oderskyho.

Pro koho je kniha určena?

Joshua Suereth

Scala in Depth je ideální knihou, která vás naučí jak různé (a především ty pokročilejší) vlastnosti Scaly správně využívat v praxi, a to přímočaře a autoritativně. Nevyžaduje explicitně hlubší referenční znalosti Scaly, ale v některých náročnějších kapitolách (The type system, Using implicits and types together, Patterns in functional programming) se vám pro snazší pochopení budou znalosti specifických vlastností Scaly na středně pokročilé úrovni hodit (například kniha Programming in Scala od Martina Oderskyho je v tomto případě více než dostačujícím "základem"). Nutným předpokladem je také předchozí zkušenost s objektově orientovaným programováním.

Joshua Suereth sice teoreticky uvádí čtenáře do probíraných vlastností Scaly, ale už nijak zevrubně, Scala in Depth je především knihou praktickou, kde náplň jednotlivých kapitol se orientuje především na dostatečně obecné techniky a best practices při používání vlastností jazyka. Autor jde však i dále a v knize často popisuje zkušenosti, zajímavé koncepty a praktiky programátorů ve Scala komunitě, které dosud nebyly takto srozumitelně sepsány.

Řada příkladů a use casů, které nám autor předkládá, má skutečně praktické použití a zřejmě nemalou měrou byla inspirována vývojem Simple Build Toolu (SBT) a jinými projekty, na kterých se Joshua Suereth podílel. Pravda, některé představené techniky mají poměrně úzké pole využití, ale vždy se jedná o techniky užitečné a často inspirativní - i s takovými případy se v knize setkáte, většinou se však jedná o techniky přímo použitelné při každodenním programování.

V každém případě je potřeba ocenit autorovo úsilí vytvořit knihu dostatečně obecnou, kterou zub času ohlodá až za velmi dlouhou dobu, a přitom poměrně rozsáhlou, bohatě pokrývající důležité vlastnosti jazyka, se kterými se budete prakticky setkávat (aktuálně do verze Scaly 2.9).

Best practices included

V knize se setkáte s 28 obecnými pravidly/best practices, kterých je vhodné se  držet, pokud chcete psát aplikace dostatečně srozumitelné pro ostatní kolegy, rozšiřitelné, používající vhodné techniky na vhodném místě, a pokud se chcete vyhnout některým záludnostem jazyka nebo např. některým problémům při integraci Scala kódu s Javou.

A s čím se v knize konkrétně setkáte?

Nebudu předjímat, k jakým výsledným doporučením kniha dochází, ale spíše si představíme ty nejzajímavější oblasti, které můžete díky knize prozkoumat:

Funkcionální programování

Autor představuje způsoby, jak psát objektově orientovaný kód více funkcionálně a stávající kód vylepšit o funkcionální prvky. Funkce je ve Scale prvořadým konstruktem a zároveň objektem, který lze přirozeně kombinovat s jinými objekty v OOP.

Základní princip funkcionálního programování shrnují věty: "Functional programming is more than combining functions with other functions. The essence of functional programming is delaying side effects as long as possible."

Na konci knihy autor na uceleném příkladu konfigurace komponent aplikace představuje stavební kameny funkcionálního programování: Funktory a monády a další techniky jako currying, aplikativní styl programování a monadická workflow pro implementaci sekvenčního zpracování modulárním způsobem bez vedlejších efektů.

Immutable vs. mutable konstrukce

Výrazy lze ve Scale přirozeně kombinovat s immutable objekty. Kniha zdůrazňuje značné výhody immutable konstrukcí - např. jedině immutable objekty splňují nejrůznější požadavky kladené na korektní implementaci metod equals a hashCode, nehledě na velké výhody v paralelním programování. Dozvíte se, jak (s využitím metody canEqual) implementovat porovnávání objektů ještě o něco sofistikovaněji, než je uvedeno např. v knize Effective Java, 2nd edition.

Zajímavým faktem z "mutable světa" je, že mutable kolekce Scaly mohou být snadno zapojeny do mechanismu událostí, který umožňuje reagovat na změny v kolekcích.

Využití objektově orientovaného programování

Dozvíte se zejména, jak psát správně inicializační logiku ve Scale, jak správně používat abstraktní členy v traitech. Traity jsou mocným nástrojem kompozice chování ve Scale a ještě více "okořeňují" známou radu ze světa Javy: "Favor composition over inheritance".

Kolekce ve Scale

Kniha probírá vhodné případy užití pro jednotlivé kolekce a celkově je poměrně prakticky orientovaná, narozdíl např. od kapitoly o kolekcích z "Programming in Scala", která je zase velmi obsáhlá a vskutku referenční (Scala in Depth nemá potřebu celou tuto referenci zbytečně kopírovat, což je jedině dobře).

Z těch zajímavějších technik se dozvíte, jak si vytvořit užitečné lazy vyhodnocované TraversableView, a kdy je vhodnější použít v paměti cachovaný Stream.

Oceníte schéma přechodů mezi kolekcemi striktně a lazy vyhodnocovanými, mezi sekvenčními a paralelizovanými operacemi (a možnými kombinacemi těchto případů).

Po přečtení knihy budete umět psát operace, které mohou být aplikovány na libovolnou vstupní kolekci (nebo vytipovanou kategorii kolekcí) a přitom plně zachovají informace o typových parametrech. Zároveň budete umět aplikovat specializované chování na vybrané typy kolekcí.

Typový systém

Bohatý typový systém je asi to nejlepší, co můžete najít ve Scale a v této knize. Kapitoly o typovém systému vás zcela jistě zavedou hlouběji než ty ostatní.

Scala umožňuje různé způsoby referencování vnořených typů. Pomocí klíčového slova type nadefinujete kdeco: Aliasy, abstraktní typy, strukturální typy a to spolu s traity vede k dosud netušeným flexibilním možnostem abstrakce, se kterými se můžete ve Scale poprat, pěkně typově: "One of the biggest benefits of using Scala is the ability to preserve specific types across generic methods".

Pomocí klíčového slova type lze konstruovat typy složené z více (jiných?) typů ("higher-kinded types"). A co takhle zkonstruovat si rovnou typ rekurzivní?

Aby byla vaše vyjadřovací schopnost přesná, přijdou vám vhod rovněž různá omezení kladená na typy v kombinaci s typovými parametry: "Lower a upper bounds", "reified type constraints" - některá omezení již používají pokročilé konstrukce implementované (verifikovatelné) pomocí implicitních konverzí.

Sbírku konstrukcí typového systému uzavírají existenciální typy. Dozvíte se, že ty vlastně existují už v Javě, ale ve Scale je před vámi nikdo neschovává (ve víře, že vám budou k něčemu užitečné) a můžete si jimi zpestřit své vybavení: "It's a great tool to understand and use when running into nested types that seem inexpressible". Ve Scale lze vyjádřit opravdu mnohé, a díky přesnějším vyjadřovacím schopnostem Scaly pak mnohá omezení nadefinujete přímo v typovém systému (staticky) a nemusíte je stále znovu kontrolovat za běhu aplikace.

Kombinování typového a implicitního systému

Pomocí implicitních hodnot a konverzí lze psát flexibilní a expresivní kód. Dozvíte se například, že implicitní parametry dobře spolupracují s default hodnotami, a že využívat implicitní obohacení existujících typů o novou funkcionalitu je mocná dvousečná zbraň, kterou je vždy lepší ponechat pěkně doma ve stojanu, pokud nevíte, co děláte.

Pomocí "context bounds" a "view bounds" můžete nadefinovat, že v implicitním systému musí být dostupný určitý typ-kontext nebo konverze pro váš typový parametr.

Vaší pozornosti by neměl uniknout ani type class pattern - velmi flexibilní mechanismus pro adaptování (již existujících) typů na oddělené abstrakce šité na míru algoritmům - např. algoritmům pro řazení, obecnou práci se zdroji...

Závěrem pojednání o spolupráci typového a implicitního systému se dozvíte, že typový systém Scaly je tak bohatý, a klíčové slovo type tak mocné, že přímo při deklaraci typů můžete nasimulovat logiku příkazu if, rekurzi, nebo třeba i posloupnost přirozených čísel (tzv. "programování v typovém systému", ve kterém je logika zakódovaná přímo do typů, a tedy kontrolována přímo kompilátorem) a pomocí toho všeho např. implementovat generický heterogenní seznam, do kterého můžete typově bezpečně, ale dynamicky, přidávat nové prvky různých typů, odebírat je a provádět další oblíbené operace.

Aktoři

Joshua Suereth se v oblasti aktorů zaměřil na přínosné případy komunikace mezi aktory a obecně použitelné koncepty při programování paralelních aplikací (timeouty, izolování a ošetření chyb v komponentách, izolaci kritických komponent od méně důležitých komponent, topologii aktorů).

Probrány jsou základy Scala actors library, poté se však autor už věnuje výhradně frameworku/toolkitu Akka, který je vysoce efektivní v produkčním nasazení.

Závěr

Závěrem nelze než přitakat prof. Martinu Oderskymu, který v předmluvě zmiňuje, že Joshua Suereth je jedním z "nejkompletnějších" programátorů, jaké zná, expertem v řadě oblastí a talentovaným učitelem. Kniha Scala in Depth toto potvrzuje a je skvělé, že jejím prostřednictvím se Joshua Suereth o své znalosti a zkušenosti štědře dělí s ostatními.

Pokud jste s různými vlastnosti jazyka Scala dostatečně obeznámeni a chcete je začít používat prakticky, a to rovnou vhodnými osvědčenými způsoby, je Scala in Depth tou pravou knihou pro vás. Naleznete v ní doporučení, která vás jistě obohatí jako programátora obecně, i když přímo Scalu nepoužíváte - podobně jako Programming in Scala - ale zde jsou už doporučení přeci jen více zaměřená na vlastnosti specifické pro Scalu, vedoucí k plnému a zodpovědnému využití síly jazyka.

Pokud již ve Scale programujete, kniha vás nesporně značně posune dále. A pokud vás zajímá objektově orientované programování podpořené znovupoužitelnými elegantními funkcionálními konstrukcemi, programování, ve kterém se snoubí síla a jednoduchost immutable konstrukcí a kontrola nad vykonáváním různých částí programu s organizačními schopnostmi OOP designu, naleznete v knize Scala in Depth rozsáhlého a inspirujícího průvodce.

Článek obsahuje 0 komentářů