SlideShare une entreprise Scribd logo
1  sur  48
Télécharger pour lire hors ligne
Язык программирования Scalа
для создания успешных Интернет-
проектов
Успенский
Владимир
О нашем проекте
Старт — сентябрь 2011
Запуск — май 2012
Итого 9 месяцев
▶ Сразу лучший Интернет-банк в России
▶ Хорошие отзывы клиентов
▶ Бешенное развитие в течение года:
функционал, безопасность, интерфейс
и это не конец...
Общие слова о Scala
Один из альтернативных языков на JVM,
привносит функциональный подход
ООП и ФП дополняют друг друга
ООП чище чем в Java:
все значения — объекты,
все операции — вызов метода
Функциональный != Процедурный
Book
Итак, мы начинаем проект...
BookStore
sell
Author
Money accept
Придумаем модель предметной области:
Просто, правда?
has
Количество кода, обозримость
case class Money(amount: Long, currency: Currency)
case class Author(name: String)
case class Book(name: String, author: Author)
trait BookStore {
def buy(bookName: String, money: Money): Book
}
Чтобы иметь интерфейсы под рукой,
можно объявить всё в одном файле:
Всё ещё просто!
Количество кода, обозримость
WAT?
Вывод типов
Map<String, List<String>> booksAuthors =
new HashMap<String, List<String>>();
List<String> authors = new ArrayList(1);
authors.add("Herman Melville");
booksAuthors.put("Moby-Dick", authors);
for(Map.Entry<String, List<String>> bookAuthors :
booksAuthors.entrySet()) {
String book = bookAuthors.getKey();
String authors = bookAuthors.getValue();
...
}
Вывод типов
val booksAuthors = Map("Moby-Dick" ->
List("Herman Melville"))
for((book, authors) <- booksAuthors) {
...
}
Ничего лишнего!
Коллекции
val somethingToRead =
books.filter(isPhysics)
.groupBy(_.author).map({
case (author, books) =>
books.sortBy(rating(author)).head
}).headOption
Console.print(somethingToRead.firstPage)
Стандартные методы на все случаи жизни:
Коллекции
val somethingToRead =
books.filter(isPhysics)
.groupBy(_.author).map({
case (author, books) =>
books.sortBy(rating(author)).head
}).headOption
Console.print(somethingToRead.firstPage)
Стандартные методы на все случаи жизни:
Коллекции
val somethingToRead =
books.filter(isPhysics)
.groupBy(_.author).map({
case (author, books) =>
books.sortBy(rating(author)).head
}).headOption
Console.print(somethingToRead.map(_.firstPage)
.getOrElse("Nothing is there!"))
Стандартные методы на все случаи жизни:
JSON
case class Address(street: String, city: String)
case class Person(name: String, address: Address)
val json = parse("""{ "name": "joe",
"address": {
"street": "Boulevard",
"city": "Helsinki"
}
}""")
assert (json.extract[Person] ==
Person(joe, Address("Buolevard", "Helsinki"))
(Scala 2.10, Json4s)
XML
val xml = <root><tag attr="value">text</tag></root>
val xml = XML.loadString("""<root>
<tag attr="value">text</tag>
</root>""")
XPath
assert ((xml  "tag").text == "text")
assert ((xml  "tag"  "@attr").text == "value")
Pimp my library!
import ru.tcs.db.extensions._
val userId = resultSet.getId[User]("user_id")
// userId: Id[User]
val balance = resultSet.getMoney("balance")
// balance: MoneyAmount
Берём обычный java.sql.ResultSet
Retroactive extension для любого типа!
Абстракция
▶ Способность находить и описывать общее, чтобы
- экономить время, переиспользуя, или при правках
- и недопускать разного поведения и ошибок
▶ Обычно применяются: наследование,
параметризация, параметризация типа (generics)
▶ Замыкания и функции над функциями
позволяют параметризовать код другим кодом,
давая доступ к новому механизму абстракции
Функции высшего порядка
// где-то в определениии Iterable[T]...
def filter(predicate: T => Boolean):Iterable[T]
def map[A](transform: T => A): Iterable[A]
Операции с коллекциями так удобно использовать,
как раз потому, что стандартные функции можно
параметризировать своим поведеднием
Примеси/Mixins
class Animal
trait Philosophical {
def philosophize() {
Console.println(
"It ain't easy being " + toString)
}
}
class Frog extends Animal with Philosophical {
override def toString = "green"
}
new Frog().philosophize()
// It ain't easy being green
Помогают выносить
общий функцинал
без недостатков
множественного
наследования
Higher Kinds
trait Factory[T] {
def create(): T
}
Параметр типа первого порядка:
trait Functor[H[_]] {
def map[A,B](fn: A => B)(fa: H[A]): H[B]
}
Параметр типа высшего порядка:
Корректность и тотальность
Всё никогда не бывает хорошо
"A good programmer is someone who looks both ways
before crossing a one-way street." ~ Doug Linder
Тотальность — свойство программы, быть
определённой для всех входных параметров
Scala использует типизацию (type-safety) для проверки
корректности при компилляции, где это возможно
Маленький мотивирующий пример
Book book = bookShelf.get("Moby-Dick");
Reader reader = readersQueue.peek();
if(reader.favorite.equals(book.author)) {
reader.read(book);
}
Маленький мотивирующий пример
Book book = bookShelf.get("Moby-Dick");
Reader reader = readersQueue.peek();
if(reader.favorite.equals(book.author)) {
reader.read(book);
}
Значения может просто не быть!
Если значение необязательно,
лучше предусмотреть это в модели типов
Маленький мотивирующий пример
val book: Option[Book] = bookShelf.get("Moby-Dick")
val reader: Option[Reader] = readersQueue.peek
if(reader.favorite.equals(book.author)) {
reader.read(book)
}
Теперь программа просто не собралась
Разработчик узнал об ошибках сразу,
до передачи в тестирование или переноса в бой
Управление непредвиденным
При выполнении вычислений возможно:
Возможностью таких исходов можно управлять
с помощью типа возвращаемого значения.
Такие значения можно создавать и связывать.
Тип вместе с операциями называется Монадой.
▶ ничего не получить, — Option
▶ получить исключение, — Try
▶ занимать время, — Future
▶ работать с диском — IO
etc.
Более строгие ограничения на типы
▶ Параметр типа обязательно должен быть
Всегда List[T], но не List
▶ Higher Kinds
Не надо переходить к Object
▶ Вариантность
Не обязательно переходить к List[_]
Вариантность
case class Invariant[T]()
case class Covariant[+T]()
case class Contravariant[-T]()
val in: Invariant[Object] = Invariant[String]
val in: Invariant[String] = Invariant[Object]
val co: Covariant[Object] = Covariant[String]
val co: Covariant[String] = Covariant[Object]
val contra: Contravariant[Object] = Contravariant[String]
val contra: Contravariant[String] = Contravariant[Object]
Scala позволяет указать вариантность для параметров типа:
Immutability
▶ Возможность изменения выбирается явно:
▶ Коллекции по умолчанию immutable
val immutable = ...
var mutable = ...
List, Set, Map,
▶ Immutability — невозможность изменить объект
или ссылку после создания.
есть также mutable версии
Достоинства Immutability
▶ Меньше ошибок из-за переиспользования
переменных для разных целей
▶ Операции проще и однороднее:
нет особенностей, связанных с изменением
▶ Просто работать в многопоточной среде,
нет расходов на синхронизацию,
возникающих из-за concurrent mutable state
Адаптация к изменениям
Когда, проект запущен
Клиенты начали пользоваться и писать отзывы
Бизнес хочет зарабатывать на продукте
А несколько раз в год, запускаются крупные проекты
Вам нужно быть очень гибкими!
Адаптация к изменениям
Если приходится что-то серьёзно менять,
когда меньше кода, лучше видны последствия,
а, благодаря типам, изменения ещё и проверяются
компиллятором — меньше вероятность сломать.
Выше уровень абстракциии и однородный код —
нет необходимости влезать в низкоуровневые детали
реализации, можно охватить больше случаев
меньшими усилиями.
Группировка запросов и
параллельная обработка
Задача:
«Сделать возможность параллельной
обработки запросов, когда все запросы
обработаны, нужно собрать результаты»
Группировка запросов и
параллельная обработка
ThreadPool?
CyclicBarrier?
CountDownLatch?
Задача:
«Сделать возможность параллельной
обработки запросов, когда все запросы
обработаны, нужно собрать результаты»
Похоже,
это сложная
задача!
Группировка запросов и
параллельная обработка
val responses =
requests.par.map(processRequest).seq
Задача:
«Сделать возможность параллельной
обработки запросов, когда все запросы
обработаны, нужно собрать результаты»
Нужно собирать информацию
со множества бекендов
Продукты
CRM
Операционные
данные
Предложения
Нужно собирать информацию
со множества бекендов
Продукты
CRM
Операционные
данные
Предложения
Очень долго!
Нужно собирать информацию
со множества бекендов
Продукты
CRM
Операционные
данные
Предложения
Отлично!
Нужно собирать информацию
со множества бекендов
Продукты
CRM
Операционные
данные
Предложения
Отлично!
ThreadPool?
CyclicBarrier?
CountDownLatch?
Похоже это
сложная задача!
Мне нужно
несколько дней!
Нужно собирать информацию
со множества бекендов
Распараллелить долгие вызовы для одного,
не самого простого, случая удалось за 30 минут
val (operations, offers) = Await.result(
future {
operationsRepo.readOperations(userId)
} zip future {
offersRepo.readOffers(userId)
}, 60 seconds)
Расширение команды
Новые сотрудники втягиваются за пару недель:
- всё не так сильно отличается,
- меньше кода и неявных контрактов
почти за два года команда
люди менялись в процессе
выросла почти с нуля,
Недостатки
▶ Есть неочевидные местаx
Надо читать документацию и писать тесты
▶ Длинные цепочки вызовов тяжело отлаживать,
что заставляет выносить переменные
и разделять код на небольшие методы
Недостатки
▶ Есть неочевидные местаx
Надо читать документацию и писать тесты
▶ Длинные цепочки вызовов тяжело отлаживать,
что заставляет выносить переменные
и разделять код на небольшие методы
Что?
тесты и небольшие
методы? да ладно!
Недостатки
▶ Есть неочевидные местаx
Надо читать документацию и писать тесты
▶ Длинные цепочки вызовов тяжело отлаживать,
что заставляет выносить переменные
и разделять код на небольшие методы
▶ Ограниченная поддержка генерации кода в IDE,
впрочем генерировать код не очень актуально
▶ На рынке не так много специалистов по Scala,
приходится искать заинтересованных ребят,
которые хотят делать что-то новое
▶ Та же платформа
▶ Те же среды разработки
▶ Та же релизная политика
▶ Доступен код на Java, все библиотеки JVM,
старое доброе ООП и императивность
мало того, с этого стоит начать
Перейти просто
администраторам всё знакомо
не нужны новые лицензии
тестировщики и администраторы в покое
если что, всегда есть к чему вернуться,
Итог
▶ Проще код
▶ Меньше ошибок
▶ Меньше времени на типовые вещи
▶ Простая работа с потоками
▶ Просто поддерживать рост
▶ Легко попробовать и перейти
Итог
Scala — отличный инструмент
для успешного проекта!
scala-lang.org/downloads
scala> questions
e-mail: v.uspenskiy@tcsbank.ru
skype: tcs_uspenskiy

Contenu connexe

Tendances

Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
ScalaNsk
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
Dmitry Stropalov
 
Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"
Fwdays
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collections
MERA_school
 
3. java lecture classes
3. java lecture classes3. java lecture classes
3. java lecture classes
MERA_school
 

Tendances (14)

Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
Курсы актерского мастерства
Курсы актерского мастерстваКурсы актерского мастерства
Курсы актерского мастерства
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
 
Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
 
Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"Артем Яворский "@babel/core": "7.x"
Артем Яворский "@babel/core": "7.x"
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collections
 
3. java lecture classes
3. java lecture classes3. java lecture classes
3. java lecture classes
 
PHP7 - что ожидать?
PHP7 - что ожидать?PHP7 - что ожидать?
PHP7 - что ожидать?
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
Объекты в ECMAScript | Odessa Frontend Meetup #16
Объекты в ECMAScript | Odessa Frontend Meetup #16Объекты в ECMAScript | Odessa Frontend Meetup #16
Объекты в ECMAScript | Odessa Frontend Meetup #16
 
Intro to Swift techitout
Intro to Swift techitoutIntro to Swift techitout
Intro to Swift techitout
 
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
Making of external DSL for Django ORM - Павел Петлинский, Rambler&CoMaking of external DSL for Django ORM - Павел Петлинский, Rambler&Co
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
 
Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
 

En vedette

DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...
DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...
DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...
it-people
 
Введение в Akka
Введение в AkkaВведение в Akka
Введение в Akka
Zheka Kozlov
 
Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)
Alexander Podkhalyuzin
 

En vedette (20)

Playing with Scala
Playing with ScalaPlaying with Scala
Playing with Scala
 
DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...
DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...
DUMP-2015: «Распределенная обработка миллионов документов на Scala и Akka» Ст...
 
[Start] Playing
[Start] Playing[Start] Playing
[Start] Playing
 
Play Template Engine Based On Scala
Play Template Engine Based On ScalaPlay Template Engine Based On Scala
Play Template Engine Based On Scala
 
HTML5 with Play Scala, CoffeeScript and Jade - Devoxx 2011
HTML5 with Play Scala, CoffeeScript and Jade - Devoxx 2011HTML5 with Play Scala, CoffeeScript and Jade - Devoxx 2011
HTML5 with Play Scala, CoffeeScript and Jade - Devoxx 2011
 
Designing Reactive Systems with Akka
Designing Reactive Systems with AkkaDesigning Reactive Systems with Akka
Designing Reactive Systems with Akka
 
Your First Scala Web Application using Play 2.1
Your First Scala Web Application using Play 2.1Your First Scala Web Application using Play 2.1
Your First Scala Web Application using Play 2.1
 
Play framework And Google Cloud Platform GCP.
Play framework And Google Cloud Platform GCP.Play framework And Google Cloud Platform GCP.
Play framework And Google Cloud Platform GCP.
 
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVM
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVMVoxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVM
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVM
 
Введение в Akka
Введение в AkkaВведение в Akka
Введение в Akka
 
Reactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysReactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDays
 
Scala #2
Scala #2Scala #2
Scala #2
 
Scala #4
Scala #4Scala #4
Scala #4
 
Scala #5
Scala #5Scala #5
Scala #5
 
Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)
 
Backend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузераBackend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузера
 
Erlang
ErlangErlang
Erlang
 
Scala plugin for IntelliJ IDEA
Scala plugin for IntelliJ IDEAScala plugin for IntelliJ IDEA
Scala plugin for IntelliJ IDEA
 
Scala training
Scala trainingScala training
Scala training
 
Lec 2
Lec 2Lec 2
Lec 2
 

Similaire à Язык программирования Scala / Владимир Успенский (TCS Bank)

Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Фофанов Илья - Лучшие практики проектирования и реализации API на C#Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Elias Fofanov
 
ООП в Scala: выход из застоя (ScalaNsk meeting #5, 22.11.2013)
ООП в Scala: выход из застоя (ScalaNsk meeting #5, 22.11.2013)ООП в Scala: выход из застоя (ScalaNsk meeting #5, 22.11.2013)
ООП в Scala: выход из застоя (ScalaNsk meeting #5, 22.11.2013)
ScalaNsk
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Magneta AI
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
metaform
 

Similaire à Язык программирования Scala / Владимир Успенский (TCS Bank) (20)

Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Smalltalk
SmalltalkSmalltalk
Smalltalk
 
Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0
 
Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Фофанов Илья - Лучшие практики проектирования и реализации API на C#Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Фофанов Илья - Лучшие практики проектирования и реализации API на C#
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 
ООП в Scala: выход из застоя (ScalaNsk meeting #5, 22.11.2013)
ООП в Scala: выход из застоя (ScalaNsk meeting #5, 22.11.2013)ООП в Scala: выход из застоя (ScalaNsk meeting #5, 22.11.2013)
ООП в Scala: выход из застоя (ScalaNsk meeting #5, 22.11.2013)
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
TDD или как я стараюсь писать код
TDD или как я стараюсь писать кодTDD или как я стараюсь писать код
TDD или как я стараюсь писать код
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт Guava
 
JavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработкиJavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработки
 
Underscore js
Underscore jsUnderscore js
Underscore js
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Not the Rails Way
Not the Rails WayNot the Rails Way
Not the Rails Way
 
GraphQL API: Patterns | Андрей Чиж | Zlit Tech
GraphQL API: Patterns | Андрей Чиж | Zlit TechGraphQL API: Patterns | Андрей Чиж | Zlit Tech
GraphQL API: Patterns | Андрей Чиж | Zlit Tech
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
 
Рекурсия. Поиск
Рекурсия. ПоискРекурсия. Поиск
Рекурсия. Поиск
 

Plus de Ontico

Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 

Plus de Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Язык программирования Scala / Владимир Успенский (TCS Bank)

  • 1. Язык программирования Scalа для создания успешных Интернет- проектов Успенский Владимир
  • 2. О нашем проекте Старт — сентябрь 2011 Запуск — май 2012 Итого 9 месяцев ▶ Сразу лучший Интернет-банк в России ▶ Хорошие отзывы клиентов ▶ Бешенное развитие в течение года: функционал, безопасность, интерфейс и это не конец...
  • 3.
  • 4.
  • 5. Общие слова о Scala Один из альтернативных языков на JVM, привносит функциональный подход ООП и ФП дополняют друг друга ООП чище чем в Java: все значения — объекты, все операции — вызов метода Функциональный != Процедурный
  • 6. Book Итак, мы начинаем проект... BookStore sell Author Money accept Придумаем модель предметной области: Просто, правда? has
  • 7. Количество кода, обозримость case class Money(amount: Long, currency: Currency) case class Author(name: String) case class Book(name: String, author: Author) trait BookStore { def buy(bookName: String, money: Money): Book } Чтобы иметь интерфейсы под рукой, можно объявить всё в одном файле: Всё ещё просто!
  • 9. Вывод типов Map<String, List<String>> booksAuthors = new HashMap<String, List<String>>(); List<String> authors = new ArrayList(1); authors.add("Herman Melville"); booksAuthors.put("Moby-Dick", authors); for(Map.Entry<String, List<String>> bookAuthors : booksAuthors.entrySet()) { String book = bookAuthors.getKey(); String authors = bookAuthors.getValue(); ... }
  • 10. Вывод типов val booksAuthors = Map("Moby-Dick" -> List("Herman Melville")) for((book, authors) <- booksAuthors) { ... } Ничего лишнего!
  • 11. Коллекции val somethingToRead = books.filter(isPhysics) .groupBy(_.author).map({ case (author, books) => books.sortBy(rating(author)).head }).headOption Console.print(somethingToRead.firstPage) Стандартные методы на все случаи жизни:
  • 12. Коллекции val somethingToRead = books.filter(isPhysics) .groupBy(_.author).map({ case (author, books) => books.sortBy(rating(author)).head }).headOption Console.print(somethingToRead.firstPage) Стандартные методы на все случаи жизни:
  • 13. Коллекции val somethingToRead = books.filter(isPhysics) .groupBy(_.author).map({ case (author, books) => books.sortBy(rating(author)).head }).headOption Console.print(somethingToRead.map(_.firstPage) .getOrElse("Nothing is there!")) Стандартные методы на все случаи жизни:
  • 14. JSON case class Address(street: String, city: String) case class Person(name: String, address: Address) val json = parse("""{ "name": "joe", "address": { "street": "Boulevard", "city": "Helsinki" } }""") assert (json.extract[Person] == Person(joe, Address("Buolevard", "Helsinki")) (Scala 2.10, Json4s)
  • 15. XML val xml = <root><tag attr="value">text</tag></root> val xml = XML.loadString("""<root> <tag attr="value">text</tag> </root>""") XPath assert ((xml "tag").text == "text") assert ((xml "tag" "@attr").text == "value")
  • 16. Pimp my library! import ru.tcs.db.extensions._ val userId = resultSet.getId[User]("user_id") // userId: Id[User] val balance = resultSet.getMoney("balance") // balance: MoneyAmount Берём обычный java.sql.ResultSet Retroactive extension для любого типа!
  • 17. Абстракция ▶ Способность находить и описывать общее, чтобы - экономить время, переиспользуя, или при правках - и недопускать разного поведения и ошибок ▶ Обычно применяются: наследование, параметризация, параметризация типа (generics) ▶ Замыкания и функции над функциями позволяют параметризовать код другим кодом, давая доступ к новому механизму абстракции
  • 18. Функции высшего порядка // где-то в определениии Iterable[T]... def filter(predicate: T => Boolean):Iterable[T] def map[A](transform: T => A): Iterable[A] Операции с коллекциями так удобно использовать, как раз потому, что стандартные функции можно параметризировать своим поведеднием
  • 19. Примеси/Mixins class Animal trait Philosophical { def philosophize() { Console.println( "It ain't easy being " + toString) } } class Frog extends Animal with Philosophical { override def toString = "green" } new Frog().philosophize() // It ain't easy being green Помогают выносить общий функцинал без недостатков множественного наследования
  • 20. Higher Kinds trait Factory[T] { def create(): T } Параметр типа первого порядка: trait Functor[H[_]] { def map[A,B](fn: A => B)(fa: H[A]): H[B] } Параметр типа высшего порядка:
  • 21. Корректность и тотальность Всё никогда не бывает хорошо "A good programmer is someone who looks both ways before crossing a one-way street." ~ Doug Linder Тотальность — свойство программы, быть определённой для всех входных параметров Scala использует типизацию (type-safety) для проверки корректности при компилляции, где это возможно
  • 22. Маленький мотивирующий пример Book book = bookShelf.get("Moby-Dick"); Reader reader = readersQueue.peek(); if(reader.favorite.equals(book.author)) { reader.read(book); }
  • 23. Маленький мотивирующий пример Book book = bookShelf.get("Moby-Dick"); Reader reader = readersQueue.peek(); if(reader.favorite.equals(book.author)) { reader.read(book); } Значения может просто не быть! Если значение необязательно, лучше предусмотреть это в модели типов
  • 24. Маленький мотивирующий пример val book: Option[Book] = bookShelf.get("Moby-Dick") val reader: Option[Reader] = readersQueue.peek if(reader.favorite.equals(book.author)) { reader.read(book) } Теперь программа просто не собралась Разработчик узнал об ошибках сразу, до передачи в тестирование или переноса в бой
  • 25. Управление непредвиденным При выполнении вычислений возможно: Возможностью таких исходов можно управлять с помощью типа возвращаемого значения. Такие значения можно создавать и связывать. Тип вместе с операциями называется Монадой. ▶ ничего не получить, — Option ▶ получить исключение, — Try ▶ занимать время, — Future ▶ работать с диском — IO etc.
  • 26. Более строгие ограничения на типы ▶ Параметр типа обязательно должен быть Всегда List[T], но не List ▶ Higher Kinds Не надо переходить к Object ▶ Вариантность Не обязательно переходить к List[_]
  • 27. Вариантность case class Invariant[T]() case class Covariant[+T]() case class Contravariant[-T]() val in: Invariant[Object] = Invariant[String] val in: Invariant[String] = Invariant[Object] val co: Covariant[Object] = Covariant[String] val co: Covariant[String] = Covariant[Object] val contra: Contravariant[Object] = Contravariant[String] val contra: Contravariant[String] = Contravariant[Object] Scala позволяет указать вариантность для параметров типа:
  • 28. Immutability ▶ Возможность изменения выбирается явно: ▶ Коллекции по умолчанию immutable val immutable = ... var mutable = ... List, Set, Map, ▶ Immutability — невозможность изменить объект или ссылку после создания. есть также mutable версии
  • 29. Достоинства Immutability ▶ Меньше ошибок из-за переиспользования переменных для разных целей ▶ Операции проще и однороднее: нет особенностей, связанных с изменением ▶ Просто работать в многопоточной среде, нет расходов на синхронизацию, возникающих из-за concurrent mutable state
  • 30. Адаптация к изменениям Когда, проект запущен Клиенты начали пользоваться и писать отзывы Бизнес хочет зарабатывать на продукте А несколько раз в год, запускаются крупные проекты Вам нужно быть очень гибкими!
  • 31. Адаптация к изменениям Если приходится что-то серьёзно менять, когда меньше кода, лучше видны последствия, а, благодаря типам, изменения ещё и проверяются компиллятором — меньше вероятность сломать. Выше уровень абстракциии и однородный код — нет необходимости влезать в низкоуровневые детали реализации, можно охватить больше случаев меньшими усилиями.
  • 32. Группировка запросов и параллельная обработка Задача: «Сделать возможность параллельной обработки запросов, когда все запросы обработаны, нужно собрать результаты»
  • 33. Группировка запросов и параллельная обработка ThreadPool? CyclicBarrier? CountDownLatch? Задача: «Сделать возможность параллельной обработки запросов, когда все запросы обработаны, нужно собрать результаты» Похоже, это сложная задача!
  • 34. Группировка запросов и параллельная обработка val responses = requests.par.map(processRequest).seq Задача: «Сделать возможность параллельной обработки запросов, когда все запросы обработаны, нужно собрать результаты»
  • 35. Нужно собирать информацию со множества бекендов Продукты CRM Операционные данные Предложения
  • 36. Нужно собирать информацию со множества бекендов Продукты CRM Операционные данные Предложения Очень долго!
  • 37. Нужно собирать информацию со множества бекендов Продукты CRM Операционные данные Предложения Отлично!
  • 38. Нужно собирать информацию со множества бекендов Продукты CRM Операционные данные Предложения Отлично! ThreadPool? CyclicBarrier? CountDownLatch? Похоже это сложная задача! Мне нужно несколько дней!
  • 39. Нужно собирать информацию со множества бекендов Распараллелить долгие вызовы для одного, не самого простого, случая удалось за 30 минут val (operations, offers) = Await.result( future { operationsRepo.readOperations(userId) } zip future { offersRepo.readOffers(userId) }, 60 seconds)
  • 40. Расширение команды Новые сотрудники втягиваются за пару недель: - всё не так сильно отличается, - меньше кода и неявных контрактов почти за два года команда люди менялись в процессе выросла почти с нуля,
  • 41. Недостатки ▶ Есть неочевидные местаx Надо читать документацию и писать тесты ▶ Длинные цепочки вызовов тяжело отлаживать, что заставляет выносить переменные и разделять код на небольшие методы
  • 42. Недостатки ▶ Есть неочевидные местаx Надо читать документацию и писать тесты ▶ Длинные цепочки вызовов тяжело отлаживать, что заставляет выносить переменные и разделять код на небольшие методы Что? тесты и небольшие методы? да ладно!
  • 43. Недостатки ▶ Есть неочевидные местаx Надо читать документацию и писать тесты ▶ Длинные цепочки вызовов тяжело отлаживать, что заставляет выносить переменные и разделять код на небольшие методы ▶ Ограниченная поддержка генерации кода в IDE, впрочем генерировать код не очень актуально ▶ На рынке не так много специалистов по Scala, приходится искать заинтересованных ребят, которые хотят делать что-то новое
  • 44. ▶ Та же платформа ▶ Те же среды разработки ▶ Та же релизная политика ▶ Доступен код на Java, все библиотеки JVM, старое доброе ООП и императивность мало того, с этого стоит начать Перейти просто администраторам всё знакомо не нужны новые лицензии тестировщики и администраторы в покое если что, всегда есть к чему вернуться,
  • 45. Итог ▶ Проще код ▶ Меньше ошибок ▶ Меньше времени на типовые вещи ▶ Простая работа с потоками ▶ Просто поддерживать рост ▶ Легко попробовать и перейти
  • 46. Итог Scala — отличный инструмент для успешного проекта! scala-lang.org/downloads