У вас древний проект? Все зовут его «Legacy», а вас «неудачник»? Возможно они даже смеются над вами.
Давайте взглянем на ситуацию с другого ракурса. Все (все, Карл!) успешные проекты рано или поздно превращаются в Legacy-проекты.
Я затрону тему Legacy не просто как явление, а как возможность быть постоянно в тренде, прослыть супер-спецом (даже если ты знаешь всего два фреймворка), сделать карьеру, как делать, то что ты хочешь, а не то что тебя просят. Ладно, ладно, я наврал про два фреймворка, но все остальное чистая правда. Я покажу, что вы можете творить, имея правильный подход к Legacy коду.
Суть в том, что Legacy — это не грустно/уныло/немодно, это просто/клево/весело, если с умом подойти к задаче!
Объекты в ECMAScript | Odessa Frontend Meetup #16OdessaFrontend
Обычно мы задаем объекты литерально, через пару фигурных скобок. С их помощью мы можем моделировать окружающую нас действительность и описывать её в коде. А чем лучше мы знаем этот инструмент, тем более удивительные вещи мы можем творить с его помощью. Барабанов Дмитрий рассматривает объект с точки зрения спецификации EcmaScript. Это дает новую информацию к размышлению: а почему те или иные вещи работают именно таким образом в JavaScript?
Scala-библиотека Slick прекрасно зарекомендовала себя как развитый и удобный инструмент работы с базами данных. Поддерживаются и простейшие текстовые SQL-запросы, и строго типизированные join’ы нескольких таблиц. Для построения запросов Slick предоставляет DSL, код на котором выглядит как обработка коллекций. Причем простые подзапросы могут использоваться для конструирования более сложных.
Slick имеет весьма любопытную внутреннюю архитектуру, которая делает возможным не только продвинутое использование, но и расширение библиотеки несколькими способами, о которых и пойдет речь в докладе.
(see also video: https://youtu.be/9n1zzwOGado)
A fast intro to Scala and Play, to prepare the audience for a live demo of a Play Application using Futures to get weather data from Yahoo in a non blocking way, then display to the user the results.
The code is available here https://github.com/tabdulradi/weather
「PlayFramework関西ビギナーズ in OsakanSpace 第1回」
http://atnd.org/events/33666
Play frameworkの概要と今後についてゆるく説明して、
Playとそのコミュニティを雰囲気を知っていただこうという趣旨で発表しました。
参加された方の半数がPHPユーザだったので、冒頭でPHPユーザの方向けの説明を特別に入れたりして工夫しています。
HTML5 with Play Scala, CoffeeScript and Jade - Devoxx 2011Matt Raible
HTML5 Development with Play Scala, CoffeeScript and Jade Presentation from Devoxx 2011. Discusses these technologies, as well as my story of using them to develop an HTML5 Fitness Tracking application.
http://www.devoxx.com/display/DV11/HTML5+with+Play+Scala%2C+CoffeeScript+and+Jade
The latest buzzword in the web service community is “reactive.” We dig beneath the surface of this word and show how you can use Scala and Akka to build systems that are responsive, resilient, elastic, and message-driven.
This document provides an overview of building a Scala web application using the Play! framework. It begins with introductions to Scala and the Play! framework. It then covers topics like request handling, views, forms, database integration, the build system, internationalization, and testing. Exercises are provided to demonstrate creating routes, controllers, actions, views, forms, database models and more. The presenter is available to answer questions after the session and provides information on open positions at their company Lucid Software.
The document discusses the Play Framework, a web framework for Java and Scala. It introduces Play and outlines why it is useful, how to install it, and how to structure a new Play application. It then discusses moving a Play application to Google Cloud Platform for scalability. Key points are that Play provides predictable scalability, is developer friendly, and has a large ecosystem. The document recommends using Play Framework with Google Cloud Platform to achieve scalability without having to manage servers directly.
Voxxed Days Vienna - The Why and How of Reactive Web-Applications on the JVMManuel Bernhardt
The document discusses the need for reactive and functional programming approaches to build scalable applications that can take advantage of many-core processors and distributed systems. It introduces key concepts like immutability, functions, and declarative programming. Specific frameworks like Scala, Play and Akka are presented as tools that support this reactive, functional style for building web applications that can horizontally scale across multiple cores and nodes. The talk promotes adopting these approaches to build systems that can better handle concurrency, distribution and failure.
Over the past few years, web-applications have started to play an increasingly important role in our lives. We expect them to be always available and the data to be always fresh. This shift into the realm of real-time data processing is now transitioning to physical devices, and Gartner predicts that the Internet of Things will grow to an installed base of 26 billion units by 2020.
Reactive web-applications are an answer to the new requirements of high-availability and resource efficiency brought by this rapid evolution. On the JVM, a set of new languages and tools has emerged that enable the development of entirely asynchronous request and data handling pipelines. At the same time, container-less application frameworks are gaining increasing popularity over traditional deployment mechanisms.
This talk is going to give you an introduction into one of the most trending reactive web-application stack on the JVM, involving the Scala programming language, the concurrency toolkit Akka and the web-application framework Play. It will show you how functional programming techniques enable asynchronous programming, and how those technologies help to build robust and resilient web-applications.
This document discusses how implicits work in Scala, including how implicit conversions, parameters, and classes are resolved by the compiler. It explains how the compiler searches for implicits, potentially including extended implicit scopes, and how it handles recursion and complexity to avoid stack overflow errors. It also discusses how IDEs can help with implicits by analyzing available conversions and parameter types.
Фофанов Илья - Лучшие практики проектирования и реализации API на C#Elias Fofanov
C# – мощный и красивый объектно-ориентированный язык. Но мощь сама по себе не гарантирует, что всё написанное вами на C# будет эталоном. "Кривой" код встречается даже у опытных программистов, особенно если они пришли с других языков и платформ . И ладно бы некрасивости были связаны с реальными сложностями. Нет же! Кривизна возникает и в таких простых вещах, как именование элементов в соответствии со спецификацией языка C#. Многие не умеют выбрать между структурой и классом, не отличают команду от запроса и так далее. Если хотите, чтобы коллеги любили ваш код – этот вебинар для вас! Мы разберем:
- Принципы именования классов, переменных и т.д.
- Как выбрать между классом и структурой.
- Как выбрать между абстрактным классом и интерфейсом.
- Как выбрать между методом и свойством.
- Чего не стоит делать в конструкторе.
- Когда фабрика лучше конструктора.
- Как реализовать паттерн Dispose.
- Признак «одержимости примитивами».
- Скрытые зависимости.
- Нарушения закона Деметры.
- ВременнАя связанность.
- Когда хорош Switch-Case.
В первую очередь вебинар будет полезен:
– начинающим со знанием основ C# (без минимального знакомства с языком не все будет понятно),
– тем, кто переходит на C# с другого языка.
В некоторых разделах даже middle-девелоперы могут найти для себя что-то новое.
В докладе я расскажу о том как я вижу и применяю TDD, почему мне это нравится и почему я хочу, чтобы это нравилось другим. Все это на примере какого-нибудь мини-приложения на базе Django.
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Magneta AI
Антон Кириллов, Zeptolab (Москва)
Доклад посвящен обзору ключевых технологий стека Typesafe и анализу ключевых преимуществ и недостатков на примере реального проекта:
* Действительно ли Scala - “более лучшая” Java? Что следует знать, начиная внедрять Scala.
* Play Framework: больше чем просто контейнер. Архитектура и возможности.
* Доступ к базам данных: библиотеки и подходы, эволюция схемы БД во времени
* Actors: безболезненная многопоточность!
* Simple Build Tool: не совсем simple, но крайне функциональный инструмент автоматической сборки.
Рассматриваемые технологии позволяют “из коробки” начать создавать прототипы веб-приложений за очень короткое время и в дальнейшем наращивать их функционал. Тем не менее, из-за молодости стека существует большое количество “граблей”, о которых следует знать, принимая решение об использовании данного набора технологий.
Guava - open-source библиотека, разработанная в основном инженерами компании Google, в которой есть множество полезных утилит для написания эффективного и красивого кода. В Guava решено множество типичных задач, которые часто возникают при работе с примитивами, строками, коллекциями, параллельными вычислениями, кэшированием данных и многим другим. В докладе поговорим о возможностях, которые предоставляет Guava, рассмотрим примеры использования утилит библиотеки.
Видео со встречи: http://getdev.net/Event/javascript-good-form
Рассказ о том, как в приличном обществе принято структурировать свой JavaScript, разбивать его на отдельные логические единицы, инкапсулировать его от внешней среды, подключать скрипты к своему веб-приложению, и организовывать процесс юнит-тестирования и как заменять им компилятор
For more than 2 years we were using dry-rb libraries (and a bit of Trailblazer) in production.
I have about 10 years of Ruby on Rails experience and within all this time nothing changed in "official" ROR approach of managing and organising codebase. We still have fat models, somebody even have business logic in them.
In my speech I tried to show when this approach does not work, how we came to this, how we managed to implement dry-rb in existing projects and how it finally helps us
GraphQL API: Patterns | Андрей Чиж | Zlit TechZlit
Это некий список шаблонов, подходов и рекомендаций при разработке API (включая опыт, ошибки из реальной жизни, как не упустить задел на будущее etc), который можно рассматривать как определенный "code style" для API.
Любая команда в любой компании открывает этот доклад / репозиторий в гитхаб и проектирует крутой API без детских ошибок, с легкой возможностью раcширять функционал и в котором учтены потребности бекенда и фронтенда.
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеAlexander Byndyu
В докладе рассматривается использование популярных фреймворков в разработке ASP.NET MVC приложения, как сделать его наиболее гибким. Будет затронута тема минимизации дублирования и повторное использование кода, применение методов метапрограммирования отображений; уменьшение логики в контроллерах; применение принципов SOLID и GRASP для разработки доменной модели приложения.
По материалам конференции .NET разработчиков http://www.dotnetconf.ru/Materialy/Asp_net_mvc_kak_postroit_gibkoe_web_prilozenie
Презентация для JuJa вебинара о том, как писать рекурсивные программы с примером о вычислении факториала и чисел Фибоначчи. Также рассказывается о поиске линейном, бинарном, в глубину и в ширину, как работает поисковая система.
Презентация сделана для новичков в деле программистов.
Similar to Язык программирования Scala / Владимир Успенский (TCS Bank) (20)
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
HighLoad++ 2017
Зал «Калининград», 8 ноября, 15:00
Тезисы:
http://www.highload.ru/2017/abstracts/2964.html
Одноклассники состоят из более чем восьми тысяч железных серверов, расположенных в нескольких дата-центрах. Каждая из этих машин была специализированной под конкретную задачу - как для обеспечения изоляции отказов, так и для обеспечения автоматизированного управления инфраструктурой.
...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
HighLoad++ 2017
Зал «Калининград», 8 ноября, 16:00
Тезисы:
http://www.highload.ru/2017/abstracts/3032.html
Протокол DNS на семь лет старше, чем Всемирная паутина. Стандарты RFC 882 и 883, определяющие основную функциональность системы доменных имён, появились в конце 1983 года, а первая реализация последовала уже годом позже. Естественно, что у технологии столь старой и при этом по сей день активнейшим образом используемой просто не могли не накопиться особенности, неочевидные обыкновенным пользователям.
...
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
HighLoad++ 2017
Зал «Калининград», 8 ноября, 13:00
Тезисы:
http://www.highload.ru/2017/abstracts/3010.html
В этом докладе я расскажу, как BigData-платформа помогает трансформировать Почту России, как мы управляем построением и развитием платформы. Расскажу про найденные удачные решения, например, как разбиение на продукты с понятными SLA и интерфейсами между ними помогло нам сохранять управляемость с ростом масштабов проекта.
...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 10:00
Тезисы:
http://www.highload.ru/2017/abstracts/2914.html
Казалось бы, что нужно для организации тестового окружения? Тестовая железка и копия боевого окружения - и тестовый сервер готов. Но как быть, когда проект сложный? А когда большой? А если нужно тестировать одновременно много версий? А если все это вместе?
Организация тестирования большого развивающегося проекта, где одновременно в разработке и тестировании около полусотни фич - достаточно непростая задача. Ситуация обычно осложняется тем, что иногда есть желание потрогать еще не полностью готовый функционал. В таких ситуациях часто возникает вопрос: "А куда это можно накатить и где покликать?"
...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/2854.html
Из этого доклада вы узнаете о возможностях репликации и автофейловера PostgreSQL, в том числе о возможностях, ставших доступных в PostgreSQL 10.
Среди прочих, будет затронуты следующие темы:
* Виды репликации и решаемые с ее помощью проблемы.
* Настройка потоковой репликации.
* Настройка логической репликации.
* Настройка автофейловера / HA средствами Stolon и Consul.
После прослушивания доклада вы сможете самостоятельно настраивать репликацию и автофейловер PostgreSQL.
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 17:00
Тезисы:
http://www.highload.ru/2017/abstracts/3096.html
PostgreSQL is the world’s most advanced open source database. Indeed! With around 270 configuration parameters in postgresql.conf, plus all the knobs in pg_hba.conf, it is definitely ADVANCED!
How many parameters do you tune? 1? 8? 32? Anyone ever tuned more than 64?
No tuning means below par performance. But how to start? Which parameters to tune? What are the appropriate values? Is there a tool --not just an editor like vim or emacs-- to help users manage the 700-line postgresql.conf file?
Join this talk to understand the performance advantages of appropriately tuning your postgresql.conf file, showcase a new free tool to make PostgreSQL configuration possible for HUMANS, and learn the best practices for tuning several relevant postgresql.conf parameters.
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 16:00
Тезисы:
http://www.highload.ru/2017/abstracts/3115.html
During this session we will cover the last development in ProxySQL to support regular expressions (RE2 and PCRE) and how we can use this strong technique in correlation with ProxySQL's query rules to anonymize live data quickly and transparently. We will explain the mechanism and how to generate these rules quickly. We show live demo with all challenges we got from the Community and we finish the session by an interactive brainstorm testing queries from the audience.
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 15:00
Тезисы:
http://www.highload.ru/2017/abstracts/2957.html
Расскажем о нашем опыте разработки модуля межсетевого экрана для MySQL с использованием генератора парсеров ANTLR и языка Kotlin.
Подробно рассмотрим следующие вопросы:
— когда и почему целесообразно использовать ANTLR;
— особенности разработки ANTLR-грамматики для MySQL;
— сравнение производительности рантаймов для ANTLR в рамках задачи синтаксического анализа MySQL (C#, Java, Kotlin, Go, Python, PyPy, C++);
— вспомогательные DSL;
— микросервисная архитектура модуля экранирования SQL;
— полученные результаты.
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 14:00
Тезисы:
http://www.highload.ru/2017/abstracts/3114.html
ProxySQL aims to be the most powerful proxy in the MySQL ecosystem. It is protocol-aware and able to provide high availability (HA) and high performance with no changes in the application, using several built-in features and integration with clustering software. During this session we will quickly introduce its main features, so to better understand how it works. We will then describe multiple use case scenarios in which ProxySQL empowers large MySQL installations to provide HA with zero downtime, read/write split, query rewrite, sharding, query caching, and multiplexing using SSL across data centers.
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 13:00
Тезисы:
http://www.highload.ru/2017/abstracts/2954.html
MySQL Replication is powerful and has added a lot of advanced features through the years. In this presentation we will look into replication technology in MySQL 5.7 and variants focusing on advanced features, what do they mean, when to use them and when not, Including.
When should you use STATEMENT, ROW or MIXED binary log format?
What is GTID in MySQL and MariaDB and why do you want to use them?
What is semi-sync replication and how is it different from lossless semi-sync?
...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 12:00
Тезисы:
http://www.highload.ru/2017/abstracts/3120.html
Количество разработчиков мобильных приложений Сбербанк Онлайн с начала 2016 года выросло на порядок. Для того чтобы продолжать выпускать качественный продукт, мы кардинально перестраиваем процесс разработки.
Количество внутренних заказчиков тех или иных доработок в какой-то момент выросло настолько, что разработчики стали узким местом. Мы внедрили культуру разработки, которую можно условно назвать "внутренним open-source", сохранив за собой контроль над архитектурой и качеством проекта, но позволив разрабатывать новые фичи всем желающим.
...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/2836.html
При использовании Eventually Consistent распределенных баз данных нет гарантий, что чтение возвращает результаты последних изменений данных, если чтение и запись производятся на разных узлах. Это ограничивает пропускную способность системы. Поддержка свойства Causal Consistency снимает это ограничение, что позволяет улучшить масштабируемость, не требуя изменений в коде приложения.
...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 16:00
Тезисы:
http://www.highload.ru/2017/abstracts/2858.html
Аудитория Одноклассников превышает 73 миллиона человек в России, СНГ и странах дальнего зарубежья. При этом ОК.ru - первая социальная сеть по просмотрам видео в рунете и крупнейшая сервисная платформа.
Качественный и количественный рост DDoS-атак за последние годы превращает их в одну из первоочередных проблем для крупнейших интернет-ресурсов. В зависимости от вектора атаки “узким” местом становится та или иная часть инфраструктуры. В частности, при SYN-flood первый удар приходится на систему балансировки трафика. От ее производительности зависит успех в противостоянии атаке.
...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 15:00
Тезисы:
http://www.highload.ru/2017/abstracts/3008.html
Никогда не было и вот снова случилось! Компания Google в результате перенаправления трафика сделала недостпуными в Японии несколько тысяч различных сервисов, большинство из которых никак не связано с самой компанией Google. Однако, подобные инциденты происходят с завидной регулярностью, вот только не всегда попадают в большие СМИ. У таких инцидентов могут быть разные причины, начиная от ошибок сетевых инженеров и заканчивая государственным регулированием.
...
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 14:00
Тезисы:
http://www.highload.ru/2017/abstracts/2925.html
Облака и виртуализация – современные тренды развития IT-технологий. Операторы связи строят свои TelcoClouds на стандартах NFV (Network Functions Virtualization) и SDN (Software-Defined Networking). В докладе начнем с основ виртуализации, далее разберемся, для чего используются NFV и SDN, потом полетим к облакам и вернемся на землю для решения практических задач!
...
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 10:00
Тезисы:
http://www.highload.ru/2017/abstracts/3045.html
Как мы заставили Druid работать в Одноклассниках.
«Druid is a high-performance, column-oriented, distributed data store» http://druid.io.
Мы расскажем о том, как, внедрив Druid, мы справились с ситуацией, когда MSSQL-based система статистики на 50 терабайт стала:
- медленной: средняя скорость ответа была в разы меньше требуемой (и увеличилась в 20 раз);
- нестабильной: в час пик статистика отставала до получаса (теперь ничего не отстает);
- дорогой: изменилась политика лицензирования Microsoft, расходы на лицензии могли составить миллионы долларов.
...
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/2905.html
Прошло более года с того момента, как Microsoft выпустила первую версию своего нового фреймворка для разработки web-приложений ASP.NET Core, и с каждым днем он находит все больше поклонников. ASP.NET Core базируется на платформе .NET Core, кроссплатформенной версии платформы .NET c открытым исходным кодом. Теперь у С#-разработчиков появилась возможность использовать Mac в качестве среды разработки, и запускать приложения на Linux или внутри Docker-контейнеров.
...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 14:00
Тезисы:
http://www.highload.ru/2017/abstracts/2913.html
Изначально будут раскрыты базовые причины, которые заставили появиться такой части механизма СУБД, как кэш результатов, и почему в ряде СУБД он есть или отсутствует.
Будут рассмотрены различные варианты кэширования результатов как sql-запросов, так и результатов хранимой в БД бизнес-логики. Произведено сравнение способов кэширования (программируемые вручную кэши, стандартный функционал) и даны рекомендации, когда и в каких случаях данные способы оптимальны, а порой опасны.
...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 13:00
Тезисы:
http://www.highload.ru/2017/abstracts/2947.html
Apache Ignite — Open Source платформа для высокопроизводительной распределенной работы с большими данными с применением SQL или Java/.NET/C++ API. Ignite используют в самых разных отраслях. Сбербанк, ING, RingCentral, Microsoft, e-Therapeutics — все эти компании применяют решения на основе Ignite. Размеры кластеров разнятся от всего одного узла до нескольких сотен, узлы могут быть расположены в одном ЦОД-е или в нескольких геораспределенных.
...
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 12:00
Тезисы:
http://www.highload.ru/2017/abstracts/3005.html
Когда мы говорим о нагруженных системах и базах данных с большим числом параллельных коннектов, особый интерес представляет практика эксплуатации и сопровождения таких проектов. В том числе инструменты и механизмы СУБД, которые могут быть использованы DBA и DevOps-инженерами для решения задач мониторинга жизнедеятельности базы данных и ранней диагностики возможных проблем.
...
2. О нашем проекте
Старт — сентябрь 2011
Запуск — май 2012
Итого 9 месяцев
▶ Сразу лучший Интернет-банк в России
▶ Хорошие отзывы клиентов
▶ Бешенное развитие в течение года:
функционал, безопасность, интерфейс
и это не конец...
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
}
Чтобы иметь интерфейсы под рукой,
можно объявить всё в одном файле:
Всё ещё просто!
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
Задача:
«Сделать возможность параллельной
обработки запросов, когда все запросы
обработаны, нужно собрать результаты»
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. Итог
▶ Проще код
▶ Меньше ошибок
▶ Меньше времени на типовые вещи
▶ Простая работа с потоками
▶ Просто поддерживать рост
▶ Легко попробовать и перейти