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

Добрый день.
Меня зовут Головач Иван, я практикующий Java Tech Lead, который перешел на Scala (Senior Scala Developer) с опытом в программировании 10+ лет.
Я подготовил и прочитал как обычные курсы по программированию (Java Core + Junior Java Developer), так и спецкурсы (Multicore Programming for JVM (раз и два)).

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

Программа курса
Материалы: “Разное”
Материалы: Object Oriented Programming
Материалы: Functional Programming
Материалы: Dependent Types
Материалы: Higher kinded types
Материалы: Parser combinators
Материалы: Metaprogramming / Reflection + Macros
Материалы: Metaprogramming / Macroses
Материалы: Scalaz
Материалы: Shapeless
Материалы: Algebird
Материалы: Netty
Материалы: Akka
Материалы: Finagle
Материалы: Zookeeper
Материалы: Использование FP в финансовой отрасли

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

  • Модуль #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

    Данные статьи освещают и проясняют основные характеристики языка.
    • “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, ...)
    • “Fighting Bit Rot with Types”, Odersky + ... — описан рефакторинг коллекций Scala для версии 2.8 с хорошим погружением в higher-kind types, implicit parameters и implicit conversions
    • “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

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

    Охват материала на небольшую книгу, но не книги. От “классиков”. Да, сама Coursera написана на Scala.

    Книги

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

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

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

    Материалы: Dependent Types

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

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

    1. Позиция Scala (практически)В Scala включен пакет (scala.util.parsing), который предоставляет инструменты для описания грамматики External DSL на Scala в формате близком к EBNF. Т.е. это “внутренний DSL” для создания “внешних DSL”. 2. С точки зрения формальных языков.Грамматика — ???Алгоритм — ??? 3. Позиция Scala (теоретически)In Scala, parsers are implemented as monads — hence defining combinators for parsers are just monadic transformations implementing sequencing, alternation or any other composition operations. 4. Общие архитектурные идеи??? В ряде предметных областей можно строить 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. [here] 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.Def macros — ???Quasiquotes — ???Macro bundles — Macro bundles are a feature of Scala 2.11.x and Scala 2.12.x. Macro bundles are not supported in Scala 2.10.x.Implicit Macros — ???Extractor Macros — ???Macro Annotations — ?????? — ???Macro Paradise — Macro paradise is a plugin for several versions of Scala compilers. It is designed to reliably work with production releases of scalac, making latest macro developments available way before they end up in future versions Scala.

    Материалы: Scalaz

    Материалы: Shapeless

    Материалы: Algebird

    Материалы: 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 в финансовой отрасли

    По ряду причин (одна из них — возможность описания предметной области на языке комбинаторов) функциональные языки программирования (Haskell, ML, Scala, F#, ...) любят использовать в финансовой отрасли (опционы, деривативы, ...), что создает спрос на “функциональщиков” в Нью-Йорке и Лондоне. ============================= Статьи по Scala: Generics, Generics of Higher Kind, AnnatationsСтатьи по Scala: Arrays, Collections, StreamsСтатьи по Scala/FP: Parser CombinatorsСтатьи по Scala: ReflectionСтатьи по Scala/FP: Макросы Курсы/подборки по ScalaКниги по ScalaИсточники информации по type-acrobatic библиотекамЭпилог Collections Idioms and Tricks:Liketrait Seq[+Elem] extends ... with SeqLike[Elem, Seq[Elem]] { ... }www.scala-lang.org/...​9-10-01, 13:54/arrays.pdfWrapped/OpsArray, WrappedArray, ArrayOpsString, WrappedString, StringOps???the generalization of overloading and implicit resolution allows one to prioritize some implicits over others

    Статьи по Scala: Generics, Generics of Higher Kind, Annotations

    Генерики в Scala заметно сложнее, чем генерики в Java/C# так как ???. В виду того, что 1. большинство программистов переходит на Scala из Java 2. проще объяснять особенности Scala отталкиваясь от понимания реализации в Java3. есть возможность совмещать в рамках одного проекта код и на Java и на Scalaпредлагается вначале детально рассмотреть организацию генериков в Java. Java generics Scala generics Аннотации в Java 8 заметно эволюционировали и позволяют теперь ??? Java annotations Задачу изучения Scala аннотаций можно разбить на несколько пунктов:1. синтаксис аннотаций в Scala2. predefined аннотации: scala.annotation.target (@field, @getter, @setter, @beanGetter, @beanSetter, @param, ,,,), ???3. Java/Scala interop: как скала аннотации реализованы в class-файлах, как Scala-аннотации видит Java-код, как Java-аннотации видит Scala-код There are two kinds of annotations in Scala: symbol and type annotations. Symbol annotations are attached to declarations or definitions, i.e. to classes, methods, fields, type members, local values, parameters or type parameters.Type annotations are attached to a type (the corresponding type is said to be “annotated”). Note that annotations on expressions (using the ascription syntax) are represented internally as annotations on the expression’s inferred type. Scala annotations
    • “Internals of Scala Annotations” Lukas Rytz
      — This document desribes the internals of annotations in the Scala compiler. It explains how symbol and type annotations are represented at different phases of the compiler, how annotations are saved to bytecode and how compatibility with java annotations is achieved.
    • “The Scala Language Specification Version 2.9”, Chapter 11 “User-Defined Annotations” — lists all pre-defined annotations and explains their behavior. Java Platform Annotations = @transient, @volatile, @SerialVersionUID, @throws. Java Beans Annotations = @scala.beans.BeanProperty, @scala.beans.BooleanBeanProperty. Deprecation Annotations = @deprecated, @deprecatedName. Scala Compiler Annotations = @unchecked, @uncheckedStable, @specialized.
    • “???” ??? — ???
    • “???” ??? — ???
    • “???” ??? — ???

    Статьи по Scala: Arrays, Collections, Streams

    В реализации массивов до версии 2.7 включительно было обнаружено несколько слабых мест и начиная с 2.8 они подверглись пересмотру. OLD Arrays (before Scala 2.7) NEW Arrays (Scala 2.8+)
    • “Scala 2.8 Arrays” Odersky — This document describes the new scheme of handling arrays in Scala 2.8. Instead of boxing/unboxing and other compiler magic the scheme relies on implicit conversions and manifests to integrate arrays into the Scala 2.8 collection library.
    • http://?? — ???
    • http://?? — ???
    • http://?? — ???
    • http://?? — ???
    Collections Streams На любые интересующие Вас вопросы я могу ответить тут или по следующим контактамskype: GolovachCoursesemail: [email protected] P.S. Могу поделить подборкой из следующих книг (выкладывать в паблик не буду, пожалуйста, свяжитесь по контактам):“Functional Programming in Scala”“Functional Programming Patterns in Scala and Clojure”“Programming in Scala. 2ed”“Programming Scala. Scalability, Functional Programming, Objects”“Programming Scala. Tackle Multi-Core Complexity on the Java Virtual Machine”“Scala Cookbook: Recipes for Object-Oriented and Functional Programming”“Scala for Java Developers”“Scala for the Impatient”“Scala in Action”“Scala in Depth”
👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Иван, а курсы по Java еще актуальны?
На сайте как-то не нашeл инфо по цене.
Есть ли дистанционный вариант?

_

Это Харьков или может быть Киев? если Харьков, как часто будут идти лекции можно узнать? (раз в неделю на выходных или другой график?)

Это будут вэбинары, место не важно.
Можно смотреть онлайн, можно получить доступ в записи с задержкой 1-24 часа (как админ выложит). Мы пишем все вебинары.

Иван, я всегда воспринимала Вас как адепта Джавы.
Почему Скала?
ИМХО, рынок Джавы шире. Логичнее работать на нем.

Ну причин несколько
1. Я скорее адепт JVM (как оказалось), а Scala (по мнению Одерского) более грамотный способ эксплуатации виртуальной машины. А Одерский — для меня сверх-авторитет. Текущий javac — его рук дело, он вкручивая generics в Java 5 «познал JVM».
2. Блох как-то сказал, что выбор языка — это как выбор бара. Важно не только кол-во и стоимость выпивки, но и посетители. Вот в Scala, как и в FP в целом, более интересное комьюнити. Более академическое.
3. Хочется качать мозги (учить сложное/новое), выбора не так много — или уходить в BigData / Machine Learning (mahout.apache.org = K-Means, Fuzzy K-Means clustering, Latent Dirichlet Allocation, Random forest classifier, ...) или в FP.

а вы не думали о онлайн курсах? курсера например, с какой то хитрой монетизацией

Как раз сейчас думаю.
1. Нужно без поддержки преподавателем только, что бы не стать привязанным к курсу.
2. Так же лучше продаются вводные курсы, просто на порядок больше рынок.

А может курсы для профессионалов надо перепозиционировать?
Деньги ведь у людей есть и на конференции они ездят. Т.е. спрос есть.

Не пробовали сделать акцент на «экономии времени» или «более высокой ЗП». Или может быть профессионалы хотят более интересную подачу?

Сужу по себе. Я бы с удовольствием изучал Scala по примерам и практическим заданиям. От самых простых к очень сложным. Ну и минимум лекционного материала. На пару экранов максимум.

Ну, а после того, как изучил бы Scala, захотел бы стать «крутым Scala-разработчиком». Тут нужен еще один набор задач, но ориентирванный на то, чтобы прошедший его почувствовал себя true.

Головач Иван, прочитаю курс по чему хочешь за ваши деньги.

Как бы, да. Не понимаю, что в этом особенного.
IBM/SAP/Oracle: атоматизирую любой бизнес за ваши деньги.
Продавец бытовой химии: продам любой шампунь за ваши деньги.
Макдональдс: испеку любой бургер за ваши деньги.

IBM/SAP/Oracle: атоматизирую любой бизнес за ваши деньги.
У этих есть некоторая проверенная временем квалификация в автоматизации, твоя по скале — крайне сомнительна.

Ну в оглавлении курса по мультисредингу есть все самое нужное и интересное, думаю у нас большинство синьеров не знают все темы из этого курса. Если подход у человека такой же то должно быть и по скале норм, хотя я бы в первую группу может и не пошел бы, подождал бы пока обкатается база/методичка да и вообще сам курс.

Если подход у человека такой же то должно быть и по скале норм
Норм это что? Засунуть «нужное и интересное» в оглавление курса?

@ Golovach хотя бы аккаунт на гитхабе есть что бы аналитику по ФП кидать ?

Собственно я зарабатываю продавая курс по скале.
Кто хочет — приходите послушать.
16 лекций по скале на русском.
Как бы не понимаю смысл публикации аналитики.

зарабатываю продавая курс по скале
стесняюсь спросить сколько реальных проектов вы сделали (на Scala)

я бы тоже хотел услышать ответ на этот вопрос

Чтобы продавать курсы по Scala, не обязательно сделать хотя бы 1 проект на скале

ну если бы там кто то типа Жени Бурмако читал — я бы понял
а так какой то чувак не с комунити совсем вещает свое посконное понимание скалы. Зачем мне за это деньги платить?
Я не говорю про Мартина с БЕСПЛАТНЫМ курсом

Мой курс не совпадает по содержанию с Одерским. Я с ним и не соревнуюсь.

Да, я тоже так считаю. Я и не утверждаю, что у меня есть громадный опыт в скала. Я 10 лет был на Java, прошел с j2me до j2ee. И теперь рассказываю — что джавист с опытом может увидеть в скала, и рассказываю с позиций джависта.

И теперь рассказываю — что джавист с опытом может увидеть в скала
джавіст з досвідом і без ваших курсів побачить в скала все те, що йому потрібно буде

Не вопрос.
Опытный джавист все может конечно же сам.
Я же не принуждаю кого-то что-то покупать.
Я бы, скажем, заплатил за курс «Что джавист может взять у Clojure». Я могу и сам исследовать, но вычитывание литературы, поиск примеров, ... требуют времени. Дальше только вопрос
— ценности материала
— стоимости времени
Но тут каждый оценивает сам.

Я в начале думал брать по 395$, но потом решил, что разумнее продавать каждый модуль отдельно по 99$. И покупать проще, можно конкретную часть, и мне на целый 1$ больше.

джавист с опытом может увидеть в скала
это немного не коррелирует с
который перешел на Scala (Senior Scala Developer)
Чтобы продавать курсы по Scala, не обязательно сделать хотя бы 1 проект на скале
Не обязательно, но остается вопрос качества и адекватности восприятия ситуации.

Підписатись на коментарі