Всегда умиляло, когда нескалисты говорят «да там в восьмой джаве завезли лямбды и стримы, скала больше не нужна». И потом начинают сравнивать map/flatMap в языках. Ну здорово, теперь ламбада-функции есть и в джаве, искренне рад. дукалис.jpg
Вот только никто почему-то не вспоминает про работу с асинхронностью с Future as monad из коробки.
Или про тайп-классы на имплиситах, которые позволяют писать какие угодно дженерик решения для любых
типов (да, да, даже для сторонних, стандартных, whatever, и всё это без оберток).
Или про type-safe парадигму в скале, когда, во многом благодаря той самой «переусложненной» системе типов, можно смотреть на List[Any] или касты .instanceOf как на недоразумение неопытного разработчика.
И да, работу на скалке тоже можно найти. И, что характерно, вероятно, что вы окажетесь в опытной и сильной команде, у которой всегда можно чему-то научиться, что должно быть, по моему мнению, решающим фактором на любой работе. И это по той простой причине, что порог вхождения в язык находится выше уровня «копипаст со stackoverflow, херак и в продакшн».
Имхо, тот график с удовлетворенностью разработчиков языком говорит больше, чем вся статья и холивар вокруг.
На моей памяти, это первый язык, который у меня не вызывает приступов ненависти даже спустя три года, что для любой технологии в наше непростое время — невиданное явление.
До тех пор, пока вы 2+2 складываете, бойлерплейт с Future действительно кажется лишним. А если я хочу N параллельных запросов в базу отослать? Это мне N потоков руками запускать и их контролировать, синхронизировать результат выполнения и вот это всё. Хоп, и уже всё не так радужно с блокирующим подходом.
У нас на nginx включен лог медленных запросов (> 5 сек afair). При этом приложение на такое отвечает за миллисекунды. Оставшееся время — проблема сети.
Проблемы с IPSec. Не смотря на все заявления о том, что воздействие минимальное, наблюдаем, что порядка нескольких процентов трафика через manageable network тормозятся. Да так, что nginx кричит матом. Делаешь host network у контейнеров — всё ок. Либо дело в их встроенном load balancer'e, который простой как квадрат и основан на HAProxy, либо в сетевом стеке ранчера (что более вероятно).
Еще часто ранчеру сносит башню при апгрейде контейнеров приложения. Он просто не может выкачать новый образ контейнера и впадает в бесконечный цикл. Но тут может быть дело в самом докере, хотя до ранчера никогда такого не наблюдал. Помогает только ребут всего хоста. Даже перезапуск докер демона не помогает.
Из плюсов:
Благодаря как раз таки автоматическим LB из коробки, позволяет весьма прилично экономить на железе, работая через spotinst.com (это который для амазоновских спот инстов)
Удобный мониторинг и полуавтоматический zero-downtime апгрейд сервисов из коробки.
Никаких плясок с бубном при поднятии ранчера — сами агенты и основной мастер работают как докер контейнеры, т.е. система сама в себе и запускается с двух команд.
Да в любом случае, вы рассматриваете кортежи в отрыве от типов, что в корне не верно в языке со статической типизацией, будь то императивная сишка или функциональный хк.
Списки гомогенны, кортежи гетерогенны. Отсюда вся пляска с фиксацией размера кортежа и прочие вытекающие.
И да, мы можем добавлять элементы в кортеж, получая новый экземпляр с новым типом (смотреть гетерогенные списки)
А где в статье хоть одно упоминание того, что язык должен просто пониматься массовой публикой, лол.
Программист на этом языке должен понимать, что происходит в коде при беглом просмотре, вот что важно.
Если вы не осилили синтаксис языка или его подходы, это еще не значит, что он не читабелен, непонятен и непредсказуем. Это значит, что вы его не осилили, не больше.
P.S. Хотелось бы видеть подобную программу на любом другом хоть как-то типизируемом (на JS я тоже могу однострочник написать, ага) ЯП, мне тоже хочется покритиковать немножко ;)
Как-то велосипедисто. И меня смущает, что `\/` и прочие монады пытаются применяться в том же императивном стиле и контексте. Вы когда правильно код монадами пишите с FF-стретегией, никакого cyclomatic complexity с десятками вложенных методов/for-yield'ов не должно быть. Разбивается всё на мелкие чистые composable-функции и помчали.
У себя в проекте накидал implicit обертку над `Future[\/]` с `EitherT` под капотом. Очень удобно. `map/flatMap`, `ensure` есть, все из коробки работает. Что не так — упали в левую ветку с ошибкой, и всё, дальше код не выполнится.
Если хочется собирать кучу ошибок, то есть стейт монады. Как-то так.
Исключения в бизнес-логике — дурной тон, особенно в ФП. Вы таким образом поток выполнения прерываете ненормальным путем.
Вот только никто почему-то не вспоминает про работу с асинхронностью с Future as monad из коробки.
Или про тайп-классы на имплиситах, которые позволяют писать какие угодно дженерик решения для любых
типов (да, да, даже для сторонних, стандартных, whatever, и всё это без оберток).
Или про type-safe парадигму в скале, когда, во многом благодаря той самой «переусложненной» системе типов, можно смотреть на List[Any] или касты .instanceOf как на недоразумение неопытного разработчика.
И да, работу на скалке тоже можно найти. И, что характерно, вероятно, что вы окажетесь в опытной и сильной команде, у которой всегда можно чему-то научиться, что должно быть, по моему мнению, решающим фактором на любой работе. И это по той простой причине, что порог вхождения в язык находится выше уровня «копипаст со stackoverflow, херак и в продакшн».
Имхо, тот график с удовлетворенностью разработчиков языком говорит больше, чем вся статья и холивар вокруг.
На моей памяти, это первый язык, который у меня не вызывает приступов ненависти даже спустя три года, что для любой технологии в наше непростое время — невиданное явление.
Проблемы с IPSec. Не смотря на все заявления о том, что воздействие минимальное, наблюдаем, что порядка нескольких процентов трафика через manageable network тормозятся. Да так, что nginx кричит матом. Делаешь host network у контейнеров — всё ок. Либо дело в их встроенном load balancer'e, который простой как квадрат и основан на HAProxy, либо в сетевом стеке ранчера (что более вероятно).
Еще часто ранчеру сносит башню при апгрейде контейнеров приложения. Он просто не может выкачать новый образ контейнера и впадает в бесконечный цикл. Но тут может быть дело в самом докере, хотя до ранчера никогда такого не наблюдал. Помогает только ребут всего хоста. Даже перезапуск докер демона не помогает.
Из плюсов:
Благодаря как раз таки автоматическим LB из коробки, позволяет весьма прилично экономить на железе, работая через spotinst.com (это который для амазоновских спот инстов)
Удобный мониторинг и полуавтоматический zero-downtime апгрейд сервисов из коробки.
Никаких плясок с бубном при поднятии ранчера — сами агенты и основной мастер работают как докер контейнеры, т.е. система сама в себе и запускается с двух команд.
Надеюсь, не помрёт со временем.
Это нормальная практика для всех приложений, будь то go, python, java и прочее, что висит как процесс
И да, мы можем добавлять элементы в кортеж, получая новый экземпляр с новым типом (смотреть гетерогенные списки)
Программист на этом языке должен понимать, что происходит в коде при беглом просмотре, вот что важно.
и какой-нибудь spark ml сверху через коннектор
Немного скалы:
У себя в проекте накидал implicit обертку над `Future[\/]` с `EitherT` под капотом. Очень удобно. `map/flatMap`, `ensure` есть, все из коробки работает. Что не так — упали в левую ветку с ошибкой, и всё, дальше код не выполнится.
Если хочется собирать кучу ошибок, то есть стейт монады. Как-то так.
Исключения в бизнес-логике — дурной тон, особенно в ФП. Вы таким образом поток выполнения прерываете ненормальным путем.