Обучаем Scala/FP. БЕСПЛАТНО!

Харьковская продуктовая компания Moebius Labs в рамках вывода на рынок серии продуктов класса 100k request/second в области интернет-рекламы объявляет набор на оффлайн курс Reactive Big Data:
— Scala
— Netty, Zookeeper
— Kafka, HBase
— Druid (real-time OLAP)
.
Наша серия продуктов написана на лучшем языке программирования на Земле, на Scala
.
Обучение Б-Е-С-П-Л-А-Т-Н-О-Е, набор на основе короткого письменного теста на знание computer science.
.
Успешно закончившим курс будет предложена работа в компании.
.
Узнаете, чем монада отличается от ковариантного функтора, как устроена лучшая обертка для java.nio всех времен и народов и как надежно сохранять 1.000.000 сообщений в секунду.
.
Если Вы считаете себя дотошным, имеете широкий кругозор и заинтересованы в профессиональном росте — мы хотим видеть Ваше резюме.
.
Team Lead и автор курса до этого читал курсы:
— Scala
— Multithread Java Programming
— Junior Java Development
— Java Core
Я умею просто объяснять сложное. Поверьте.
.
Набор в команду проекта ведется по двум направлениям:
— Real -Time I/O and Clustering (Netty, Zookeeper, Curator, Kafka, Cassandra)
— Real -Time Аналитика и Процессинг (Druid, HBase, Map/Reduce, Streaming engines)
.
Резюме высылайте на [email protected]. В ближайшее время со всеми выславшими резюме мы свяжемся.
---
Программа по Druid:
— Лямбда и Каппа архитектуры
— Роли: Runtime, Historical, Coordinator, Broker
— Runtime: прием, индексация и поиск по потоку данных
— Historical: manager of petabyte storage
— Broker: query distribution, balancing, caching
---
Программа по Netty:
— SEDA архитектура и Netty threading model
— IO, NIO, NIO.2, epoll, Channel/Selector abstractions, Reactor/Proactor patterns
— Netty memory-management module, off-heap memory
— Upstream/Downstream pipeline, EventLoop
— Demo: HTTP 1.1 Server
-----
Программа по Scala:
— Scala type hierarchy, OOP basics
— Tuples, laziness, exceptions, annotations
— Expression-oriented programming, operator overloading
— Функциональные литералы, curring, функции высших порядков
— Алгебраические типы данных, Pattern Matching
— Рекурсия, tail-call optimization, recursive patterns (fold, unfold, hylomorhism), Stream API
— Classical generics, generics of higher-kind
— Категориальные абстракции: functor, applicative fucntor, monad, for-comprehensions
— Implicits and type classes
----- Update #1
1. Занятия стартуют 10 марта (четверг) в 19.00-21.00. Будут проходить в коворкинге «Фабрика».
2. Сейчас рассматривается следующий вариант — первый 2-3 занятия в «Фабрике» (150 мест), потом некий отбор и занятия на Космической 21 в конференц-зале (40 мест).
3. В данный момент количество желающих порядка 100, если будет принято решение о неразумности сокращения до 40 мест, то занятия будут продолжены в больших помещениях (100+ человек).
----- Update #2
1. С вероятностью 90% видео будет записываться и будет выложено.
2. Будет оно платным или бесплатным — сейчас решается. Запись — это оборудование (камера, микрофон) и труд (запись, базовый монтаж, заливка). Если компания потянет — может быть и бесплатным. Если не потянет — будем решать как писать и как это окупить.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn

Найкращі коментарі пропустити

Имеет ли смысл отсылать резюме, если я заранее знаю, что не буду менять место работы?

Т.е. мне очень интересна Scala, и я слышал много хороших отзывов про вас лично, поэтому я хотел бы пройти этот курс. При этом я понимаю, что вашей компании не очень интересно забесплатно обучать сотрудников конкурентов на рынке труда, а обманывать кого-либо мне тоже не хочется.

Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Стартует второй курс Микросервисы от Twitter или как Scala разрывает Go, будет состоять из двух 3-х часовых лекций.

В обще у вас не очень корректное сравнивание, это же ж разные языке в корне

Нормальное сравнение — оба языка отлично справляются с созданием микросервисов. Хотя в предложении кто кого разрывает нужно поменять go со scala местами :)

Мы же проверяем их на одной задаче. Все честно.

А что за задача?

а можно ли сдать вводный тест и удаленно (посредством выложенного видео) проходить курс? можно ли будет потом надеяться на получение работы в Moebius Labs?

можно ли сдать вводный тест
Тест был нужен только для отсева тех, кто останется в аудитории (что бы отвечать на вопросы 20, а не 80 человек).
.
удаленно (посредством выложенного видео) проходить курс
Да, смотрите, оно все будет общедоступным.
.
на получение работы в Moebius Labs?
Для получения работы нужно пройти собеседование.
Если хотите к нам — присылайте резюме, можете отметить, что смотрели курс в записи.

не нашел его у вас на канале. может, не там ищу?

Огромная просьба выложить видео лекций на ютуб-канале KharkovITCourses. Большущее спасибо.

Спасибо большое за выложенные видео.

Глянул первую лекцию на ютубе. Понравилось как обясняют, все круто, только вот не понравилось шо все время проводится параллель с джавой. Если чел в глаза джаву не видел и от всяких «падлик статик войдов (это ж вроде перец такой в дотане — Войд )» его в ригу тянет, то эти сравнения только запутывают. Типа во какой замечательный синтаксический сахарок в скале. Да нет там ничего такого, во всех языках так, это только в джаве излишняя структуризация ж, нафиг она нада ? :D Да и начало на FP не похоже — эти же самые параллели с ооп джавы. Некоторые пишут, что хотели б засунуть ружье в ротяку и вышибить себе часть мозга, что помнит «принципы ООП», когда начали изучать ФП. А тут со старту начали изучать ооп джавы «скала стайл». Ну типа чел, который ту джаву в глаза не видел и, например, программирует на лиспе или хаскеле или Р и хочет посмотреть курс по «Scala/FP» вначале будет в потерях...
Ну вообще спасибо ! Вылажуйте еще :D

Ну на практике в скале совсем без ооп и джавы — почти не обойтись.
Потому, либо немного изучить и это тоже, или забить, и дальше Р педалить.

дальше Р педалить.
Ну синтаксис скалы именно Р и напоминает. Може дело в том что и то и то писали умники, хз. Ну нутро и принцип работы конешо разные, но ты ж когда новый язык учишь, поначалу похер на нутро (просто попробовать по «хелоу-вордить»), типа синтаксис важен, а он как раз у скалы «Р-овсий» а не «Джавовский» (ну мне так показалось по началу, сейчас хз в потерях), с отличием шо в Р «все» в функциях, а в скале — в методах.

На первое занятие регистрация&отбор&резюме обязательна или можно просто прийти послушать и решить?

Добры день, еще не поздно подать заявку на участие в курсе?

Нет, не поздно.
Первая лекция — в четверг, мест — 150.

И еще такой вопрос чем Ваша компанию лучше для новичка чем epam или никсы ?

1. Мы пишем на Scala.
2. Ищем сотрудников на 100к запросов в секунду.
3. Обучаем сотрудников функциональному программированию.

лучше для новичка
Ну прямо совсем начинающих мы не берем.
— или перековываем Junior/Middle на Scala
— или берем без опыта, но с очень сильным математическим/алгоритмическим background

допустим студент без коммерческого опыта но с уверенными знаниями Java (Spring, Hibernate и т.д.) и Scala core (по Вашему курсу на удеми учил), какие имеет шансы на будущее трудоустройство ?

Зарплату которую вы предложите на позицию джуна/мидла, прошедшим обучение и интервью можно сравнивать с той которая весит здесь на доу

Это вопрос, утверждение или требование?

с той которая весит здесь на доу
С какой? Где висит?
Дайте ссылку или просто скопируйте.
// Я не совсем понимаю, о чем идет речь.

Иван, со своей камерой/штативом можно прийти ? компания не будет против ?

Только если Вы предоставите нам весь видео-материал для бесплатной выкладки на канал youtube.com/user/KharkovITCourses.
Копию можете оставить себе и пользоваться в любом варианте (выкладывать где угодно, подвергать любой обработке).

да, все материалы предоставлю KharkovITCourses

Договорились.

Я не в Харькове, но за Druid вам +

К сожалению, в украинских краях очень мало людей, имевших с ним дело.

----- Update #2
1. С вероятностью 90% видео будет записываться и будет выложено.
2. Будет оно платным или бесплатным — сейчас решается. Запись — это оборудование (камера, микрофон) и труд (запись, базовый монтаж, заливка). Если компания потянет — может быть и бесплатным. Если не потянет — будем решать как писать и как это окупить.

----- Update #1
1. Занятия стартуют 10 марта (четверг) в 19.00-21.00. Будут проходить в коворкинге «Фабрика».
2. Сейчас рассматривается следующий вариант — первый 2-3 занятия в «Фабрике» (150 мест), потом некий отбор и занятия на Космической 21 в конференц-зале (40 мест).
3. В данный момент количество желающих порядка 100, если будет принято решение о неразумности сокращения до 40 мест, то занятия будут продолжены в больших помещениях (100+ человек).

-

Я освоил треть Javarush, можно сказать закрепил и расширил Вашими видео уроками по Java Core. Учу английский. С удовольствием записался бы на курсы по Scala. Проживаю в Харькове. Как записаться?

Доступ к курсу (к первым лекциям точно) будет проходить без отбора, так что — приходите. Но, должен предупредить, что без серьёзной базы в каком-либо ООП-языке Вам может быть крайне сложно, если даже не невозможно обучаться, курс будет крайне интенсивный и опираться на предыдущий опыт слушателей.
.
Посмотрите мой комментарий.

Я же ничего не потеряю, если приду. Не так ли? А когда начало? И где? И какой график?

Курс предполагает, что Вы уже хорошо понимаете ООП и имеете практический опыт, т.е. понимаете проблематику разработки ПО, типичные проблемы и их типичные решения.

Update:
-----
Программа по Scala:
— Scala type hierarchy, OOP basics
— Tuples, laziness, exceptions, annotations
— Expression-oriented programming, operator overloading
— Функциональные литералы, curring, функции высших порядков
— Алгебраические типы данных, Pattern Matching
— Рекурсия, tail-call optimization, recursive patterns (fold, unfold, hylomorhism), Stream API
— Classical generics, generics of higher-kind
— Категориальные абстракции: functor, applicative fucntor, monad, for-comprehensions
— Implicits and type classes

Я готов заплатить за видео адекватную цену. Потому как живу в Киеве

Круто!) Изучал ваш курс Java core на ютубе). Теперь есть шанс выучить скалу))).

а можно ссылку на тот курс?

Вот еще = habrahabr.ru/...ovachcourses/blog/215275
Не помню отличается ли чем-то от ссылки на DOU = dou.ua/forums/topic/8113

Человек, изучавший Скала на курсах не должен быть подпущен к scalac на пушечный выстрел!

Из Вашего заявления непосредственно следует, что изучение Scala самостоятельно — в разы эффективнее, чем изучение Scala самостоятельно + информация на курсах от человека, который пишет реальные проекты на Scala.
.
Я правильно Вас понимаю?
Или же Вы в принципе считаете, что Scala невозможно изучить?
.
Помогите мне понять суть Вашего весомого высказывания. Для меня очень важна Ваша экспертная оценка.

Тезис 1.
Я глубоко убежден, что на скала должны писать только сениоры. Слишком легко написать неподдерживаемый код. Я такое видел.
Джун, пишущий на скала — смертельно опасен для проекта

Тезис 2.
Человек которому нужны курсы для изучения языка вряд ли сениор

Простота и топорность джавы после сложности С++ была придумана не просто так :)

А как же codereview, парное программирование, тимлид и бла-бла-бла... ?

ну в каком-то идеальном мире так и должно быть, но обычно всем некогда. Полноценный code review для неопытного разработчика будет занимать больше времени, чем само написание кода.
Кто оплатит этот банкет? :) хорошо если есть время и деньги...

в общем, для больших команд — Джава и только Джава. Для прорывных проектов с сильной командой — Скала, но осторожно :)

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

Ну в таком случае надо договориться о понятиях.
Для меня сениор — не про фреймворки ) а про умение зрело и ответственно относиться к коду.

Игнорировать «модные» фишки
Писать не интересно и круто а просто и понятно
и тд

Это нарабатывается годами, если не десятилетиями

Человек которому нужны курсы для изучения языка вряд ли сениор
1. А кто сказало про «необходимость»? Это помощь для скорейшего перехода к production. Не хотите помощь — не надо.
2. Я 10 лет программирую, сениор, но для изучения нового языка (скажем Erlang или Clojure) предпочел бы иметь возможность общения с программистом уже пишущим на них. Лично мне это совершенно не мешает читать книги и блоги.

Я тоже 10 лет программирую и тоже преподавал :)
Вы кого на курсах собираете? Сениоров? Или джунов? На кого информация будет ориентирована?
Ладно, я не критикую это ваше начинание, просто будьте осторожны со скалой :) это скальпель :) им можно творить чудеса, а можно отрезать ногу. И доверить скальпель можно только хирургу :)

Скорость компиляции не мешает работать, слыхал что это основная проблема ? И есть ли для скалы интерпретатор что бы можно было выполнить код как скрипт на подобие csi для C# ?

1. оно ж компилируется только 1й раз, потом jit спасает
2. да есть :) но не надо использовать потому что не секьюрно

я говорил о компиляции во время разработки. Типо голый проект собирается 15 сек source. А интерпритатор что бы быстро проверить какую то функциональность, особенность языка или если вдруг чего то забыл. Избавляет от необходимости создавать новый проект.

Очень сильно зависит от того, что конкретно в коде. Например, @specialized на десятке типов будет компилироваться в прямом смысле вечность. Implicit/macros магия точно так же будет взрывать мозги компилятору, при неаккуратном использовании (shapeless-style). «Обычный» код с теми же имплиситами дает приемлемую скорость компиляции.

На практике, разбиения проекта на подмодули хватает для комфортной работы. На трехлетнем ноутбуке я ни разу не сталкивался с потерей производительности из-за долгой компиляции (кроме как загрузки проекта на машину без ivy кеша, тогда можно идти обедать, тк sbt качает весь интернет (что, строго говоря, не «компиляция» вообще) ). Говорят, что дотти будет гораздо быстрее компилировать.

Интерпретатор — это, вероятно, repl? Конечно есть, с подключением к коду проекта, и быстрым тестированием каких-то штук.

Скорость компиляции не мешает работать
Мешает, особенно после Java.
Но, по факту, кода не так много. На таких скоростях много бизнес-логики и не вставишь и не нужно.

Мешает или бесит ?) Почему тогда написали проект на scala ? кода не много, бизнес логики тоже, зачем эта выразительность если описывать почти нечего ? Что бы получить преимущества JVM можно было на Java.

Почему тогда написали проект на scala
1. Кода в 2-3 раза меньше, чем на Java и он точнее отображает смысл.
2. В ряде случаев функциональная парадигма очень соответствует нашей архитектуре (схоже с «Your Server as a Function»).
3. Мы не оутсорс, не «херак-херак и в продакшен», нам не надо ежемесячно набирать десятки скалистов (а вот ЕПАМу явистов надо столько). А если и станет надо — мы столько научим. Сложность функциональной парадигмы во многом надумана и является следствием того, что все наши ВУЗы учат на ООП языках. И, кстати, базовая теория категорий тоже не сложна, не более чем базовая теория множеств (Вам же для построения пересечения множеств не требуется детальное понимание иерархии кардиналов и ординалов).
4. Мы не видим особых минусов Scala. Если кого-то бесит медленная компиляция — компания предоставляет корпоративные валериану и корвалол:)
И есть ли для скалы интерпретатор
Scala REPL.
Кажется, у него есть неплохая поддержка в IDEA/Eclipse.
Ладно, я не критикую это ваше начинание, просто будьте осторожны со скалой :) это скальпель :) им можно творить чудеса, а можно отрезать ногу. И доверить скальпель можно только хирургу :)
Ну понятно, что к Scalaz, макросам и dependent types будет допуск по паспортам и со справкой из милиции и от психиатра:)

Человек, который изучал Скала на курсах не должен быть подпущен к scalac на пушечный выстрел!

Подскажите, а стандартный компилятор скалы scalac — так опасен, что неопытность пользователя может привести к трагедии?
А есть ли такая опасность при использовании компилятора javac?

Иван, вы обучаете «нахаляву» за счёт людей, которые больше года назад дали вам деньги за курс, который до сих пор не закончен. Верните деньги, балабол!

Из первоисточника: я как раз из тех людей, кто заплатил, а результата не получил. И не получу, т.к. за эти деньги курс должен был быть в оговоренные сроки, а не «когда получится». Это уж не говоря о том, что на несколько месяцев Иван просто пропал, как дешёвый фрилансер, и просто не отвечал ни в скайп, нигде.

Коментар порушує правила спільноти і видалений модераторами.

Имеет ли смысл отсылать резюме, если я заранее знаю, что не буду менять место работы?

Т.е. мне очень интересна Scala, и я слышал много хороших отзывов про вас лично, поэтому я хотел бы пройти этот курс. При этом я понимаю, что вашей компании не очень интересно забесплатно обучать сотрудников конкурентов на рынке труда, а обманывать кого-либо мне тоже не хочется.

Таких ситуаций уже несколько, надо подумать.

Аналогично. В курсе оч хочу участвовать, компанию менять не планирую. скайп olgagnatenko13, если что)

+1, я тоже такой. и знаю еще двух кто отправил заявку и того же мнения

+1 Иван, если примите решение делать онлайн курс (платный/бесплатный) — alexandr.romanyuk[at]gmail.com

Можно было взять всех, если бы можно было где-то получить большую аудиторию бесплатно. Скажем в Университете Радиоэлектроники или Инжеке (я рядом работаю, на Космической).
Но у меня там концов нет.

Плюсую тоже интересен этот вопрос.

У меня до сих пор есть сборки Ваших видео с курсов, с ютуба повыкачивал, и второй год храню) Все пересмотрел. Если б в Киеве были курсы, 100% пошел бы. Стиль преподавания мне очень нравиться. Надеюсь записи лекций тоже будут

Запись 10-12 лекций — это не дорогой, но трудоемкий процесс (как минимум задействован один «дополнительный человек», оператор и он же видео-монтажер). Если бы я был уверен, что у меня купят какое-то значительное количество подписок на видео, то можно было бы писать.
Но мы же не соберем 100 человек по 49$, скажем, а 500$ проще на основной работе заработать.

Вы, например, можете сделать отдельный кошелек/карточку и собрать туда донаты с условием заявки не меньше 50$, если соберете 5к, то запишите с оператором.
Или на udemy запостить пустой курс, там вроде мани бек есть, его всегда можно будет перевести и продавать для англоязычной аудитории.
Или просто поставьте штатив с мобильным телефоном и оденьте микрофон — альтруистический подход.
Или возьмите человека, который не пойдет к вам работать, прослушать курс, но с условием полного монтажа.
Или сделайте этот курс первым шагом в сферу корпоративных тренингов.

собрать туда донаты с условием заявки не меньше 50$,
Шо, опять?

это добровольное действие, никто никого не вынуждает принимать в нем участие.

Давайте проведем опрос — намерен ли кто-то сейчас тут в ветке хотя бы потенциально заплатить 50$ за видео курса. Я уверен, что не наберется даже 10 человек.
Вы предлагаете множество разных способов монетизации, но я работаю full time на проектах. Курсы — это часть моей работы (набрать под себя команду). Если необходимо не только «управлять оператором-монтажером», но и в дальнейшем переводить/раскручивать курс — то у меня просто физически нет времени.
.
P.S. Плюс этот курс будет в значительной мере дублировать мой курс на udemy: «Scala for Java Developers».

согласен на 50$ и даже больше за материалы по Real-time IO and Clustering

Привет,
Будет ли возможность просмотреть курс в записи?

Как записаться? я отправлял резюме на [email protected], но мне пришла ошибка и инфа что сообщение не отправлено

Там была опечатка, правильный имейл — [email protected]

Очень интересное предложение)

Всем спасибо, кто откликнулся! Напоминаю, что вы можете прислать мне на почту своё резюме в качестве заявки. А по всем вопросам писать в этом топике.

---
почта: [email protected] [email protected]

Ребята, прошу прощения. Почта — [email protected]
Спасибо, что сообщили.

Лучше бы Иван добавил почту и вобще контактную информацию и все такое в сам топик.

Скала опасна для мозга.
Например лектор вышеупомянутого курса пишет вот такой вот код:

public class MatchContainer implements StatsRegistry, LineupsRegistry, AreaRegistry, UserRegistry, TournamentRegistry, TicketRegistry, TableRegistry, ChatRegistry, BetRegistry, MatchEventRegistry, MatchReactor, ChatReactor, BetReactorThin, AreaReactor, TimeReactor { ... }

public class TournamentCollection implements TournamentRegistry, TicketRegistry, ChatRegistry, BetRegistry, TableRegistry, ChatReactor, BetReactorThin, MatchReactor, TimeReactor { ... }

По сути это попытка эмуляции cake-pattern’а в Java.
После скала некоторые люди не могут писать нормальный код, а только пускают слюни в припадках яростно бормоча что-то про монады, ковариантные функторы, паксос и лампарт клок.

p.s. Но как препода Ивана все хвалят и вполне обосновано.

Вы сейчас привели кусок кода из раннего прототипа (3 неделя) игрового сервера, который я писал в ноябре-декабре 2015 года.
И, нет, это — не cake pattern. Это I из принципов SOLID, который говорит


«Interface segregation principle»: many client-specific interfaces are better than one general-purpose interface.
---
Пояснение: прототип писался с проектированием снизу-вверх, начинался с монолита. Монолитом, ядром системы является игровой матч (MatchContainer), который является и хранилищем билетов (TicketRegistry), и хранилищем ставок (BetRegistry) и реагирует на события наступления новых моментов времени (TimeReactor). В виду того, что игровой сервер должен был держать 10к+ одновременных клиентов (REST-запросы + открытый WebSocket) — деление его на части с одновременной разработки многопоточной модели переносились на этап стабилизации требований.
---
Кстати, раз уж Вы пересели на этот проект — скажите, этот «корявый прототип» он ведь держит 10.000 одновременных клиентов?

Я не переседал. Просто немного помог друзьям по отдельным вопросам.

этот «корявый прототип» он ведь держит 10.000 одновременных клиентов?
Там от вашего кода и следа не осталось. Но вообще-то проблема 10к это проблемы 15 летней давности.
Это I из принципов SOLID, который говорит
Только вы забыли про:
Single responsibility principle
a class should have only a single responsibility (i.e. only one potential change in the software’s specification should be able to affect the specification of the class)

Который куда более важен чем ISP.

Там от вашего кода и следа не осталось. Но вообще-то проблема 10к это проблемы 15 летней давности.
На уровне OS — решенная проблема, но на уровне бизнес-логики она каждый раз решается по своему в рамках конкретного проекта.

Вот только по итогам «и следа не осталось» — так до сих пор и не взлетело.В теме этого проекта, наболело. Я считаю Ваши нападки на Ивана слегка over-reacting, извините

Кстати, раз уж Вы пересели на этот проект — скажите, этот «корявый прототип» он ведь держит 10.000 одновременных клиентов?
Вы так говорите будто это не 10.000 а 10.000.000 одновременных клиентов

А говорю как автор прототипа, который держит требуемую нагрузку, но некий комментатор со стороны придирается к стилю программирования.

Оправдать плохой стиль программирования требованиями к нагрузке можно, когда речь идет о миллионах юзеров.

Я в далеком 2005 году на старом добром C# писал игровой сервер, который тоже обслуживал больше 10К одновременных игроков, и для этого мне не приходилось жертвовать качеством кода

а только пускают слюни в припадках яростно бормоча что-то про монады, ковариантные функторы
Мне интересно, в жизни Вы тоже такой желчный? Вот что заставляет технических специалистов подбирать такие странные эпитеты?
.
Ковариантный функтор — это простейшая абстракция, которая существует десятилетия в мире FP (так же как полиморфизм в мире ООП). По сути — это наличие всего одного метода с определенной сигнатурой удовлетворяющего двум правилам.
.
Ковариантные функторы (Optional, Stream, ...) уже появились в Java 8. Что странного Вы находите в том, что бы использовать правильное именование для абстракции?
.
Кому интересно можете почитать статьи:
— «FP на Scala: Что такое функтор?»
— «FP на Scala: Invariant Functor»
в припадках яростно бормоча что-то про ... паксос
Опять мне решительно непонятен Ваш сарказм.
Если Вы используете RDBMS — Вы же находите нормальным иметь представление о уровнях изоляции транзакций и блокировках внутри базы? Ну хотя бы на уровне java.sql.Connection.getTransactionIsolation, java.sql.Connection.TRANSACTION_READ_COMMITTED, ....
Так и при использовании напрямую Apache Zookeeper/Apache Curator вполне нормально иметь представление о механизмах, на которых он основан.
.
P.S. Paxos — это наиболее популярный алгоритм поиска консенсуса (например, выбор мастера) а распределенной асинхронной системе. Его используют: Google Chubby, Google Spanner, Google Megastore, Ceph, Neo4j, Amazon Web Services, Apache Mesos и многие другие кластерные проекты. Zookeeper реализован на схожем алгоритме/протоколе Zab.
После скала некоторые люди не могут писать нормальный код

Это смотря с какой стороны посмотреть. Если пытаться писать поменьше мьютбл кода, то оно токо на пользу, имхо.
p.s. Но как препода Ивана все хвалят и вполне обосновано.
Вообще-то все хвалят...
Скала опасна для мозга.
...
После скала некоторые люди не могут писать нормальный код, а только пускают слюни

Scala здорово вдохновляет писать более качественный и красивый код на Java. Там действительно есть что позаимствовать и чем вдохновиться.

«Отличный» код, который показывает, насколько Go круче, чем Scala. В Go бы этот код выглядел вот так:

type MatchContainer struct { ... }
type TournamentCollection struct { ... }

И никаких интерфейсов, т.к. в Go не нужно перечислять интерфейсы, которые реализуются классом. Достаточно реализовать методы интерфейса, чтобы объект можно было использовать в качестве интерфейсных аргументов и переменных.

ужоснах, хорошо что в богоугодной ноде все намного проще и понятнее

function MatchContainer () { }

В Scala тоже есть Structural Types с поддержкой type cheching компилятором. Но не вижу причин не давать имя используемой абстракции?

Structural Types — это почти интерфейсы в гоу! А их можно объявлять вне определения функции? Типа:

type Quaker interface {
    Quack()
    Walk()
}

func QuackerQuack(q Quacker) {
    q.Quack()
}

func QuackerWalk(q Quacker) {
    q.Walk()
}

Стойте.
Давайте разберемся.
Существуют различные классификации систем типов, я сейчас обсуждал номинальные типы (типы с именами, например class/trait в Scala = применимость проверяется путем сравнения имен и отношений между именами = наследование, например) и структурные типы (без имен, применимость проверяется путем проверки наличия необходимых свойств (полей, методов)).
.
В Scala есть и то и другое.
.
Ваш пример похож на простое объявление интерфейса в Java или trait в Scala. Или я что-то не так понял.

Блин, забыл дописать самую главную часть кода:

// Define Duck and Frog implementing Quacker.
// There is no need to write 'implements Quacker' here.

type Duck struct {}
func (d *Duck) Quack() { fmt.Printf("I'm a duck") }
func (d *Duck) Walk() { fmt.Printf("Duck is slow") }

type Frog struct {}
func (f *Frog) Quack() { fmt.Printf("I'm a frog") }
func (f *Frog) Walk() { fmt.Printf("Jump") }

// Create a duck and a frog
d := &Duck{}
f := &Frog{}

// Duck and frog may quack
QuackerQuack(d)
QuackerQuack(f)

// Duck and frog may walk
QuackerWalk(d)
QuackerWalk(f)
и как надежно сохранять 1.000.000 сообщений в секунду.

Ну про это я бы и вне курса послушал.

Ничего себе у Вас там зоопарк. Страшно представить какие там суммы за сервера.

Это пиковые нагрузки, мы должны их держать, но пока физически у нас нет столько клиентов-рекламщиков.
.
Это множество очередей в Кафке (поток предложений о показе рекламы, поток наших ответов, поток информации о показах, ...) от SSP/DSP модуля к OLAP (Druid) + fequency capping по множеству счетчиков всех рекламных кампаний на основе HBase.
.
Зоопарк обусловлен тем, что прототип пишет контрактор, который уже 5 лет специализируется на рекламных highload проектах (его последний проект: 80к — норма, ударной нагрузке 320к при спайках).
.
Да, из-за счетов прямо сейчас переезжаем с Амазона на leaseweb.

Круто. Жаль что не вы пишете. Было бы интересно узнать чем обусловлен выбор тех или иных технологий.

Пишем — мы. Контрактор накидал только каркас приложения.
1. Есть «крутилка» (запрос-ответ), которая подключается по протоколу OpenRTB к биржам рекламы. OpenRTB реализуется поверх HTTP, соответственно, тут появляется Netty. «Крутилок» для масштабируемости много, для их координации используется Zookepeer/Curator. Часть информации по рекламным кампаниям берется из RDBMS (кэширована в памяти), а часть (frequency capping — это кластерные счетчики, скажем вот эту рекламу одному клиенту мы хотим показывать не чаще 2 раза в час, 5 раз в сутки и 10 раз в неделю) реализуется на HBase (контрактор мамой клянется, что это лучшее решение, мы сейчас перепроверяем).
2. «Крутилка» свои события (биржа предложила показать рекламу, мы сделали предложение по цене, она приняла/отклонила, клиент посмотрел рекламу, ...) гарантированно/персистентно передает на уровень real-time аналитики (передаем через Kafka — держит адовое кол-во сообщений, персистентна, может служить долговременным хранилищем (Каппа архитектура)).
3. События с минимальной задержкой (10-60 секунд) читает, индексирует и предоставляет для поиска Druid (site, github). Это open-source realtime OLAP созданная непосредственно рекламщиками (Metamax) для подобной аналитики.

А. Супер.

для их координации используется Zookepeer/Curator.
О какой координации речь?
реализуется на HBase (контрактор мамой клянется, что это лучшее решение, мы сейчас перепроверяем)
Крутилки расбросаны по регионам или в одном дата центре?
для поиска Druid
Мы смотрели его для себя. Слабоват он был.
тут появляется Netty
Кста, как раз сегодня на хабр по нетти написал статью — habrahabr.ru/post/277695 может и вам пригодится.
80к — норма, ударной нагрузке 320к при спайках

Это на каком количестве физических серверов держится такая нагрузка?
У нас собирается до 100К событий в секунду на одном сервере. События поступают из миллиона одновременных keep-alive http и https соединений. Все собранные события парсятся и записываются в базу данных. При этом нагрузка на проц не превышает 25% в пиках.

Жаль что Харьков:(

Круто, хоть в Харьков переезжай)
А будет он-лайн вариант для тех, кто не сможет пройти курс в оффлайне?

Куда резюме слать?

Иван, здорово. Нельзя — ли пройти курсы оффлайн?

Иван, а будет ли запись этих курсов?

Расскажите вкратце — в чем преимущества реализации highload проектов именно на Scala?

1. JVM — это хорошая, отлаженная виртуальная машина. Нормально реализованы обычные «больные места» — выделение памяти (thread local allocations buffers), GC на больших кучах (несколько уборщиков мусора на выбор + множество параметров для настройки) и многопоточность (спецификация (New JMM), примитивы в языке (volatile, synchronized), стандартная библиотека (java.util.concurrent, Fork/Join, Parallel Streams)).
2. Scala — богатый по возможностям способ эксплуатации JVM. Наравне с полноценной ООП-моделью, которая практически один-в-один ложится в байткод — есть полноценная FP-модель. Есть развитая система типов (наравне с «классикой» (наследование, области видимости, каррирование, функции высших порядков, ...) присутствуют генерики высших порядков, зависимые типы, макросы, ...)
3. У Scala очень детально прописаны механизмы интеграции с Java (скажем как выглядит object или trait с полями из Java или как выглядят static-поля из Scala).
---
Кратко — JVM хороша для highload, а Scala хороша для написания инструкций под JVM.

А каких из этих преимуществ нету у других платформ?

У каких конкретно?

1. На моём прошлом проекте на C# (asmx) +SQL Server — я делал серверис (банерокрутилку для популярного online casino) который обслуживал ~ 1 200 000 запросов в сутки.
При этом- как обычно водится в ынтерпрайзе- бизнес логика была очень сложная и запутанная.
Всё это хостилось на 3 серверах: SQL Server + 2xIIS
Нагрузка на CPU (для IIS)в среднем была ~27% т.е. Всё тот же сервер мог обслудивать в 4 раза большую нагрузку

2. На текущем проекте обрабатываем 1700 банковских транзациий в секунду.
Всё это крутится на WCF+SQL Server+ Redis+Mongo DB

Это я к тому- что highload вполне себе делается на .Net без особых проблем.

обрабатываем 1700 банковских транзациий в секунду.
надежно сохранять 1.000.000 сообщений в секунду.
1.000.000 сообщений в секунду
Ну тут конечно звучит громко.
Выходит Иван пилит проект покрупнее stackoverflow.com
Согласно Alexa- stackoverflow.com занимает 5 место по популярности, ребята stackoverflow представили статистику Выходит что 209,420,973 (+61,336,090) HTTP requests to our load balancer /86400 (seconds in one day) = 3314 request per second.
Т.е. если 5 в мире сайт по популярности обслуживает 3k запросов в секунду- то
1.000.000 сообщений в секунду
это наверное какой нибудь гугл поисковик.

1M в секунду на синтетических тестах вполне реально что для JVM что для .NET
Но в реальности- таких проктов можно на пальцах одной руки пересчитать.

1.000.000 сообщений в секунду
та я тоже как то ни понимаю, или нули там лишние или хз, типа для аналитики тьму инфы сырой херячить...
1M в секунду на синтетических тестах вполне реально что для JVM что для .NET
и шо там за кластер должен быть ?
З.Ы. може 1 реквест это не «1 сообщение», хз

мы запускали стресс тесты на:
2 железных серверах Win2012+железный load balancer
с макс нагрузкой ~500K в секунду. На серверах asynchronous WCF (IIS). Железо мощное- но точные характеристи не знаю.
Больше 500К потолок для нашей сети. Т.е. уперлись в пропускную способность сети связываюшую наш офис и датацентр

Выходит Иван пилит проект покрупнее stackoverflow.com
Это разные типы проектов принципиально.
На stackoverflow
1) ходят люди
2) это один конкретный сайт, хоть и очень популярный
А мы в перспективе подключаемся к крупнейшим мировым биржам рекламы, где
1) рекламу нам предлагают «роботы»
2) биржи рекламы агрегируют значительную часть рекламного мирового трафика
---
Пример: google.com отвечает, примерно, на 60к запросов в секунду (от людей всего мира), а принципиально купить можно порядка 1м рекламных показов в секунду (от всех рекламных бирж которые собирают весь рекламный трафик всех сайтов с рекламой, включая гугловский, фейсбуковский, ...).
1.000.000 сообщений в секунду
1. Это не количество внешних запросов, это пиковое количество внутренних сообщений (на один внешний запрос пишется несколько сообщений в разные очереди — какое нам сделали предложение, как мы ответили, что мы показали если выиграли в торгах, ...).
2. Это пиковые нагрузки, которые нам надо держать в тестах, что бы быть гарантированно стабильными в production. google.com имеет 60к запрос в секунду, но держит — заметно больше (полагаю минимум в 2-3 раза точно).

Если мелкомягкой инфраструктуры нет, то на нее могут просто не захотеть завязываться.

Если мелкомягкой инфраструктуры нет
Согласен.
Пишут на том — что умеют- и что имеют под рукой.

Дело даже не в том что есть под рукой, просто например потратив 50к на лицензию какой-то БД, и потом не использовать все ее плюшки глупо, и принять факт что бд не подходит под задачи и надо nosql ой как больно будет...

50к на лицензию какой-то БД, и потом не использовать все ее плюшки глупо

Обычно когда ничинают проект с ожиданиями 1M req/sec- то делают всякие R&D имеющихся tools, пишутся тесты на производительность, читаются лицензии, считается совокупная стоимость владения, стоимость поиска спецов и их содержание и тд.

И никто вас не заставляет покупать оракл или sql server. Всегда можно взять PastgreSQL, MongoDb — да вообще что угодно.
Вы свободны в выборе. Я лишь говорю что на .Net вполне пишут highload проекты.

бд не подходит под задачи и надо nosql
А можно конкретный пример где «скл» конкретно не подходит под задачи и надо «носкл» ?

Да нет сейчас таких задач.
Обычно аргументируют тем что json универсальный формат для nosql- типа ненадо преобразовывать.. для передачи на клиент.
Тот же PostgreSQL уже умеет неструктурированные данные хранить. и запросы принимать через json

Вообщем, NoSql используют ниосиляторы RDBMS или когда данные не совсем критичные- и вполне допустима потеря части данных.
У нас в проекте кластер монга для складирования логов технических. даже если и потеряем логи за неделю- ничего смертиельно не произойдет.

В целом — да.
Это не холиварный вопрос был, а практический — на чем можем писать сейчас.

Ну основные претензии:
— малое количество open source highload библиотек (Kafka — на Scala от LinkedIn, Cassandra — на Java от Facebook, Spark — на Scala от Berkeley, ...)
— малопопулярность F# как языка в сравнении со Scala (могу ошибаться)
— JVM на Linux (стандарт de facto для серверсайд программирования) более распространена чем .NET

Насколько мне известно, у Go есть более существенные преимущества для highload проектов:
— DevOps-friendly. Программа на Go — это один бинарник без каких-либо внешних зависимостей. Поэтому Go-программы элементарно обновлять и роллбэчить без всякого jar+jvm hell’а на произвольном количестве серверов. Причем также легко и непринужденно можно обновлять рантайм при выходе новой версии гоу — просто перекомпилируешь программу с помощью нужной версии компилятора. В java вроде с обновлением рантайма (JVM) бывают очень серьезные проблемы, поэтому многие до сих пор сидят на Java 7 или даже Java 6 в то время, как уже давно вышла Java 8 с кучей полезных фич.

— Многопоточный код на Go не только проще и понятнее кода на Scala, но и быстрее до 10 раз. Более простой код означает меньшее количество багов и скорейшее внедрение новых фич. Более быстрый код означает меньшие расходы на хостинг.

— Программы на Go потребляют намного меньше памяти программ на Java. Например, сейчас у нас в продакшн работает сервер на Go, который одновременно держит миллион http keep-alive соединений. При этом потребляет всего 10Гб памяти, т.е. по 10Кб на коннекшн. Думаю, для аналогичного сервера на JVM потребовалось бы минимум в 10 раз больше памяти.

— GC в Go настраивается с помощью одного параметра — GOGC:


The GOGC variable sets the initial garbage collection target percentage. A collection is triggered when the ratio of freshly allocated data to live data remaining after the previous collection reaches this percentage. The default is GOGC=100
. Слышал, что количество настроек GC в JVM достигает пары сотен, а оптимально затюнить их могут только Senior JVM GC спецы после успешной сдачи соответствующих экзаменов.

— Максимальное время задержки исполнения Go кода в каждом потоке в связи с работой garbage collector’а составляет 35мс при 256Гб хипе. Боюсь представить, какие задержки будут в JVM на дефолтных настройках GC при таком размере хипа :)

Пойди помоги дядьеке собрать программу лучше, у него что-то не получается apm-linux.blogspot.com/...ang-depency-hell.html?m=1

vendoring? Не, не слышал.

Похоже о нем там же не слышали армия Гоубоев быдлокодеров, которым не чужд принцип хуяк-хуяк и в продакшин. Собственно когда сама платформа обязывает к этому отсутствием версионности пакетов, ничего на ум не приходит кроме народной мудрости: «простота хуже вороства»

Причем также легко и непринужденно можно обновлять рантайм при выходе новой версии гоу — просто перекомпилируешь программу с помощью нужной версии компилятора.
Гоу стронг, кококо

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

В java вроде с обновлением рантайма (JVM) бывают очень серьезные проблемы
Один мой знакомый рассказал, что один его знакомый рассказал ему, что недавно одна небольшая компания, в которой на джава написано больше кода, чем украинский аутсорс написал за последние 15 лет, легко и непринужденно *полностью* перешла на новую версию джавы. Шах и мат, гоуисты!
— Многопоточный код на Go не только проще и понятнее кода на Scala
Эскобар.джпг

Почему, например, не сравните по понятности с C#?

но и быстрее до 10 раз
А почему вы процедурный недоязык сравниваете с функциональной конфеткой? В соседней теме вам уже дали ссылку, где гоу на бенчмарке сливает сразу джаве, дотнету и ноде.
— Программы на Go потребляют намного меньше памяти программ на Java. Например, сейчас у нас в продакшн работает сервер на Go, который одновременно держит миллион http keep-alive соединений. При этом потребляет всего 10Гб памяти, т.е. по 10Кб на коннекшн. Думаю, для аналогичного сервера на JVM потребовалось бы минимум в 10 раз больше памяти.
А почему не в 100 раз? Вы тест проводили или высосали из пальца?
— Максимальное время задержки исполнения Go кода в каждом потоке в связи с работой garbage collector’а составляет 35мс при 256Гб хипе. Боюсь представить, какие задержки будут в JVM на дефолтных настройках GC при таком размере хипа :)
И какие там задержки? Что в JVM нет поколений? Нет сборки мусора, которая не блокирует выполнение потоков? Серьезно спрашиваю — в дотнете это все было 10 лет назад, неужели в JVM не запилили?
Т.е. пока что легко и непринужденно можно обновлять только минорные версии, что будет с мажорными апдейтами никто не знает, и нет данных, чтоб утверждать, что это будет легко.
Никто не гарантирует, что со следующим мажорным релизом весь гоукод не прийдется переписать, как случилось с питоном в свое время

Мажорных версий не предвидится в обозримом будущем. См. слайды 38-39 из презентации go 1.6 от Брэда Фицпатрика (да-да, того самого, что подарил нам memcache и livejournal).

легко и непринужденно *полностью* перешла на новую версию джавы

Рассказывайте сказки где-нибудь в другом месте :) Если бы все было так просто, все бы давно сидели на восьмой жаве, т.к. в ней полно киллер-фич по сравнению с семеркой.

Почему, например, не сравните по понятности с C#?

Сравните — код на Go, код на C#. Где понятнее?

И какие там задержки? Что в JVM нет поколений? Нет сборки мусора, которая не блокирует выполнение потоков?

Вот такие (для java):

— как уменьшить GC паузы на больших хипах. Содержит познавательную инфу, откуда берутся GC паузы в java, а также типичные советы по тюнингу десятков параметров, влияющих на работу GC.
— как бороться с *одноминутными* GC паузами на 10Гб хипе. Какие-то китайцы предлагают использовать их JVM, в котором они клянутся, что «проблема с GC паузами решена».

И такие (для C#):

— как мы уменьшили GC паузы в .net :

In one setup, the maximum pause dropped from 2 seconds to 600 milliseconds (70% reduction). In another, it dropped from 1.3 seconds to 400 milliseconds (70% reduction).

Разработчики .net гордятся уменьшением пауз до полсекунды на хипе в 2ГБ, в то время как в гоу GC паузы в 20 раз меньше на хипах в сто раз больше.

Мажорных версий не предвидится в обозримом будущем
Просто лол, так и про джаву говорили в 95 году
Рассказывайте сказки где-нибудь в другом месте :) Если бы все было так просто, все бы давно сидели на восьмой жаве, т.к. в ней полно киллер-фич по сравнению с семеркой.
newsonline24.com.ua/...ne-verju-vy-vse-vrete.jpg
Сравните — код на Go, код на C#. Где понятнее?
Эскобар.джпг

Я так понимаю, это единственный проект, написанный на гоу, если на него гоубои уже 20-й раз за неделю ссылаются?

Разработчики .net гордятся уменьшением пауз до полсекунды на хипе в 2ГБ, в то время как в гоу GC паузы в 20 раз меньше на хипах в сто раз больше.
Там нет речи о том, какого размера хип, только упомянуто что есть отдельный юз кейс для объектов больше 2ГБ.

Если на то пошло, то

— Максимальное время задержки исполнения Go кода в каждом потоке в связи с работой garbage collector’а составляет 35мс при 256Гб хипе
абсолютно бесполезная инфа, без указания того, какие объекты создаются и как друг на друга ссылаются, как часто происходит сборка мусора.

В дотнете можно тоже насоздавать больших объектов в LOH, на сборку мусора даже 35 мс не нужно будет.

Я так понимаю, это единственный проект, написанный на гоу

Есть еще Docker. Слышали про такой?

абсолютно бесполезная инфа, без указания того, какие объекты создаются и как друг на друга ссылаются, как часто происходит сборка мусора.

Код бенчмарка тут.

Мажорных версий не предвидится в обозримом будущем. См. слайды 38-39 из презентации go 1.6 от Брэда Фицпатрика (да-да, того самого, что подарил нам memcache и livejournal).
Кстати, пока мы слышим только разрывающиеся пуканы фронтендщиков, которым гугл запилил несовместимый Angular 2. Им тоже мажорных версий не предвиделось в 2009-м :)
но и быстрее до 10 раз.
1. Ну во-первых, этот код меряет скорость размножения «потокоподобных сущностей» (потоки, гоурутины, акторы, ...).Это крайне странная характеристика — обычно меряются либо скоростью переключения между потоками (у нас уже есть есть 100к keep alive соединений, но на надо переключаться между потоками их обслуживающими 100к раз в секунду, если по каждому приходит 1 пакет в секунду) либо скоростью обмена данными между потоками, скажем 100 потоков ставят в круг и передают растущий счетчик.
Хотя и эти тесты не говорят про «скорость работы потоков».
2. Во-вторых, я (по Вашей ссылке) вижу следующее
— RxJava: 219 ms
— Go: 979 ms.
— Scala/Akka: 6379 ms
RxJava бьет Go в 4 раза, а Akka проигрывает в 7 раз.
Ну во-первых, этот код меряет скорость размножения «потокоподобных сущностей» (потоки, гоурутины, акторы, ...).Это крайне странная характеристика — обычно меряются либо скоростью переключения между потоками (у нас уже есть есть 100к keep alive соединений, но на надо переключаться между потоками их обслуживающими 100к раз в секунду, если по каждому приходит 1 пакет в секунду) либо скоростью обмена данными между потоками, скажем 100 потоков ставят в круг и передают растущий счетчик.

Так этот тест как раз меряет все вместе:
1) скорость создания и уничтожения потоков — за время работы бенчмарка создается и уничтожается 1111111 потоков — на первом уровне создается один поток, на втором — 10, на третьем — 100 и т.д. до миллиона.
2) скорость передачи сообщений между потоками — за время теста передается 1111111 сообщений — каждый созданный поток возвращает родительскому потоку сумму всех чисел, которые ему вернули дочерние потоки.
3) скорость переключения между потоками. Передача сообщения в родительский поток происходит синхронно через блокирующий channel. Поэтому при каждой передаче сообщения происходит минимум два переключения между потоками: child отправил сообщение parent’у, произошло переключение на parent, тот считал значение, после чего channel разблокировался, что привело к переключению на child.

RxJava бьет Go в 4 раза, а Akka проигрывает в 7 раз

Там дальше есть результаты на Ubuntu, где разница между Scala и Go — 10 раз.
Что касается RxJava, то это не совсем честный бенчмарк, так же как и .net, т.к. ни там ни там родительский поток не создает дочерние потоки и не ждет от них сообщений прежде чем вернуть сообщение своему родительскому потоку.

Думаю, для аналогичного сервера на JVM потребовалось бы минимум в 10 раз больше памяти.
Ну я вот вижу «12 Million Concurrent Connections with MigratoryData WebSocket Server» на JRE 1.7.
На TCP соединения JVM практически не тратит памяти, мы фактически имеем в руках некие дескрипторы на структуры OS, полагаю как и в Go.
Масса TCP-соединений — это не свойство языка, а операционной системы.

Спасибо за ссылку на классную статью! Там есть еще более интересная статья по тюнингу сервера под большое количество TCP подключений — mrotaru.wordpress.com/...how-migratorydata-did-it .

Что касается количества одновременных TCP-соединений, то в нашем сервере каждое соединение обрабатывается отдельным потоком с помощью обычных блокирующих чтения и записи в сокет. Это делает код простым и понятным по сравнению с асинхронным чтением/записью в сокет, которое обычно используется в рантаймах с дорогими потоками типа JVM. Но в этом решении есть один минус — для каждого потока нужна дополнительная память под стек. Минимальный размер стека для потока в Go составляет 2Кб. Получаем оверхед минимум в 2Гб на миллион подключений. Считаю, что это хорошая цена за избавление от написания и поддержки сложного асинхронного кода с event loop’ами, callback’ами и state machine’ами.

по сравнению с асинхронным чтением/записью в сокет, которое обычно используется в рантаймах с дорогими потоками типа JVM
Считаю, что это хорошая цена за избавление от написания и поддержки сложного асинхронного кода с event loop’ами, callback’ами и state machine’ами.
Мы работаем с NIO/NIO.2 посредством Netty — это de facto стандарт для работы с неблокирующими асинхронными сокетами под JVM. Так что немного проще, но код, конечно, жутковатый выходит.

Скала «заставляет» писать immutable код
А он не нуждается в синхронизации для многопоточности

Джава изначально ориентирована на императивный стиль
Можно конечно immutable и на java делать, но...

Скала «заставляет» писать immutable код
Мое личное ощущение — нет, не заставляет.
— Есть модификатор val но есть и var.
— Есть немутирующие коллекции, а есть и мутирующие.
— Есть акторы, а есть и потоки.
.
Т.е. Scala тут мультипарадигменна, в «худшем» смысле этого слова (как C++).

Ну, я даже не знаю что и возразить :) :) :)

Я обеими руками ЗА immutabity.
.
Просто вот смотрю самую базовую книгу по Scala от Одерского («Programming in Scala»), первую же главу и вижу:


var capital = Map("US" -> "Washington", "France" -> "Paris")  
capital += ("Japan" -> "Tokyo")
println(capital("France")) 

  actor { 
    var sum = 0
    loop {
      receive {
        case Data(bytes)       => sum += hash(bytes)
        case GetSum(requester) => requester ! sum
      }
    }
  }
и так далее.
.
Хотя во многих местах Scala конечно же толкает к использованию iimutable данных (яркий пример — неявно val-поля у case classes).

Да, я знаю. На джава можно писать в стиле private final и будет immutable
вопрос в том к чему подталкивает язык

вед в ЖЖ можно писать сообщения 140 символов?
а в ФБ глубокомысленные посты аля ЖЖ?

Но это недоказуемо, а холиварить не хочу

Но это недоказуемо, а холиварить не хочу
Я же не за сферические холивары в вакууме. Если я увижу ссылки на мнение авторов языка или на рекомендации к использованию от крупных компаний (Twitter, Facebook, LinkedIn, Google, ...) - я с удовольствием с Вами соглашусь.
.
Но пока я вижу мультипарадигменный язык. Кто-то хочет акторы и иммутабилити, а кто-то шарит мутабельные структуры данных между потоками.

Вот открываю Finagle от Twitter:


  private[this] var accumulated: Buf = Buf.Empty
  private[this] val NoFrames: IndexedSeq[T] = IndexedSeq.empty[T]

   val result = new Array[T](length / frameSize)
      var sliceIdx = 0
      var resultIdx = 0
      while (sliceIdx + frameSize <= length) {
        val slice = merged.slice(sliceIdx, sliceIdx + frameSize)
        result(resultIdx) = decodeFrame(slice)
        sliceIdx += frameSize
        resultIdx += 1
      }

Вот открываю Kafka от LinkedIn:


    @volatile var requestDequeueTimeMs = -1L
    @volatile var apiLocalCompleteTimeMs = -1L
    @volatile var responseCompleteTimeMs = -1L
    @volatile var responseDequeueTimeMs = -1L
    @volatile var apiRemoteCompleteTimeMs = -1L

private var responseListeners: List[(Int) => Unit] = Nil

Вот даже целая глава от Одерского (“Chapter 18 of Programming in Scala. Stateful Objects”):


In previous chapters, we put the spotlight on functional (immutable) objects. We did so because the idea of objects without any mutable state deserves to be better known. However, it is also perfectly possible to define objects with mutable state in Scala. Such stateful objects often come up naturally when you want to model objects in the real world that change over time.

Предполагаю в течении 10-15 дней.

«в течение» течение времени..

Странно для меня, но да.

Java и

100k request/second в области интернет-рекламы
несовместимы. Лучше используйте что-то человеческое, типа Node.js

это

100k request/second
и криворукость не совместимы

Ну с таким подходом можно писать на чем угодно. А скала это для ботаников, которые мнят из себя тех кто находится в 5%

Под «ботаниками» Вы имеете в виду людей с высоким уровнем интеллекта, математическим складом ума и склонных к самообразованию?
А как тогда назвать их антиподов? «Пацанчики с райончика»? Семки, барсетка, адидасы?

Себя не похвалишь, никто не похвалит.
А передергивать не надо.

А как тогда назвать их антиподов?
ноджээсниками
pp.vk.me/...606/284b6/ylXik6yyFG0.jpg

Я считаю языки без mutated shared state (в том или ином виде — mutated memory, actor state, transactional memory) между потоками — детским лепетом в эпоху многоядерности. Связывание рук на уровне языка — плохая стратегия.

1. Нам нужны специальные люди на специальные проекты. Таких лучше ловить на знания, а не на печеньки и фитнесс-залы.
2. Мне нравится самому изучать современные сложные вещи + работать с людьми со схожими ценностями.

Запишусь. Интересно будет послушать.

У який час будуть проходити курси?

Вечером, после работы.
Предположительно пару раз в неделю 19.00:21.00.

А какие минимальные требования к кандидатам?

Единственное требование — адекватно ответить на три письменных задания по основам computer science. Предварительно будет общий сбор в Харькове в аудитории — час на решение + час на рассказать о проекте.
Задания в процессе формулировки, предположительные темы — рекурсия, типы данных, параллельные алгоритмы. Скорее всего будут даны примеры кода на неведомом языке программирования и вопрос — что он выведет.
Задания пока в процессе уточнения, необходимо отобрать слушателей способных быстро изучить сложные предметы + тех, кто детально разбирался в основах до этого момента.

А как насчёт стипендии?

Мы можем.
Только объясните, за что платить стипендию?

Это виртуальное обучение или по месту ?

В аудитории.
Мы набираем себе сотрудников, люди, которые не могут находить в Харькове в период обучения, скорее всего, не пойдут к нам работать.

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

— Netty, Zookeeper
— Kafka, HBase
— Druid (real-time OLAP)

А нафига это все нужно? Всмысле чтобы читать про это отдельно?
Даешь курс по теории категорий.

Это наш стек.

А, это на внутренний проджект, ясно.
Тогда расскажите в чем прикол такого подхода ? не проще ли взять толкового, самообучающегося джава-синьйора, пусть сам все изучит ? Чем городить какието курсы, которые никому (с точки зрения применения) особо и не нужны ?

А мы и готовы взять толкового Java Senior-а без обучения прямо сейчас.
.
Но если нас устроит толковый Junior/Middle — то эффективнее быстро передать нашу экспертизу и причины тех или иных решений в рамках серии докладов. Вот обучение и будет в виде таких докладов.
.
Плюс в рамках таких сессий мы акцентируем внимание именно на тех моментах, которые нам важны. Просто так, скажем, Netty — это весьма объемная библиотека.
.
Ну и Scala однозначно быстрее обучить, а не отдать приказ — учи Скала, толковый сеньор.

Ну и Scala однозначно быстрее обучить, а не отдать приказ — учи Скала, толковый сеньор.
Ну при наличи толковой программы, это несомненно. Я уловил суть вашей темы.
Обучать синьйоров (ну или там мидлов/джунов) уже принятых на работу, в рамках работы. Но заявлять про какието халявные курсы на весь доу... както это низко-дешево, чтоли. Хотя, глядя, на количество отзывов в теме, маркетинг конечно работает.

Курс будет читаться для 10-50 человек.
А возьмем несколько по результатам того, кто как успел выучить Scala и понять фреймворки.

Даешь курс по теории категорий.
Будет кратко объяснена и теория категорий, но с примерами исключительно для конкретной cartesian closed category (категории множеств).
.
В качестве базового материала я бы взял «Basic Category Theory for Computer Scientists» Пирса.

Update:
---
Программа по Netty:
— SEDA архитектура и Netty threading model
— IO, NIO, NIO.2, epoll, Channel/Selector abstractions, Reactor/Proactor patterns
— Netty memory-management module, off-heap memory
— Upstream/Downstream pipeline, EventLoop
— Demo: HTTP 1.1 Server

Update:
---
Программа по Druid:
— Лямбда и Каппа архитектуры
— Роли: Runtime, Historical, Coordinator, Broker
— Runtime: прием, индексация и поиск по потоку данных
— Historical: manager of petabyte storage
— Broker: query distribution, balancing, caching

Ух ты ж черт. Такая интересная тема и от такого известного лектора — это фантастика. Но стремно :)
Иван, скажите, курс для совсем не умеющих в ФП или надо уже что-то понимать, чтобы попасть?

Предварительного знания FP не требуется. Изучаем сразу одновременно со скалой.

а что там за история с деньгами за курс скалы?

Возобновил дописывание курса.
.
Этот оффлайн курс будет доступен в записи слушателям.

Это ссылка на курс, который я должен дописать.
По которому долг.
---
Новый курс
1. еще только будет читаться (в ближайшее время)
2. проходит в реале (в аудитории)
3. бесплатный
---
Он читает в рамках создания профессионального скала-отдела в компании. Бесплатно — что бы иметь больший выбор для найма новых сотрудников.

Мы столкнулись с тем, что на рынке нет сотрудников с подходящей квалификацией и «ценой». Или мы плохо их ищем.
Курс в реале — это способ одновременно и растить и хантить.

ну это называется протупить и писать на не мейнстрим технологии. скала типа будущий мейнстрим, а пока только баз-ворд, она только взлетает и на рынке процентов 5 или даже 3 програмистов кто может на ней писать. Вы когда людей научите они от вас поуходят, что бы не уходили нада на 20-30 процентов выше рынка платить, и опять всплывут проблемы не мейнстрима. так бывает когда технари перемогли бизнес менеджеров и сами выбрали на чем писать.

ну это называется протупить и писать на не мейнстрим технологии.
Решительно не согласен с Вами.
Да, Java — самый популярный язык программирования в мире, например, по индексу TIOBE.
Но граница между двумя JVM-языками Java и Scala — иллюзорна. Это одна виртуальная машина, один байт код и отличная совместимость.
Можно назвать это ответвлением Java8++, можно — Haskell over JVM.

Хотя наши продукты написаны на Scala — они принимают HTTP-трафик посредством Netty — написанной на Java. Это все одна JVM. В Scala работают и Maven/Spring/JUnit.

можно — Haskell over JVM.
github.com/scalaz/scalaz ?
решили обучить писать не читаемый код ? :D
можно — Haskell over JVM.
github.com/scalaz/scalaz ?
решили обучить писать не читаемый код ? :D
Odersky четко разделил, что есть уровни знания application developer: A1/A2/A3 а есть — library developer L1/L2/L3.
Scalaz, наравне с более современно Cats — это библиотеки категориальных абстракций для Scala. Это уровень library developer, это просто не надо использовать для разработки простого Web-server.

Скажем, twitter считает, что для концепции микро-сервисов вполне хватает функций высшего порядка («Your server as a function»).
Хотя некоторые извращенцы с ним не согласны («Pro Scala: Monadic Design Patterns for the Web»).

помню беседовал с одним стартапом, они хотели писать музыкальный живой стриминг сервис на руби. я спрашиваю почему на руби ? они говорят — вот этот чувак у нас очень шарит руби и говорит что руби это лучший язык для стриминга. Я у них спрашиваю — а если вдруг чувак от вас уйдет, ну денег больше или в другую страну переедет или домой к себе поедет, кто дальше будет на руби писать ? С точки зрения бизнеса скала не самый удачный выбор, потому что если вдруг Иван Головач и еще один сеньйор уходят из компании компания вообще может загнуться , или может это никак не отразится на скорости баг фикса и выпуска новых фич ?

Я у них спрашиваю — а если вдруг чувак от вас уйдет, ну денег больше или в другую страну переедет или домой к себе поедет, кто дальше будет на руби писать ?
А что это за странный город такой, что прямо в нем острая нехватка специалистов на Ruby? Что-то я не слышал, что это такой сложный язык, что на нем бывает, что в городе всего 2 спеца.

речь про стартап, они не платят большую зарплату на первых этапах, они обещают акции или доли.

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

или может это никак не отразится на скорости баг фикса и выпуска новых фич ?
У нас специфичная ситуация, мы — не оутсорс. Если мы выскакиваем на «рынок красиво», то компания зарабатывает на продажах продукта и на его использовании (у нас есть отдел рекламщиков, на них и тестируем). Т.е. критически важен time to market.
.
И Скала-программистов, на самом деле, достаточно много, около 5% Java программистов переходят или изучают Scala. Язык — улучшенная Java, а экосистема — на 50% пересекается.

так отразится ваш уход или не отразится ?

После того как будет собрана и обучена команда — не очень.

Haskell over JVM.
github.com/Frege/frege — вот хаскель на jvm)
а скала — это наверное скорее ocaml для jvm
и на рынке процентов 5 или даже 3 програмистов кто может на ней писать
Так миру и не надо 40% функциональных программистов! У многих просто желания не хватит или мозгов. Этот не тот случай, когда годность для высокоспециализированных задач меряется долей рынка. То, что Ariel и Taid держат половину рынка — не делает их лучшими стиральными порошками.
Вы когда людей научите они от вас поуходят
У нас есть задачи под такие нагрузки. Если они уйдут, скажем, в Киев в megogo — буду только рад.

ну круто, а то тут люди бегали жаловались что ты им скалы не додаешь )))

Иван взял за курс деньги, обещал сделать весь курс за полгода. Сейчас даже первая часть ещё не готова, а прошло уже больше года. Иван Головач — знатный разводила.

Куда слать резюме?)

HR
---
почта: [email protected]
тел: 067-776-93-63
P.S. Похоже кто-то забыл эйчару сделать корпоративную почту:)

Сколько длится курс

Предварительно: 10-12 лекционных занятий, потом отбор и те, кто примет наше предложение о работе продолжат практические занятия уже на живом проекте.

Иван, я рад, что Вы снова взялись за обучение! Записался на курс.

а те, кто не прошёл отбор — пойдут в Гугл писать на Го
(навеяло темой про ниасиливших Скалу)

Не буду говорить за весь гугл, но тот что в Долине не особо пользует go.
Здесь все также главенствует java, C++.
После ухода Guido- новые проекты на python больше не пишут. Т.е. Если хочешь работать над новым- то на выбор С++, Java, Go Lang. В рекламу Go Lang вкладывают большие средства- но в самом гугле- его очень мало используют.

В рекламу Go Lang вкладывают большие средства
Это вы окуда узнали? Почему мне до сих пор ничего не перепало из этих средств?

Я думаю ты получишь свои деньги как только оставишь го в покое.

Ваня, а как быть тем кто хочет по Scala послушать и по Bigdata но к вам точно не собирается идти работать? ;)

Привет.
Надо подумать.

Ждём ответа:)

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