Fork me on GitHub
#clojure-russia
<
2017-07-01
>
mike_ananev09:07:49

@dragoncube не слышал про такое.

mike_ananev09:07:55

@dragoncube рефы, что отделют идентити от стейта наоборт благо. в это соль immutability.

dottedmag14:07:16

@mike1452 Разговор был в том ключе, что все хотели STM, но в результате он нафиг никому не сдался, и вся сложность рефов оказалась бесполезной: все пользуются атомами.

dottedmag14:07:42

Но я не помню, где и кто об этом говорил.

dragoncube18:07:55

@dottedmag аха, спасибо

dragoncube18:07:14

видимо агенты тоже не очень популярны

malch19:07:41

Это Stuart Halloway, например, говорил в одной из своих презентаций

malch19:07:28

Что STM на бумаге - штука отличная, но на практике просто не нужна почти никогда

dottedmag20:07:29

@dragoncube И с агентами та же ботва, да.

dottedmag20:07:38

Что агенты, что STM нужны гораздо реже, чем кажется.

dottedmag20:07:16

Вот и получается, что кложура слишком сложная. Vars слишком много чего в себя вобрал, Refs и Agents не нужны. Можно было обойтись гораздо меньшей кровью 😃

akond20:07:03

так что, закрываемся?

dottedmag20:07:50

Нет, просто ментально вешаем ярлычки "deprecated" и "almost always a bad idea"

dottedmag20:07:57

На конкретные конструкции.

akond20:07:47

@artemyarulin пошел дальше и выпили кложу с продакшена

mike_ananev20:07:22

@dottedmag STM для специальных задач. например: ОЗУ ныне дешевая. и все счета клиентов можно хранить в ОЗУ. при совершении транзакции можно с помощью STM зачислять и списать деньги, а с помощью агентов, которые дружат с транзакциями внутри STM отослать в kafka в асинхронном режиме данные по транзакции

dottedmag20:07:57

Так, так, счета в ОЗУ?!

dottedmag20:07:17

Это только очень ненужные счета можно хранить в озу 😄

mike_ananev20:07:24

понятно, что пример несколько натянутый, но и STM вещь специфичная. как говорил профессор Петухов, это ответ на вопрос, который вы еще себе не успели задать.

dottedmag20:07:01

Если есть кафка, то способы материализации вьюшек из потока событий уже не так важны.

mike_ananev20:07:39

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

mike_ananev20:07:22

типовой сервер 512GB RAM

mike_ananev20:07:25

таких 100

mike_ananev20:07:34

для одной из задач

mike_ananev20:07:52

так что все 80 млн клиентов вполне себе помещаются

mike_ananev20:07:09

еще и с коэффициентом репликации 3

mike_ananev20:07:27

вот где датомик должен сиять. (но он настолько alien технология, что когда рассказываешь о нем в ответ - гробовое молчание)

artemyarulin21:07:56

@akond угу, чота я раньше думал что кложа это 10х, а в реальности ну может 1.2х модификатор от силы. Функциональное программирование вот это 10х идея, но я тоже самое могу на TypeScript делать, и не трахаться с интреопом в реакт нейтив

dottedmag21:07:41

@artemyarulin Много траха с интеропом?

dottedmag21:07:34

Кложура – это всё равно достаточно сильный мультипликатор: из-за функционального программирования и из-за продуманности базовых кирпичиков. В результате количество случайной сложности у неё меньше, чем у языков-платформ, и из-за этого в голове остаётся куда как больше места для того, чтобы думать над задачей.

dottedmag21:07:15

У меня есть интересная штука: на $DAILYJOB я написал небольшую специфичную in-memory database для специальных запросов и индексов. Ничего off-the-shelf не подошло. На ноде.

dottedmag21:07:42

Если у меня дойдут руки, я сделаю ещё одну реализацию на Clojure и на ClojureScript и сравню количество кода и производительность.

artemyarulin21:07:21

>В результате количество случайной сложности у неё меньше но отсутсвите типов сводят все это на нет при более менее большом проекте. Для прототипов - ничего лучше нет, а если дальше то не уверен

dottedmag21:07:37

Так отспекать, и всё.

artemyarulin21:07:39

А ты пробовал? Я вот видел либки где спеку прям для всего юзали, а многословна что пипец, лучше уж типы

dottedmag21:07:51

Уменьшение случайной сложности нужно тем сильнее, чем больше проект, кстати.

dottedmag21:07:02

Прототип можно хоть на перле писать.

dottedmag21:07:26

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

dottedmag21:07:42

И критические инварианты.

dottedmag21:07:21

Если приложение — развесистый UI к REST-у, то спекать долго и кложура не нужна 😄

artemyarulin21:07:56

ну в любом случае - рантайм контаркты + тесты будут всегда меньше чем рантайм контракты + тесты + типы

dottedmag21:07:09

Да кто ж спорит.

mike_ananev21:07:52

@dottedmag я думаю, что языки очень важны, но вторичны для проекта. на первом месте - люди и процессы. соответственно, если Артем решает качественно задачи на TypeScript значит команда слаженно работает, процессы доставляют value. Однако повторюсь, что по моим наблюдениям: 1) кложа ложится в голову не у всех 2) кложа требует начать думать иначе. Если основная работа на императивном языке, а кложа для pet project максимум, то рано или поздно настает оверхед и работа поглощает, поэтому люди возвращаются в императивные языки. Однако если все время кодить на кложе, то со временем мозг научается не только кодить, но и проектировать системы в целом in a clojure way. Вот тогда кложа сильно выстреливает, т.к. идеи подкрепляются языком разработки.

artemyarulin21:07:55

ну вот, контракты перенести мне на TS проще чем типы в кложуру. Но и хаскель мозг повернул чутка

dottedmag21:07:50

@mike1452 Ясен пень, что проекты задерживаются и фейлят не из-за инструментов уже много лет как 🙂

artemyarulin21:07:12

ага, я просто на работе на ES6 начал писать, уже 30к строк кода, 6 человек, после того как процесс поставили (тесты, ревью, планирование, архитектура) мы фичи начали выкладывать как горячие пирожки. Тут то я и задумался что язык это второстепенное, если даже не ниже

mike_ananev21:07:30

Простой пример: представим, что в памяти есть какой-то стейт и он постоянно изменяется разными thread'ами. Как в императивном языке передать стейт на другую машину? Тут надо поломать голову, как обеспечить консистентное чтение постоянно изменяющегося объекта, как его сериализовать , как его на другом конце собрать...

dottedmag21:07:34

@artemyarulin К сожалению, ISeq и другие хорошо продуманные протоколы и форсированное разделение value и identity перенести в мир JS сложнее.

mike_ananev21:07:59

в кложе этих вопросов просто не возникнет.

dottedmag21:07:06

@artemyarulin Я как-то попытался использовать Immutable.js. Это вырвиглаз.

artemyarulin21:07:46

ну вот я 2 месяца переписывал, 3к строк CLJS (c тестами) - вот один раз за все время мне реально не хватило update-in в итоге просто сделал reduce.

artemyarulin21:07:20

дак оно не всегда и надо, в 90% хватает стандартных

[{name:'John'}].map(c => {...c, email: c + `@domain.com`})

dottedmag21:07:51

@mike1452 Можно сказать так: 1) мультипликатор кложуры увеличивается по мере того, как команда лучше понимает правила разработки распределённых систем; 2) дизайн кложуры заставляет задумываться о том, как разрабатывать распределённые системы; 3) положительная обратная связь 1) и 2) начинает работать далеко не с начала; 4) мультипликатор кложуры на неопытной команде меньше единицы.

artemyarulin22:07:14

если взять redux (который в этом чатике хаят) дак изменить ничего и не выйдет просто, да и не нужно если про фронт

mike_ananev22:07:36

@artemyarulin а как без репла то живется? пусть и на ES6

mike_ananev22:07:31

а по figwheel не скучаешь?

artemyarulin22:07:04

ага, единственное что меня держало последние пол года. А потом открыл TDD + Jest который перезапускает только тесты которые была заэфечены изменениями и ок. Главное в репле это моментальный отклик - это у меня осталось

artemyarulin22:07:41

ну уж в жс мире всяких hot-reload уже дофега, работают хуже, но в 80% норм

dottedmag22:07:40

Кстати, господа, подскажите быструю библиотеку для работы с вебсокетами для кложуры? aleph?

mike_ananev22:07:16

весь hot-reload императивных языках очень сомнительная вещь. фиг знает, но у меня подозрение, что на большой кодовой базе с приличным стейтом это все будет фейлится. кстати в последнем докладе Стю Халлоуэй рассказал в чем фундаментальное отличие jshell от repl и почему аналоги repl'a никогда им не станут

artemyarulin22:07:44

@dottedmag бери aleph, он зачотный

dottedmag22:07:27

@mike1452 У меня уже есть протокол через вебсокеты, нужно новую реализацию сервера сделать.

dottedmag22:07:37

А это какая-то обёртка?

dottedmag22:07:04

Или там можно произвольный вебсокетный протокол реализовать?

mike_ananev22:07:45

Если через веб-сокеты ты будешь передавать некие структуры данных по своему алгоритму, то why not, sente подойдет.

artemyarulin22:07:02

>весь hot-reload императивных языках очень сомнительная вещь ой да ладно там, договорились в начале что весь стейт в redux storage и ок

dottedmag22:07:10

Клиент уже есть с джысон-протоколом.

mike_ananev22:07:20

сервер в сенте уже сделан http-kit, Immutant v2+, nginx-clojure, node.js, Aleph

dottedmag22:07:29

Т.е. можно просто взять алеф 🙂

dottedmag22:07:26

Это вообще сервер-ту-сервер.

mike_ananev22:07:54

слово "договорились" смущает. я правильно понимаю, что если в команде, кто-то случайно не в redux storage положит, то договор развалится?

dottedmag22:07:57

От стейта в (def) тоже никто не убережёт 😃

mike_ananev22:07:15

мы в контексте hot-reload

artemyarulin22:07:37

а если кто-то в команде случайно атом сделает то чо? troll

artemyarulin22:07:36

говнокодить можно везде, код ревью спасает от глупых ошибок (и людей)

mike_ananev22:07:23

@artemyarulin ну может и правда есть repl в императивных языках. если попадется на ютубе ролик, скинь плиз, очень интересно посмотреть, как работают в repl'e в языка с мутабельными данными

mike_ananev22:07:34

просто до сих пор не видел

artemyarulin22:07:27

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

dottedmag23:07:50

В Erlang ещё. Но Erlang без мутабельных данных 😄