Программа курса и материалы по Scala

в 17:52, , рубрики: java, scala, Блог компании GolovachCourses, курсы, курсы программирования

Добрый день.

Меня зовут Головач Иван, я практикующий Java Tech Lead с опытом в программировании 10+ лет (Java EE, J2ME, C, C++, M-language, Delphi), который перешел на Scala.

Я подготовил и прочитал как обычные курсы по программированию (Java Core + Junior Java Developer), так и спецкурсы (Multicore Programming for JVM (раз и два)).

В данный момент я стартую спецкурс по Scala и в этом топике хочу поделиться материалами, которые я нашел наиболее интересными/информативными (курс готовился более года).

Программа курса
Материалы: «Разное»
Материалы: Object Oriented Programming in Scala
Материалы: Functional Programming in Scala
Материалы: Higher kinded types
Материалы: Parser combinators
Материалы: Metaprogramming / Reflection
Материалы: Metaprogramming / Macroses
Материалы: Scalaz
Материалы: Netty
Материалы: Akka
Материалы: Finagle
Материалы: Zookeeper
Материалы: Использование FP в финансовой отрасли

Программа курса

Спецкурс по Scala ставит своими целями
1. Глубоко изучить язык, включая такие «темные уголки» как macroses, path dependent types, generics of higher kind. Научиться создавать внутренние и внешние DSL. разобраться, почему в финансовой отрасли так популярны функциональные языки программирования.
2. Разобраться, почему при написании кода на функциональных языках программирования (и на Scala в частности) часто используют математические библиотеки обращающиеся к алгебре и теории категорий.
3. Посмотреть, почему современные стартапы (типа Twitter и LinkedIn) зачастую пишут свою инфраструктуру на Scala.

Спецкурс стартует 27 февраля 2015 года и состоит из 16 вебинаров по 2-2.5 часа. Длительность 3 месяца (1-2 занятия в неделю). Все лекции записываются на видео и предоставляются слушателям. Вся необходимая литература предоставляется в электронном виде. Я отвечаю на вопросы как в ходе вебинаров, так и в остальное время. Вы имеете возможность общаться с 15-20 другими слушателями, которые параллельно изучают Scala.

  • Модуль #1 (4 лекции): Базовая Scala
    Задача модуля — рассмотреть синтаксис и пути решения «бытовых» задач на Scala

    • «Разное»
      • Local Type Inference, unified types
      • Structural types, tuples
      • Generics: variance, upper/lower bounds, existential types
      • Lazy values, DelayedInit trait, App / Application
      • Implicits, view, view bounds
      • Sequence сomprehensions
      • Annotations, Exceptions
      • Work with XML
      • Scala’s Collections Library, Arrays

    • Object Oriented Programming
      • Classes, objects, traits
      • Type members, abstract types
      • Explicitly Typed Self References
      • Mixin class composition, compound types, hierarchy linearization
      • Cake Pattern

    • Functional Programming
      • Functional types, anonymous functions, nested functions, curring, partial application
      • Methods / Functions, Operators (prefix, infix, postfix; associativity), бесскобочная + бесточечная запись
      • Call-by-name / call-by-value, named and default params
      • Pattern matching, case classes, extractor objects

  • Модуль #2 (4 лекции): Продвинутая Scala
    Задача модуля — детально рассмотреть возможности Scala, которых нет в Java.
    • Dependent Types
    • Higher kinded types
    • Parser combinators
    • Metaprogramming = Reflection + Macros

  • Модуль #3 (4 лекции): Type-acrobatic libraries in Scala
    Задача модуля рассмотреть наиболее продвинутые библиотеки (в смысле использования системы типов и возможностей языка), как они написаны, что на них можно сделать.

    • Scalaz — немного теории категорий (монада, апликативный функтор, катаморфизм, ...)
    • Shapeless — a type class and dependent type based generic programming library
    • Algebird — или как в Twitter используют алгебру (моноид, группа, полукольцо, ...)

  • Модуль #4 (4 лекции): Многопоточное, сетевое и распределенное программирование
    Задача модуля рассмотреть наиболее популярные для JVM сетевые библиотеки, которые чаще всего являются «строительными блоками» больших распределенных систем. Разобраться, почему Twitter пишут на Scala.

    • Netty
    • Akka
    • Finagle
    • Zookeeper

Материалы: «Разное»

Вводные статьи по Scala

Данные статьи представляют собой краткие обзоры языка (15-20 страниц). Носят скорее идеологический/исторический характер — как сам автор (Одерский) видит свое детище, что он считает самым важным/отличительным/характерным.

Scala Style Guide

Основные статьи по Scala

Данные статьи освещают и проясняют основные характеристики языка.

  • «Scalable Component Abstractions», Odersky +…. We identify three programming language abstractions for the construction of reusable components: abstract type members, explicit selftypes and modular mixin composition. Together, these abstractions enable us to transform an arbitrary assembly of static program parts with hard references between them into a system of reusable components.… We demonstrate this approach in two case studies, a subject/observer framework and a compiler front-end.
  • «Type classes as objects and implicits», Odersky +…, Type classes were originally developed in Haskell as a disciplined alternative to ad-hoc polymorphism. Type classes have been shown to provide a type-safe solution to important challenges in software engineering and programming languages such as, for example, retroactive extension of programs. They are also recognized as a good mechanism for concept-based generic programming and, more recently, have evolved into a mechanism for type-level computation. This paper presents a lightweight approach to type classes in object-oriented (OO) languages with generics using the CONCEPT pattern and implicits (a type-directed implicit parameter passing mechanism).
  • «Matching Objects With Patterns», Odersky + ..., Pattern Matching во всей красе с Case classes / Extractors + сравнение с более классическими решениями (Visitor, Type-Test/Type-Cast, ...)

Курсы/подборки по Scala

Охват материала на небольшую книгу, но не книги. От «классиков».

Да, сама Coursera написана на Scala.

Книги

На рынке присутствует большое количество книг (порядка 20) по Scala, но мне в наибольшей степени понравились следующие 4

  • «Programming in Scala. 2ed» — книга от Одерского, классика, обязательна к прочтению
  • «Scala for the Impatient» — товарищ Хорстман и тут успел. Если Вам понравился его двухтомник по Java, возможно, стоит попробовать и это
  • «Scala in Depth» — хороший охват: от основ до продвинутых моментов
  • «DSLs in Action» — как реализовывать свои DSL на Scala

Материалы: Object Oriented Programming in Scala

  • «Independently Extensible Solutions to the Expression Problem», Odersky +…. Предлагается Scala-решение для «классической» Expression Problem. Частично решениями этой проблемы являются наследование (расширение сущностей) и шаблон Visitor (расширение операций), однако Одерский решает более интересную проблему — компоновка независимых расширений и сущностей и операций одновременно.
  • «Scala's Selfless Trait Pattern», Bill Venners — просто именованный шаблон работы с наследование в Scala
  • «Scala's Stackable Trait Pattern», Bill Venners — просто именованный шаблон работы с наследование в Scala

Материалы: Functional Programming in Scala

«Functional Programming in Scala» — сильная книга от одного из контрибюторов в Scalaz.

Материалы: Higher kinded types

  • «Fighting Bit Rot with Types», Odersky +… — описан рефакторинг коллекций Scala для версии 2.8 с хорошим погружением в higher-kind types, implicit parameters и implicit conversions

Материалы: Parser combinators

В Scala включен пакет (scala.util.parsing), который предоставляет инструменты для описания грамматики External DSL на Scala в формате близком к EBNF. Т.е. это «внутренний DSL» для создания «внешних DSL».

In Scala, parsers are implemented as monads — hence defining combinators for parsers are just monadic transformations implementing sequencing, alternation or any other composition operations.

В ряде предметных областей можно строить API в виде неких примитивных элементов (в данном случае парсеров) и способов комбинирования этих элементов определенным образом (комбинаторы). В данном случае в самом ядре языка есть все необходимое для построение внешних DSL.

Материалы: Metaprogramming / Reflection

A particularly interesting aspect of macros is that they are based on the same API used also for Scala’s runtime reflection, provided in package scala.reflect.api. This enables the sharing of generic code between macros and implementations that utilize runtime reflection.

Until 2.10, Scala has not had any reflection capabilities of its own. Instead, one could use part of the Java reflection API, namely that dealing with providing the ability to dynamically inspect classes and objects and access their members. However, many Scala-specific elements are unrecoverable under standalone Java reflection, which only exposes Java elements (no functions, no traits) and types (no existential, higher-kinded, path-dependent and abstract types). In addition, Java reflection is also unable to recover runtime type info of Java types that are generic at compile-time; a restriction that carried through to runtime reflection on generic types in Scala.

In Scala 2.10, a new reflection library was introduced not only to address the shortcomings of Java’s runtime reflection on Scala-specific and generic types, but to also add a more powerful toolkit of general reflective capabilities to Scala.… with full-featured runtime reflection for Scala types and generics…

Материалы: Metaprogramming / Macroses

A particularly interesting aspect of macros is that they are based on the same API used also for Scala’s runtime reflection, provided in package scala.reflect.api. This enables the sharing of generic code between macros and implementations that utilize runtime reflection.

Our flavor of macros is reminiscent of Lisp macros, adapted to incorporate type safety and rich syntax. Unlike infamous C/C++ preprocessor macros, Scala macros: 1) are written in full-fledged Scala, 2) work with expression trees, not with raw strings, 3) cannot change syntax of Scala. [here]

Macros are functions that are called by the compiler during compilation. Within these functions the programmer has access to compiler APIs. For example, it is possible to generate, analyze and typecheck code. You can learn more about macros from documentation. [here]

Def macros are shipped as an experimental feature of Scala since version 2.10.0. A subset of def macros, pending a thorough specification, is tentatively scheduled to become stable in one of the future versions of Scala.

Experimental feature — Also note that macros are considered an experimental and advanced feature, so in order to write macros you need to enable them. Do that either with import scala.language.experimental.macros on per-file basis or with -language:experimental.macros (providing a compiler switch) on per-compilation basis. Your users, however, don’t need to enable anything — macros look like normal methods and can be used as normal methods, without any compiler switches or additional configurations.

Материалы: Scalaz

Материалы: Netty

Netty — an asynchronious and event-driven network application framework for rapid development of maintanable high performance protocol servers and clients. Netty — это de fakto стандарт для использования java.net.*, NIO и NIO.2 (Akka и Finagle используют «под капотом» Netty, Zookeeper напрямую NIO/NIO.2). Хотя можно и напрямую реализовывать шаблоны асинхронной обработки сообщений Reactor / Proactor / Asynchronous Completion Token / Acceptor-Connector однако это сопряжено с большим количеством шаблонного кода и затенению функционала предметной области. Преимуществом Netty является как декларативность кода, так и то, что библиотека представляет собой конструктор протоколов (http, ftp, smtp, websockets, ...).

Материалы: Akka

Akka — de facto стандарт framework-а для многопоточных и распределенных архитектур на основе акторов для JVM. Начиная c версии Scala 2.10.0 Akka вытеснила «родную» реализация акторов.

Материалы: Finagle

Finagle — A Protocol-Agnostic extensible RPC System for the JVM, used to construct high-concurrency servers. Написанная и используемая в twitter.com. Основной принцип — «We must program locally, communicate globally». Часть Twitter-стека (вместе с Ostrich, Zipkin, Mesos, Iago, ZooKeeper, Scalding). Finagle включает в себя функции балансировки нагрузки, connection pooling, вызов с timeout-ом, мониторинг, сбор статистики.

Материалы: Zookeeper

Zookeeper — fail-safe централизованный сервис для управления конфигурационной информацией, именованием, распределенной синхронизации и других групповых сервисов, составная часть Twitter-стека. Может быть использован для созданий базовых структур данных (кластерных) — очередей, блокировок, барьеров. Подходит для таких распределенных алгоритмов как two-phase-commit, выборы лидера и других.

Материалы: Использование FP в финансовой отрасли

По ряду причин (возможность описания предметной области на языке комбинаторов) функциональные языки программирования любят использовать в финансовой отрасли, что создает спрос на «функциональщиков» в Нью-Йорке и Лондоне.

  • «Composing Contracts: An Adventure in Financial Engineering», Simon Peyton Jones +… — базовая статья от автора Haskell о представление финансовых контрактов на Haskell. «We introduce a combinator library that allows us to describe such contracts precisely, and a compositional denotational semantics that says what such contracts are worth. We sketch an implementation of our combinator library in Haskell. Interestingly, lazy evaluation plays a crucial role». «The finance industry has an enormous vocabulary of jargon for typical combinations of financial contracts (swaps, futures, caps, oors, swaptions, spreads, straddles, captions, European options, American options, ...the list goes on)». «Our combinators can be used to describe a contract, but we also want to process a contract. Notably, we want to be able to find the value of a contract. In Section 4 we describe how to give an abstract valuation semantics to our combinators. A fundamentally-important property of this semantics is that it is compositional; that is, the value of a compound contract is given by combining the values of its sub-contracts.»
  • «Commercial Uses: Going functional on exotic trades» — описание DSL используемого в Barclays для работы с финансовыми инструментами (Haskell). «The Functional Payout Framework (fpf) is a Haskell application that uses an embedded domain-specific functional language to represent and process exotic financial derivatives. Whereas scripting languages for pricing exotic derivatives are common in banking, fpf uses multiple interpretations to not only price such trades, but also to analyse the scripts to provide lifecycle support and more»
  • «Scala at EDF Trading. Implementing a Domain-Specific Language for Derivative Pricing with Scala.» — «DIESEL is a language for representing energy derivatives to facilitate Monte Carlo pricing and analytics. The DSL consists of a combinator parser libary and algebraic data types with case classes.»
  • «Compositional specification of commercial contracts»
  • «An Algebraic Specification of a Language for Describing Financial Products» — «We report on the use of formal methods and supporting tools during the development of a language applied in a banking environment. This language, called RISLA, is used to define the nature of the interest products offered by a bank. A RISLA description fixes the cash flows (amounts of money coming in or going out on particular dates) resulting from a product…. The language has been developed with the use of algebraic specifications, the role of which is discussed.»
  • «Domain-Specific Languages versus Object-Oriented Frameworks: A Financial Engineering Case Study» — «The use of a domain-specific language can help to develop readable and maintainable applications in that domain with little effort. Alternatively, the same aims can be achieved by setting up an object-oriented framework. For the domain of financial engineering, independently both an objectoriented framework and a domain-specific language have been developed. We use this opportunity to contrast these two, to highlight the differences and to discuss opportunities for mutual benefits.»
  • «Adventures in financial and software engineering»
  • «Financial Domain-Specific Language Listing — большая подборка API / DSL для работы с финансами

P.S. На любые вопросы с удовольствием ответим по
skype: GolovachCourses
email: GolovachCourses@gmail.com

Автор: IvanGolovach

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js