scala обучение с нуля
Как я Scala учил
Месяца назад я получил свою первую работу и стал стажер-разработчиком, наша команда использует язык Scala. Мне кажется, все начинающие разработчики в первый день потерянные. одновременно наваливается куча новых имен, технологий, каких-то правил, да и мало ли что еще, абсолютно все для тебя ново, это же первая работа. В моем же случае я еще и не знал языка, на котором буду программировать, до момента собеседования я даже никогда о нем не слышал. Итог: в первый день я был в полном ауте. Спросите как тогда я вообще получил эту работу? Я знал Java, на собеседовании мне сказали что джависту перейти на скалу будет достаточно легко и можно не переживать. Но видимо чуть-чуть попереживать все же стоило, потому что первое время перед собой я видел просто экраны, заполненные текстом, в которых сходу была ясна едва ли половина.
Но больше дискомфорта приносило даже не то, что я чего-то не понимал, а то что там многое по-другому, да даже тип переменной идет после названия, а порой его вообще нет.
Вот так описывается функция:
А еще у Scala есть консоль REPL(Read-eval-print-loop), как, например, в Python. Как вы уже заметили пропали точки с запятой. Можно запускать одностраничные программы без main’а, названия методов и переменных могут содержать и начинаться вообще с любых символов, никаких правил. Там не static, но есть Object, там примитивы тоже объекты, == там на самом деле equals. Если у метода нет параметров то не обязательно ставить точку для вызова метода, скобки тоже опциональны если нет параметров, а если принимает только 1 параметр, то можно написать вот так:
И еще один интересный пример:
Нет, это не просто 1 плюс 1, здесь у объекта 1, вызывается метод + и ему передается единственным параметром объект 1. Для меня этого было разрывом шаблона.
На помощь моему шоку пришла замечательная книга Дэвида Поллака — Beginning Scala. Книга начинается с одной фразы, после которой я понял что обязательно должен дочитать ее до конца:
Ouch! That hurts my brain! Stop making me think differently. Oh, wait… it hurts less now. I get it. This different way of solving the problem has some benefits. I felt that way after my first year of law school. I felt that way for a while when I began coding Scala.
Scala is a programming language that provides a best-of-all-worlds experience for developers.
Тем не менее автор честно предупреждает, что овладеть им не так уж просто, ему для этого потребовалось 2 года, но он надеется, что мы сможем быстрее и он в этом поможет. Это не очень-то простая книга и она предполагает определенный опыт в программировании у читателя. Особенно она понравится тем, кто раньше программировал на Java, т.к. встречается много отсылок к этому языку и можно сравнивать.
Помимо Beginning Scala параллельно я читал уроки Twitter’s Scala School, для всех уроков есть перевод на русский язык, книгу Дэвида Поллака же удалось найти только в английском варианте.
Закрепить теорию помимо самостоятельных путешествий по исходникам скалы и работы помогал проект Scala Exercises, там очень простые задания, но вполне подходят для закрепления какого-то аспекта на первых порах и проверки того, что ты все внимательно прочитал и понял действительно правильно.
И расскажу немного про самые распространенные и очень простые вещи, которые пришлось постичь в первую очередь.
Легко возвращать значение по умолчанию в случае пустого Option
В случае каких-то действий:
Пример из Scala Beginning. Путь есть некая база данных, которая содержит записи типы Person
Метод вернет Some[Person] если такая запись будет найдена и None иначе.
Теперь мы хотим получать возраст пользователя по ключу.
Нам не пришлось тестировать на None и метод получился очень лаконичным.
Pattern matching. В начале я подумал, что это тот же джавовский switch и использовать я его почти не буду, но это не так. В Scala это одна из самых часто используемых конструкций.
Можно добавить дополнительные условия и добавить действие по умолчанию
Крайне удобно использовать pattern-matching с case-классами. Пример из Scala Beginning
Начнем с того, что в Scala функции — это инстансы, реализующие определенный интерфейс, а точнее trait FunctionX, где X это количество параметров и принимает значение от 1 до 22. В этом трейте единственный метод — aplly, который и вызывается для функции. Поскольку функции это обычные инстансы, то мы можем передавать и возвращать их из методов и функций.
Пример из Scala Beginning. Передаем в answer какую-то функцию из Int в String, а она возвращает результат работы этой функции с параметром 42.
или что тоже самое
Очень удобная вещь функциональные комбинаторы/
Оставить в массиве только положительные элементы:
Чуть более сложный пример. Посчитать сумму значений функции f от положительных элементов списка. 2 способа это сделать:
А в конце хотелось бы сказать зачем вообще я все это написал. Я не хотел никого учить Scala или рассказывать о языке как о таковом, таких статей на хабре и в интернете достаточно много, и многие очень хорошие и полезные. Моей целью было просто рассказать свою историю, которая кому-то может быть интересна и сможет помочь и поддержать какого-нибудь такого же потерянного новичка, которого судьба только-только столкнула с этой скалой. Желаю тебе удачи! Опытных же программистов призываю поделиться в комментариях своими советами и мнениями, на счет пути начинающего Scala-программиста.
Scala. Введение
Не так давно я заинтересовался одним из многочисленных ныне языков под JVM — Scala. Причин тому много, основная — всё нарастающее со временем чувство неудобства при работе с cpp-подобными языками. Взгляд мой попеременно падал на Ruby, Groovy, Python, но все они оставляли впечатление инструментов, не совсем подходящих для моего обычного круга рабочих задач (Python-таки хорош, но у нетипизированных языков есть свои ограничения). Scala же, напротив, показалась вполне годным языком. Так как поиск по хабру никаких статей о ней не выловил (было несколько, но мягко говоря не вводных), я решил написать маленький обзор и поделиться им с массами.
Немного философии языка в вольном изложении
Какие основные цели преследовали создатели языка? Согласно моим мироощущениям они такие:
Во-первых, совместимость. Среди своих задач разработчики ставили поддержание совместимости с Java-языком и тысячами примеров говнокода разработок на ней для решения самых разнообразных задач.
Во-вторых, интенсивное насыщение языка функциональными фичами, которые, в основном, (но далеко не полностью) составляют его отличия от Java.
В-третьих, облегчение нашего с вами труда. Действительно, компилятор Scala понимает программиста с полуслова, писать код специально, чтобы втолковывать ему, что я не верблюд, мне не довелось пока.
В-четвёртых, поддержка и стимулирование написания модульных, слабосвязанных программных компонентов в сочетании с широкими возможностями адаптации уже существующих. Цели не то, чтобы совсем противоположные, но порождающие известные трудности для одновременного достижения. Что ж, посмотрим что получится.
В-пятых, это поддержка параллелизма. К сожалению у меня руки и голова до этой области не дошли (надеюсь пока), но акцент на этом моменте делается постоянно на всех ресурсах по языку.
Для экспериментов с языком достаточно поставить соответствующий плагин на любимую IDE отсюда.
Итак, давайте посмотрим на сам язык…
Общие идеи языка, примеры синтаксиса
Самое, пожалуй, важное, — это «унифицированная модель объектов». Этот термин расшифровывается авторами так: «каждое значение — объект, каждая операция — вызов метода». Это, конечно, не «всё — объект», но сущностей в сравнении с Java убыло, а чем меньше сущностей — тем легче жизнь 🙂 В прикладном плане это означает, что числа и символы сделались неизменяемым объектами, обитающими в общей куче, все операции приобретают ссылочную семантику. Например, код 5 + 5 вполне валиден, и породит новый объект в куче, который оперативненько оприходует сборщик мусора (на самом деле, я тихо надеюсь, что компилятор поймёт глубину замысла и порождать он ничего не будет 🙂 ).
После столь возвышенного введения можно глянуть на решение классической задачи:
println( ( «Hello, » + args(0) + «!» ).toUpperCase )
println( «Hello, » + args(0) + «!» toUpperCase )
В качестве подспорья разработчику Scala поддерживает также интерактивный режим. То есть, можно запустить интерпретатор и по одной вводить комманды. Интерпретатор, встроенный в IDE, как-то нерегулярно работает, его отдельный вариант есть в репозитариях Убунты, думаю у остальных дистрибутивов тоже всё хорошо, счастливым обладателям Windows как всегда придётся помучаться 🙂 Интерпретатор запускается самым необычным способом:
$ scala
Welcome to Scala version 2.7.3final (Java HotSpot(TM) Server VM, Java 1.6.0_16).
Type in expressions to have them evaluated.
Type :help for more information.
scala>
Совсем маленький пример:
scala> 1 to 10
res0: Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Тут мы видим пример вызова метода с параметром. Если кто не догадался, у объекта класса Int 1 вызывается метод to с параметром того же типа 10, результат — диапазон значений.
Операции над функциями
Что же мы такого можем с ними тут делать? Да что угодно =) Функции являются полноценными объектами программы. Их можно хранить как свойства объектов, передавать как параметры и возвращаемые значения и собственно создавать во время выполнения. Данные свойства позволяют строить так называемые функции высокого порядка, оперирующие себе подобными.
Для иллюстрации рассмотрим ставший классическим пример вычисления суммы:
scala> def sum(f: Int => Int, a: Int, b: Int): Int =
| if (a > b) 0 else f(a) + sum(f, a + 1, b) sum: ((Int) => Int,Int,Int)Int
В данном примере определяется функция sum, представляющая знакомый, надеюсь, всем оператор суммы. Параметры имеют следующий смысл:
f — функция преобразования целого числа из пределов суммирования в элемент суммы. Обратите внимание на объявление типа параметра: знак => означает, что параметр — функция, типы принимаемых значений перечисляются слева от него в круглых скобках (если параметр один, как в данном примере, их допустимо опустить), тип возвращаемого результата справа.
Работает она тривиально: вычисляет значение функции в нижней границе диапазона и складывает его с результатом вычисления себя самой в диапазоне на 1 меньшем.
Также в этом примере видна ещё одна особенность языка — if является выражением, имеющим значение (кстати, использованный ранее for — тоже выражение, его результат типа Unit ). Если условие истина, то его результат первый вариант, иначе — второй.
a и b — пределы суммирования.
Теперь можно воспользоваться тем, что мы написали ранее.
scala> sum(id, 1, 5)
res1: Int = 15
scala> sum(square, 1, 5)
res2: Int = 55
Здесь происходит кульминация этой части — мы берём и передаём функцию в другую функцию. Никаких интерфейсов, анонимных классов, делегатов: вот оно — маленькое счастье.
Я здесь намеренно не стал приводить примеры вложенных и анонимных функций, карринга. Всё это Scala умеет, но всё нельзя включить в небольшой обзор. Думаю приведёный пример достаточен для понимания важности и, главное, — удобства функций высокого порядка как инструмента программирования. Напоследок могу посоветовать почитать эту главу замечательной книги по программированию.
Особенности классов
override def toString = real+ » + i*» +image+ » | » +magnitude+ «*e^(i*» +angle+ «))»
>
object Main <
def main(args:Array[ String ]) :Unit = <
val first = new Complex(1, 5)
val second = new Complex(2, 4)
val sum = first + second
println(first)
println(second)
println(sum)
>
>
object Main <
def main(args:Array[ String ]) :Unit = <
val first = new Complex(1, 5)
val second = new Complex(2, 4)
if (first > second )
println( «First greater» )
if (first «Second greater» )
if (first == second )
println( «They’re equal» )
>
>
val user = new User( «Scala. » )
println(user.name)
user.name = «M. Odersky»
println(user.name)
Pattern-matching
case class KnownUser(val name: String ) extends User
case class AnonymousUser() extends User
object Test <
val users = List (KnownUser( «Mark» ), AnonymousUser(), KnownUser( «Phil» ))
def register(user: User): Unit = user match <
case KnownUser(name) => println( «User » + name + » registered» )
case AnonymousUser() => println( «Anonymous user can’t be registered» )
>
def main(args: Array[ String ]) =
users. foreach ( register )
>
Итак, общая картина кода: есть абстрактный класс пользователя, есть два его казуальных потомка: известный и анонимный пользователи. Мы хотим зарегистрировать некий список пользователей на (здесь включаем фантазию) встречу. Для чего и используем pattern-matching, который позволяет нам определить разное поведение метода для разных типов объектов и обеспечивает выборку данных из этих объектов.
Люди знакомые с базовыми принципами ООП конечно сразу заметят, что проблема эта вполне решается использованием виртуальных функций (более того предлагаемый подход является не лучшей практикой). Однако их использование несёт в себе две трудности: во-первых усложняет поддержку кода при большом числе таких функций (нам ведь захочется регистрировать пользователей и на события, и в группы, и в блоги и т.п., что для каждого случая создавать виртуальный метод?), во-вторых не решает проблемы с тем, что объекты одного типа могут принципиально иметь разную структуру и не иметь возможности предоставлять некоторые данные.
Вывод типов
Заключение
Мда… К началу поста уже и скролить долго. Явно пора заканчивать. А сказать хотелось бы ещё про многое: про интереснейший механизм описания обобщённых классов, про неявные преобразования и то, что они на самом деле явные, ленивую инициализацию констант.
Мне и самому ещё только предстоит изучить модель многопоточности и своеобразный набор примитивов для её реаизации, разобраться с языковой поддержкой xml, поиграться с DSL-строением, посмотреть на их флагманский проект — Lift…
UPD: поправил грамматику, спасибо всем оказавшим в этом помощь. Особенно ganqqwerty за массовые разборки с запятыми.
12 хороших курсов по Scala для тех, кто уже что-то знает
Язык программирования Scala громко заявил о себе в 2010-е годы. Сейчас ажиотаж вокруг него спал, но забывать о Scala точно не стоит. Это один из самых популярных коммерческих языков, который используют Twitter, LinkedIn, WhatsApp. Scala-разработчики, возможно, не так востребованы как их коллеги, пишущие на Python или Java, но хороший специалист будет цениться высоко, а знание языка станет безусловным плюсом в резюме. В помощь тем, кто хочет пополнить ряды адептов Scala, Digitaldefynd составил (а мы дополнили) подборку онлайн-курсов и тренингов разных уровней сложности.
Язык программирования Scala громко заявил о себе в 2010-е годы. Сейчас ажиотаж вокруг него спал, но забывать о Scala точно не стоит. Это один из самых популярных коммерческих языков, который используют Twitter, LinkedIn, WhatsApp. Scala-разработчики, возможно, не так востребованы как их коллеги, пишущие на Python или Java, но хороший специалист будет цениться высоко, а знание языка станет безусловным плюсом в резюме. В помощь тем, кто хочет пополнить ряды адептов Scala, Digitaldefynd составил (а мы дополнили) подборку онлайн-курсов и тренингов разных уровней сложности.
Содержание
spoiler#handleClick»>Примечание редакции
Стоимость указана на момент подготовки материала и носит ориентировочный характер.
Актуальные скидки и промокоды некоторых онлайн-площадок можно найти по ссылке.
Apache Spark на Scala для работы с большими данными (Udemy)
Курс разработан для того, чтобы помочь изучить Apache Spark, известную технологию в области BigData. Вы узнаете, как извлекать смысл из массивных наборов данных в отказоустойчивом кластере Hadoop. Освоите искусство формулирования проблем анализа данных при помощи многочисленных практических примеров и научитесь масштабировать их для выполнения в службах облачных вычислений.
Преимущества курса
spoiler#handleClick»>Отзыв
«Это превосходный курс по Spark и Scala. Я никогда не видел ничего подобного среди онлайн-курсов. Я рекомендую его всем, кто хочет иметь ясное понимание концепций Spark. Спасибо за прекрасный курс».
Продолжительность: 9 часов.
Рейтинг: 4.5 из 5.
Scala и Spark для работы с большими данными и машинного обучения (Udemy)
Работа со Spark и Scala — востребованный навык в ИТ-индустрии. Эта сертификация начинается с краш-курса по Scala и дает обзор экосистемы больших данных и Spark. В ней есть множество возможностей получить практический опыт работы с Mlib, платформой для аналитики больших данных Databricks и другими инструментами. После завершения сертификации вы сможете с уверенностью добавить полученные навыки в резюме.
Преимущества курса
spoiler#handleClick»>Отзыв
«Я приобретал другие курсы Jose и раньше. Я познакомился с введением в Scala и Spark на разных ресурсах, включая курсы Udemy, и хотел получить более структурированный материал. Репутация Jose как преподавателя, который объясняет все шаг за шагом, дала мне уверенность, чтобы записаться на этот курс. Мне нравится, что он объясняет „Почему“, а не просто фокусируется на том „Как“. Этот курс наконец-то связал для меня все воедино».
Продолжительность: 10 часов.
Рейтинг: 4.4 из 5.
Scala и функциональное программирование для начинающих (Udemy)
Если у вас есть опыт программирования на любом языке и вам хочется добавить в список своих скилов еще и работу на Scala, то можете обратить внимание на этот курс. Всего 15 часов лекций и, по словам инструктора, вы сможете понимать код Scala в производственных средах и проектах с открытым исходным кодом, научитесь с нуля создавать приложения на этом языке и получите навыки, которые позволят вам работать с такими инструментами, как Spark, Akka и Play.
Преимущества курса
Продолжительность: 15.5 часов.
Рейтинг: 4.6 из 5.
Принципы функционального программирования в Scala (Coursera)
В этой комплексной программе вы изучите элементы стиля функционального программирования и научитесь использовать их для решения ваших повседневных задач. Начнете с создания прочной основы для рассуждений о функциональных программах, прежде чем перейти к доказательству инвариантов и символическому отслеживанию выполнения. Если у вас есть опыт программирования на Java, C#, C, C++, Python, Javascript или Ruby (от одного года), то вы более чем готовы к обучению на этой сертификации.
Преимущества курса
spoiler#handleClick»>Отзыв
«По-настоящему хорошее объяснение инструктора. Хорошие задания. Они дают четкое представление о функциональном программировании. Мне понравилось, как проблемы были разделены на более мелкие».
Продолжительность: 23 часа, по 5 часов в неделю.
Рейтинг: 4.8 из 5.
Scala и функциональное программирование: продвинуты уровень (Udemy)
Курс создан для разработчиков, знакомых со Scala, которые хотели бы усовершенствовать свои знания и навыки. Для того, чтобы пройти данную программу, обязательно иметь хорошее понимание этого языка и функционального программирования. На курсе отобраны и рассмотрены самые важные идеи Scala, продвинутые концепции деконструируются на критические части, а вся теория поддержана демонстрацией реального кода. Полученный на программе опыт поможет продвинуться в разработке сложных масштабируемых систем, настройке существующих инструментов и создании своих собственных.
Преимущества курса
Продолжительность: 14 часов.
Рейтинг: 4.8 из 5.
Специализация по функциональному программированию на Scala (Coursera)
Эта специализация разработана для практического знакомства с популярным языком Scala, а также функциональным программированием. Занятия начинаются с изучения базового блока функциональных парадигм и их использования для решения небольших проблем, а затем переходят к объединению концепций и более крупным задачам. Вы узнаете, как эта парадигма упрощает параллельное и распределенное программирование. К концу обучения вы сможете эффективно применять новые знания в соответствующих проектах.
Преимущества курса
Продолжительность: 5 месяцев, по 5 часов в неделю.
Рейтинг: 4.7 из 5.
Обработка больших данных при помощи Spark Streaming и Scala: практикум (Udemy)
На этом курсе вы получите навыки практической работы с данными Twitter в реальном времени, смоделированными потоками журналов доступа Apache и даже данными, которые используются для обучения моделей машинного обучения. Узнаете, как написать и запустить реальные потоковые задания Spark и завершите обучение, перенося их в кластер Hadoop и запуская в производственной среде.
Преимущества курса
spoiler#handleClick»>Отзыв
«Фантастическая структура, предупреждения компилятора, которые могут сбить с толку кого угодно при запуске кода, и побудили меня создать готовый работающий пакет Spark Streaming за 20 минут. С нетерпением жду того, чтобы проверить код и разобраться с оптимизациями и другими источниками потоковой передачи».
Продолжительность: 6 часов.
Рейтинг: 4.4 из 5.
Анализ больших данных со Scala и Spark (Coursera)
Этот курс покажет вам, как парадигма параллельных данных может быть распространена на распределенный случай с помощью Spark. Изучите модель программирования Spark и поймите, чем она отличается от других, знакомых вам. Получите практический опыт и выясните, когда стоит учитывать вопросы, связанные с распределением, и как они могут сделать работу более эффективной. К концу занятий вы будете в состоянии читать данные из постоянного хранилища, управлять ими, выражать алгоритмы в функциональном стиле.
Преимущества курса
Продолжительность: 28 часов.
Рейтинг: 4.7 из 5.
Scala для начинающих (Udemy)
Данная программа подойдет всем, кто хочет получить комплексное представление об языке программирования Scala и изучить его с нуля. Курс представляет сбалансированное и подробное введение в Scala и его концепции, включая библиотеки Actors и Collections. Если верить преподавателю, то к концу обучения, при условии выполнения всех заданий, вы будете иметь прочные теоретические знания и практические навыки, которые позволят вам уверенно программировать на Scala и использовать все необходимые для этого инструменты.
Преимущества курса
Продолжительность: 5.5 часов.
Рейтинг: 4.7 из 5.
Программирование на Scala (Artima)
Если вы интересуетесь программированием на Scala, но не знаете, с чего начать, то это — подходящий вариант. Разработанное иначе, чем большинство курсов, это руководство рассматривает темы шаг за шагом и отлично подойдет студентам, которые предпочитают учиться по книгам. Кроме основных тем, в нем также рассказывается, как работать с XML, модульным программированием и программированием с графическим интерфейсом, равенством объектов и многое другое. Этот курс со множеством примеров и кодов — фаворит пользователей.
Преимущества курса
Продолжительность: определяете сами.
Рейтинг: 4.4 из 5.
Стоимость: бесплатно.
Apache Spark 3: программирование Spark на Scala для начинающих (Udemy)
Этот курс был разработан, чтобы помочь всем желающим разобраться с программированием Spark и начать применять полученные знания для создания решений по инженерии данных. Вы начнете обучение со знакомства с архитектурой Spark и его фундаментальными концепциями, а затем перейдете к более специфическим темам. Курс основан на рассмотрении конкретных примеров и «живом» кодировании, поэтому все необходимые концепции в нем объясняются по ходу. Для студентов, которые хотят пройти эту программу, обязательно знакомство со Scala.
Преимущества курса
Продолжительность: 7 часов.
Рейтинг: 4.6 из 5.
Проекты с консультациями по программированию на Scala (Coursera)
Новый формат обучения от Coursera — проекты с консультациями — позволяет в сжатые сроки (до 2-х часов) получить полезные навыки, например, изучить основы Scala, разработав мини-игру или объектно-ориентированное программирование на этом языке, практикуясь в написании кода. Обучение проходит в режиме разделенного экрана под руководством преподавателя, который дает вам пошаговые инструкции. Проекты лучше всего подойдут студентам, хотя бы немного знакомым со Scala, а также любым другим языком программирования. Обратите внимание: данный формат недоступен для мобильных устройств и в режиме бесплатного прослушивания.
Преимущества курса
Продолжительность: 1.5 — 2 часа.
Хотите сообщить важную новость? Пишите в Телеграм-бот.
А также подписывайтесь на наш Телеграм-канал.