# Понедельник 31 твит
@jsunderhood @cssunderhood @abroadunderhood @sexsecrethood @iamspacegray парни, репостните , если не жалко :)8:33Привет, камрады. Это коллективный твиттер для гейм-дизайнеров в модном нынче формате андерхудов – новый автор каждую неделю.
Будем много говорить о типах, ноде и фулстеке. Думали не будет реакта? Хренушки, от него никуда не деться
8:35Давайте начнем с небольшого опроса, а чуть позже я расскажу что сам думаю по теме. Нужны ли в js типы?
8:48@jsunderhood я не могу определиться. С одной стороны типизация добро-меньше ошибок. С другой стороны-уже поздно :)
Есть опциональная, будем считать, что она относится к ответу Да
@jsunderhood я не могу определиться. С одной стороны типизация добро-меньше ошибок. С другой стороны-уже поздно :)
9:51
Думаю все поняли, но на всякий случай суть сабжа: js типы очень слабые, но есть возможность вводить типизацию посредствам доп инструментов
12:59Вот лишь некоторые из них: TypeScript, Flow, Elm, PureScript, Dart
12:59Самому мне очень симпатичен Haskell, но еще не доводилось его использовать на продакшене. В вебе он непопулярен
13:05И во многом именно благодаря сильнейшей типизации. Когда хаскелист пишет программу, ему нужны 100% гарантии бизнес требований
13:07В реальном же мире, пока вы допишете ваши базые типы, к вам 10 раз прибежит проджект и скажет, давай по новой, миша, все ху%$я
13:09Поэтому типизация несет оверхед на этапе прототипа, а бизнес от веба ждет всего очень быстро
13:11При это она сильно помогает при рефакторинге, все ошибки отлавливаются почти сразу
13:12Более того, вы экономите на тестах, потому что чем строже типизация, тем ближе вы приближаетесь к описанию всех возможных кейсов уже в коде
13:16Я к сожалению совсем не знаком с Elm и PureScript, если кому-то есть что сказать про них в плане нашего топика, пишите
13:17Однако на хайпе, столь для нас родном, сейчас TypeScript и Flow. По этому поводу второй опрос
13:21@jsunderhood опциональная типизация в php вроде бы. А есть в нашем треде люди с успешным опытом ее использования?13:27
@jsunderhood бизнес код поддерживать команде и новеньким, текущие инструменты мне кажется сильно повышают порог вхождения13:27
@jsunderhood В реальном мире, одно слово перед параметром функции экономит дофига времени во всем процессе разработки.13:46
@dcromster @jsunderhood Про меньше ошибок — абсолютный миф. Не влияет. А вот удобочитаемость, по-моему, страдает. medium.com/javascript-sce…
Эта статья всех бомбанула пару месяцев назад. Не сказал бы что она что-то доказывает, но - попытка разобраться
@dcromster @jsunderhood Про меньше ошибок — абсолютный миф. Не влияет. А вот удобочитаемость, по-моему, страдает. medium.com/javascript-sce…
13:53
@jsunderhood более того, последний год Babel просто имплементирует фичи, которые уже есть в TypeScript.
Соглашусь, с TS вы получаете все новые ES фичи бонусом. Тогда как в 6 бабеле в это время выпиливают декораторы
@jsunderhood более того, последний год Babel просто имплементирует фичи, которые уже есть в TypeScript.
13:59
@jsunderhood на самом деле не все так просто.Например, модули в typescript вели себя совершенно иначе и до сих пор отличаются от es6-modules14:10
@jsunderhood 30% не знают, что TypeScript покрывает весь функционал Flow + избавляет от необходимости использовать Babel.
Не был бы так категоричен, например буквально недавно TS добавил descriminated unions, которые уже были в Flow
@jsunderhood 30% не знают, что TypeScript покрывает весь функционал Flow + избавляет от необходимости использовать Babel.
14:11
А есть кто за Flow? Давайте сравним, что там есть, чего нету в TS. А пока посмотрим маленькую презу djcordhose.github.io/flow-vs-typesc…
14:15Например @vkurchatkin собирает коллецию сниппетов, где Flow ведет себя лучше чем TS github.com/vkurchatkin/ty…
15:15@jsunderhood изначально flow и ts созданы для разного. ts для того, чтобы писать все на ts, а flow - чтобы проверять существующий код15:33
@jsunderhood @vkurchatkin ts next же15:33
И у меня есть вопросы к обоим сторонам: например есть ли во Flow параметрические типы данных?
16:02И как с помощью TS проверять типы, описанные в JSDoc. Говорят так можно
16:03Напомню, что JSDoc имеет тэг usejsdoc.org/tags-typedef.h… который поддерживает композитные типы и юнионы
16:05Why do I prefer jsdoc3 instead of TypeScript/Flow? Types is meta information, like Contract in DbC. We should separate it from program code.
И например @DenisIzmaylov считает, что это лучше, чем типы в коде
Why do I prefer jsdoc3 instead of TypeScript/Flow? Types is meta information, like Contract in DbC. We should separate it from program code.
16:08
@jsunderhood есть, и, в отличии от ts, поддерживается ковариантность и контрвариантность16:19
# Вторник 28 твитов
@jsunderhood github.com/Microsoft/Type…
Да, но почему-то он не проверяет типизацию. Съедает
/**
* @type {number}
*/
var var1;
console.log(var1.length);
@jsunderhood github.com/Microsoft/Type…
6:43
@vkurchatkin @bardadymchik @jsunderhood с доками у флоу плохо6:44@lbljeffmo @rpominov @flowtype personally I don't understand how to define contravariance in generics.
@jsunderhood а расскажешь про typelint?
Сейчас как раз плавно к этому перейдем :)
@jsunderhood а расскажешь про typelint?
9:02
Продолжим о типизации. По моему опыту большинство проблем возникают при обращении к несуществующему свойству объекта. Пресловутый undefined
9:04Потому что сложно держать в голове все структуры и интерфейсы приложения. Где-то вы обязательно промахнетесь
9:05Поэтому я например вижу мало смысла использовать транспайлеры лишь в сборке. Разработчик должен видеть ошибку, пока он в контексте
9:06Поэтому меня огорчило, что у WebStorm'a до сих пор нет полноценной поддержки Flow. C TS у них все отлично
9:07Так вот, если большинство проблем в объектах, давайте посмотрим откуда они приходят: модели из API, локальный стейт приложения
9:19Если вы пишете апи и не используете что-то типо Swagger, API Blueprint итд, то для вас уготован отдельный котелок в аду
9:23Возьмем локальный стейт и самое популярное решение - Redux. У него есть структура, описанная редюсерами и initialState'ами
9:24Возьмем пока чуть менее популярное решение - Relay, у него вообще типизированные схемы данных для GQL
9:25Как мы видим в хороших приложениях большие данные всегда описаны, а в очень хороших еще и типизированы. Почему бы не использовать это?
9:26Так родилась идея github.com/yarax/typelint -- сделать линтер, который знает о данных приложения и помогает писать код безопасно
9:27Пока он поддерживает только JSON Schema как формат описание данных (используется в Swagger), но я планирую добавить поддержку Redux и GQL
9:29Кстати JSON Schema по-моему недооцена. Эот хорошо описанный универсальный формат для JSON. Почему все постоянно изобретают что-то свое?
9:30JSON Schema поддерживает algebraic data types за счет енумов, allOf и anyOf. И если не нужна хитрая динамика, этого зачастую достаточно
9:32Например уж mongoose и thinky точно могли бы его использовать. Было бы универсальнее + толчок к развитию единого стандарта
9:46Говоря об API, в Haskell есть фреймворк Servant, который описывает все ваше апи в типах. АПИ в ТИПАХ Карл. Вот это высота
9:59Но зато такое апи нельзя будет использовать в typelint :)
10:01Ладно, больше не буду про хаскель, а то все разбегутся
10:02@jsunderhood @twenty синтаксис ещё не утверждён — правильно делают, что выпиливают. Всегда можно плагин поставить, если очень нужно.
Полгода собачку утверждают? А в это время полвеба юзает декораторы в TS, вторая половина через легаси бабель плагин
@jsunderhood @twenty синтаксис ещё не утверждён — правильно делают, что выпиливают. Всегда можно плагин поставить, если очень нужно.
12:38
@vkurchatkin @jsunderhood Спрос на эту фичу есть, значит рано или поздно примут. Только вот поведение может отличаться от нынешнего
Именно. Только смысл было ее убирать полностью, если все равно продолжают пользовать с таким функционалом какой есть
@vkurchatkin @jsunderhood Спрос на эту фичу есть, значит рано или поздно примут. Только вот поведение может отличаться от нынешнего
13:12
Завершая тему типов, кто еще не знает есть телеграм чатик по TS telegram.me/typescriptru Может кто-то знает/создаст по Flow?
14:16И небольшая шпаргалка по типам в TS, Flow, JSON Schema и Haskell, круто если кому-то есть что исправить/дообавить github.com/yarax/typescri…
14:17Давайте начнем с небольшого опроса, а чуть позже я расскажу что сам думаю по теме. Нужны ли в js типы?
Голосование нужна ли в js типизация: 57% Да, 43% Нет. Подтверждает ощущение, что "хорошо бы, но дорого"
Давайте начнем с небольшого опроса, а чуть позже я расскажу что сам думаю по теме. Нужны ли в js типы?
14:21
Выход - опциональная и без дополнительного писания типов, юзайте typelint :D
14:22Голосование TS/Flow: TS: 58%, Flow: 42%
14:23@jsunderhood было бы неплохо, но вроде бы в русскоязычном мире Flow мало используют
По ходу да, кроме тебя про Flow все молчат)
@jsunderhood было бы неплохо, но вроде бы в русскоязычном мире Flow мало используют
14:57
# Среда 55 твитов
@jsunderhood Многи ли в js архитектурных подходов\решений для приложений? Как происходит выбор для нового проекта? Где подобное почитать?
MVC умирает вместе с ОО подходом, компоненты могут решить почти любую задачу и дают больше гибкости
@jsunderhood Многи ли в js архитектурных подходов\решений для приложений? Как происходит выбор для нового проекта? Где подобное почитать?
9:07
В продолжении вчерашней темы про API, немного о REST. REST - говно
9:08Но от него никуда не деться, потому что он по сути есть HTTP. А HTTP это наше все. И низкий уровень REST'a увеличивает прозрачность
9:10Но чаще всего, если решение прозрачное, оно не богато возможностями.
9:11Ограничения REST думаю всем известны: недостаточность ресурсной модели, ограниченность GET запросов, неуклюжий PUT
9:13А если вы захотите поменять транспорт например на сокеты, то вообще будете переписывать слой работы с данными
9:14На этом фоне даже JSON-RPC выглядит более привлекательным. Но если вы на реакте, то для вас открыт целый преферанс-бордель: Relay
9:35Если безусловно талантливая команда фб что-то придумает с неудобными мутациями, конкурентов в асинхронном хендлинге данных у Relay не будет
9:37@jsunderhood Relay/GraphQL не всем подходит, он сложный, имхо
Кстати да, почему он считается сложным?
@jsunderhood Relay/GraphQL не всем подходит, он сложный, имхо
9:38
@jsunderhood Мне кажется, что сама идея 👍, но конкретная реализация для многих проектов — оверхед. Для больших да, там все это пригодится.9:41
@jsunderhood можно пример про больше гибкости?
В OOP-MVC переиспользование - наследование, компонентная структура ближе к FP, когда чистая ф-я может юзаться везде
@jsunderhood можно пример про больше гибкости?
9:53
Сама природа UI - компоненты, мне кажется это естественно
9:53@roman01la @jsunderhood самый простой путь – сделать прослойку для агрегации REST-запросов.
Вот я сейчас точно так же буду пытаться мигрировать систему на GQL. REST при этом должен остаться
@roman01la @jsunderhood самый простой путь – сделать прослойку для агрегации REST-запросов.
9:55
@jsunderhood наследование - механизм subtyping-а, ad-hoc полиморфизма.ООП-инкапсуляция и мессаджинг,то-есть компоненты в чистом виде
Совершенно верно,но так сложилось у всех в головах,что ООП-это наследование. Инкапсуляция и полиморфизм универсальны
@jsunderhood наследование - механизм subtyping-а, ad-hoc полиморфизма.ООП-инкапсуляция и мессаджинг,то-есть компоненты в чистом виде
10:01
@jsunderhood effectful компоненты /= чистые функции, и не композятся в общем случае.Кроме того, ф-ции слишком низкоуровневые
@jsunderhood чистое фп и всякие редуксы не решают проблем инкапсуляции стейта, то-есть не решают вообще ничего.MVС как раз и есть компоненты
Инкапсуляция стейта (если она действительно нужна) решается как и инкапсульция скоупа функций - локальным стейтом
@jsunderhood чистое фп и всякие редуксы не решают проблем инкапсуляции стейта, то-есть не решают вообще ничего.MVС как раз и есть компоненты
10:04
@jsunderhood и еще: MVC /= OOP
В MVC без OOP не остается вообще никакой системы, кроме ненужного разделения логики от представления
@jsunderhood и еще: MVC /= OOP
10:07
@jsunderhood переиспользование стейтфул компонентов /= пересипользованию чистых ф-й. Модули не помогут инкапсулировать стейт.
Вопрос: зачем инкапсулировать стейт, который мешает переиспользованию? Ради инкапсулирования?
@jsunderhood переиспользование стейтфул компонентов /= пересипользованию чистых ф-й. Модули не помогут инкапсулировать стейт.
10:13
@jsunderhood попробуй сделать такое в языке з правильной системой типов и типизированными effect-ами - сильно удивишься)
В strong type FP данные пайпом проходят через ф-ии. В реакте это усложняется необходимостью дублировать пропсы
@jsunderhood попробуй сделать такое в языке з правильной системой типов и типизированными effect-ами - сильно удивишься)
10:24
Есть контекст, но он все еще не стабилен
10:25@jsunderhood инкапсуляция - необходимое,но недостаточное условие переиспользования,и самой вожможности существования больших, сложных систем
Я с тобой согласен, что в реакте есть проблемы со стейтом. Но есть серебряная пуля?
@jsunderhood инкапсуляция - необходимое,но недостаточное условие переиспользования,и самой вожможности существования больших, сложных систем
10:34
@maxmaxmaxmax @roman01la @jsunderhood хочется узнать о таком опыте подробнее. На сколько это было накладно по производительности?11:09
@roman01la @jsunderhood jsonapi же.
Я с ним мало знаком, но по-моему он работает поверх реста, нет?
@roman01la @jsunderhood jsonapi же.
11:28
@mr_mig_by @roman01la @jsunderhood да, это то что назвают BFF11:30
@mr_mig_by @roman01la @jsunderhood думаю, имеются ввиду два последних слайда с slideshare.net/MaxKlymyshyn/p…11:30
@jsunderhood расскажи про проблему стейта плиз
То, что глобальный не дает инкапсуляции, а локальный мешает переиспользованию
@jsunderhood расскажи про проблему стейта плиз
11:36
@jsunderhood а зачем инкапсуляция?
Например для связи компонентов со стейтом, она чаще всего прослеживается. Но как я говорил выше глобал - это решение
@jsunderhood а зачем инкапсуляция?
11:43
@jsunderhood лучше почитать jsonapi.org/format/ Скажу, что там лучше работать с релейшенами, выводить одним запросом детей(с фильтрами)…
Формат это формат. Но в основе рест - все те же GET, PATCH
@jsunderhood лучше почитать jsonapi.org/format/ Скажу, что там лучше работать с релейшенами, выводить одним запросом детей(с фильтрами)…
11:44
@jsunderhood я ничо не понял. Как инкапсуляция связывает состояние с компонентом?
Вам с @8gene надо дебаты устроить :) Один говорит везде инкапсуляция, второй инкапсуляция не нужна
@jsunderhood я ничо не понял. Как инкапсуляция связывает состояние с компонентом?
11:47
Возвращаясь в API, кто-то пробовал Falcor?
12:01В нашем случае GraphQL позволит разгрузить клиент от кэширования, асинхронных экшенов и более точно и гибко запрашивать данные
12:03Но меня смущает существование 2 стейтов (Редукс и Релей) одновременно. Есть механизмы поддержания консистентности, но все равно стремно
12:05@jsunderhood А какой у вас продукт?
Огромная админка управления рекламными компаниями. Много форм, поэтому без локального стейта не обойтись
@jsunderhood А какой у вас продукт?
12:08
@jsunderhood мы в редаксе держим только состояние UI: табы, комбобоксы и т.д.
Да, в идеале хотелось бы так же
@jsunderhood мы в редаксе держим только состояние UI: табы, комбобоксы и т.д.
12:09
@jsunderhood У нас много такого кода и мы не храним такие данные в редаксе. Обычно родительский компонент собирает эти данные и отправляет.
Да, я тоже считаю, что форма должна быть в стейте компонента, но у нас это легаси redux-form
@jsunderhood У нас много такого кода и мы не храним такие данные в редаксе. Обычно родительский компонент собирает эти данные и отправляет.
12:21
@jsunderhood про ваше решение для форм. форм может быть много и интересно как вы описываете формы и шарите общий код между
@roman01la
Когда-то мне нравилась идея построения форм на основе моделей, но в реальном мире это не работает
@jsunderhood про ваше решение для форм. форм может быть много и интересно как вы описываете формы и шарите общий код между
12:51
@roman01la
Форма рисуется вручную и к полям биндится специльный пропс field, содержащий value, onChange итд. В hoc field связывается с redux
12:52Кстати также мы юзаем довольно удобное решение для работы с редакс-стейтом github.com/nosovsh/reduce… тоже от @nosovsh меньше мороки с экшенами
12:56@jsunderhood а можно подробностей про то как Редукс и Релей живут вместе?
Они в общем друг другу не мешают. Главное держать данные консистентными. У редакса стор через dispatch, relay - hoc
@jsunderhood а можно подробностей про то как Редукс и Релей живут вместе?
13:08
Кстати поигрался с github.com/gyzerok/adrena… и понял, что без Relay чистый GraphQL - сомнительное удовольствие
13:10@jsunderhood у нас была одна итерация декларативно описывать формы на сервере, но отказались из-за необходимости свой язык поддерживать
Мне раньше нравилась эта идея, но в реальности UI должен быть очень гибким
@jsunderhood у нас была одна итерация декларативно описывать формы на сервере, но отказались из-за необходимости свой язык поддерживать
13:22
@roman01la @jsunderhood @apollostack там нет метеора, там есть appolo-client, он интегрируется с реактом или редаксом, можно пользоваться13:51
@jsunderhood @8gene я считаю, что состояние нужно выносить вовне. Это должна быть отдельная ось композиции компонента
Это интересная тема. Но как например обеспечить неизменение куска стейта другим компонентом?
@jsunderhood @8gene я считаю, что состояние нужно выносить вовне. Это должна быть отдельная ось композиции компонента
14:59
@mr_mig_by @8gene если есть данные, которые нужны ему и только ему, их логично скрывать в компоненте15:02
@mr_mig_by @8gene Каждый компонент жестко связан с редаксом, это противоречит weak coupling. Но я не утверждаю, что это приносит проблемы15:02
@jsunderhood @8gene к примеру, Symbol в качестве имени компонента в глобальном состоянии.
Но вопрос - зачем обеспечивать неизменность?
Например пришел новый человек в команду, не разобрался и записал не в свой кусок стейта, все сломалось
@jsunderhood @8gene к примеру, Symbol в качестве имени компонента в глобальном состоянии.
15:06
Но вопрос - зачем обеспечивать неизменность?
@mr_mig_by @jsunderhood композятся интерфейсы - поведения, view. Стейт не имеет интерфейса, он просто есть.А стейт с интерфейсом-это инкапс.
Да, но при этом я не вижу решения как разрулить strong coupled data между компонентами, кроме глобального
@mr_mig_by @jsunderhood композятся интерфейсы - поведения, view. Стейт не имеет интерфейса, он просто есть.А стейт с интерфейсом-это инкапс.
15:13
Пока что мне видится оптимальным - там где возможно использовать локальный стейт - юзать локальный, где нет - глобальный
15:14@jsunderhood каждому новому человеку нужно предоставить отдельное рабочее место, ветку стейта и редьюсер!15:17
@jsunderhood @mr_mig_by @8gene как предсказать, что эти данные не понадобятся кому-то ещё в будущем?
Никак, только рефакторить
@jsunderhood @mr_mig_by @8gene как предсказать, что эти данные не понадобятся кому-то ещё в будущем?
15:18
@jsunderhood @mr_mig_by @8gene и по этому мне больше нравится идея Лёхи: данные - отдельная ось
Но если не рефакторить, стейт превращается в огромную помойку
@jsunderhood @mr_mig_by @8gene и по этому мне больше нравится идея Лёхи: данные - отдельная ось
15:22
@jsunderhood @nosovsh connectSlicedState('pages.blogs.data.activePost') - это не очень хорошее решение. компоненты привязаны к форме стейта.
А вот это второй вопрос что есть связь компонента и глобального стейта? Соответствующий ключик редюсера?
@jsunderhood @nosovsh connectSlicedState('pages.blogs.data.activePost') - это не очень хорошее решение. компоненты привязаны к форме стейта.
15:23
@jsunderhood я оч устал рефакторить, поэтому сторы редакса у меня это "база данных". локальный стейт — для UI штук (eg dropdownIsVisible).
Еще кстати из базы данных нужно гибко выбирать и кэшировать новые данные. Поэтому мне нравится подход Relay
@jsunderhood я оч устал рефакторить, поэтому сторы редакса у меня это "база данных". локальный стейт — для UI штук (eg dropdownIsVisible).
15:28
Кстати пока у нас тут жарко, прогоню телегу. Нам во Франкфурт нужен реакт удаленщик. Пишите кому интересно в лс @raxpost
15:40# Четверг 20 твитов
Буквально пару лет назад мне было интереснее на сервере. Сейчас все наоборот
9:22В бекенде все кристализовалось: devops, data analysis, API. Конечно все еще есть интересные задачи (gamedev например), но их все меньше
9:22При этом есть вероятность, что API скоро кристализуется в BAAS, потому что это рутина
9:22А на клиенте вот можно вместо работы спорить нужно ли разделять view и где должен быть стейт,параллельно играясь всякими rx и прочими сагами
9:23И пока на клиенте весело и задорно с реактом, на сервере царит мракобесие во главе с Express
9:23Несколько месяцев назад я написал статью почему экспрес зло yarax.ru/2016/02/26/exp…
9:32Туда пришел TJ и сказал, чувак, мопед не мой, дизайн node/http - говно
9:32И это отчасти правда, но node/http это низкий уровень. Задача прикладных библиотекарей - делать правильные абстракции
9:32Поэтому нет смысла спорить что лучше koa или hapi, пока все они наследуют дизайн node/http лишь обрастая сахаром
9:33Не может же быть такого, наверняка кто-то уже написал либу с правильным разделением http имплементации от логики ручек?
9:35Это же делается элементарно, я даже накидал небольшой гист gist.github.com/yarax/e68c7623…
9:36Объясню чуть подробнее. Довольно очевидно, что апи должно описываться декларативно.
12:43То есть у либы есть вся информация в каком формате данные приходят из http и в каком должны туда уходить. http - это контекст
12:43Очень хочется сказать слово монада, но обещал этого не делать
12:43Так почему этот мутирующий непредсказуемый req носится по всему приложению, собирая в себе все что не попадя?
12:43Если задача ручки - сделать запрос в базу, обработать данные и вернуть их, зачем ей этот req?
12:43Ладно, не пошло, давайте лучше посмотрим как енот ездит на велосипеде pic.twitter.com/wxCGR8QWi3
@jsunderhood это Backend as a Service? Почему тогда рутина?
В том смысле, что все сводится к декларативному описанию апи, а дальше банальные запросы к базе
@jsunderhood это Backend as a Service? Почему тогда рутина?
15:28
А имея какой-ть full text search engine и GQL на фронте, можно делать вот такие штуки почти вообще без бекенда github.com/nordsimon/elas…
15:31Собрал в кучу слайды с @OdessaJS — gist.github.com/boccob/2243904… cc: @jsunderhood16:59
# Пятница 35 твитов
@jsunderhood абстракции текут (с)
Текут конечные монструозные низкоуровневые решения. Не просто текут, а находятся постоянно на грани фола
@jsunderhood абстракции текут (с)
7:21
Говоря об абстракциях, @nikitonsky недавно написал довольно очевидную (почему-то еще не для всех) статью про это tonsky.livejournal.com/307231.html
7:26Ну да бог с ней с философией, нравится людям express, пусть старадают :) Давайте поговорим о реактивном программировании
7:27Я использую
7:30@jsunderhood если быть точным, то Rx, Bacon, Kefir не есть FRP :-)
Расскажи подробнее
@jsunderhood если быть точным, то Rx, Bacon, Kefir не есть FRP :-)
7:47
@jsunderhood rx etc-это императивные effectful реактивные не-формальные системы.
А ну я понял что ты имеешь, меня тоже смущает, что почему-то все добавляют в аббревиатуру букву F
@jsunderhood rx etc-это императивные effectful реактивные не-формальные системы.
7:56
Говоря о событиях, например нам нужен момент, когда на серв все асинх сервисы готовы. Это можно сделать например так gist.github.com/yarax/3dac9ae1…
8:06@jsunderhood кстати, вот обзорный спич про таксономию фрп - youtube.com/watch?v=Agu6ji…8:07
Neat redux-observable example with RxJS 5: github.com/redux-observab… pic.twitter.com/19gj1Z9lOR
А вот пример использоваться Rx в Redux. Как вам такой подход?
Neat redux-observable example with RxJS 5: github.com/redux-observab… pic.twitter.com/19gj1Z9lOR
8:14
Люди, указавшие в опросе вариант "другая" напишите плз какая именно и почему
8:16@jsunderhood вот в контексте RxJS отличный пример и статья про построение Redux-like приложения victorsavkin.com/post/137821436…8:28
Тем временем нам поступает интересный фидбек от слушателей pic.twitter.com/EMhAJ15zEf
If you want to know how your expression of Rx works you can use this one jsbin.com/gogofa/4/edit?…9:03
@OdessaJS
@8gene @nikitonsky @jsunderhood цель любой абстракции есть вытеснение иной абстракции из головы. Жизнь есть борьба абстракций. 👻9:20
@8gene @nikitonsky @jsunderhood на уровне котика квантовых полей нет - они схлопываются ещё до зачатия котика.
От экспресса до котика в квантовых полях
@8gene @nikitonsky @jsunderhood на уровне котика квантовых полей нет - они схлопываются ещё до зачатия котика.
9:22
Мое мнение, что использовать стримы там, где можно промизы, избыточно и непрозрачно. Но возможно я не прав, раскажите, про ваши юзкейсы
9:49@jsunderhood @raxpost На промисах всегда нужно ждать их окончания, со стримами же можно начинать отправлять ответ клиенту почти сразу же.
Окончание промиза означает что данные fulfilled и с ними можно работать. Можешь код привести?
@jsunderhood @raxpost На промисах всегда нужно ждать их окончания, со стримами же можно начинать отправлять ответ клиенту почти сразу же.
10:02
@jsunderhood 1) если надо (будет) результаты резолва промисов комбинировать, 2) если везде стримы и есть два промиса в коде
Да, в этом случае оправдано
@jsunderhood 1) если надо (будет) результаты резолва промисов комбинировать, 2) если везде стримы и есть два промиса в коде
10:40
@jsunderhood свою пилю :D npmjs.com/package/rstore
Круто!
@jsunderhood свою пилю :D npmjs.com/package/rstore
11:50
Еще немного о типах. Недавно пришлось работать с кодом, который делает всякую арифметику с бюджетами.
12:40Значения приходят извне и могут быть чем угодно. Что мы имеем: undefined, null, NaN, String, Number и никакой определенности
12:40Тайпчекеры (например Maybe во Flow) не позволят вам cложить number с undefined
12:41Это лучше чем ничего, но недостаточно, т.к код обрастет страшными ифами и станет нечитабельным
12:41Очень хочется изобрести свой тип Maybe, но такие попытки выглядят немного смешными github.com/chrissrogers/m… по сути они ничего не решают
12:41Как вариант - сделать вид, что Maybe у нас есть и написать арифм ф-ии работы с ним: gist.github.com/yarax/841ea9df…
12:41В итоге null рассматривается как у Flow - тип Nothing и с этим уже можно работать
12:41Если менять конструкцию инвалидного кресла, у человека новая нога все равно не вырастет. #javascript #it twitter.com/jsunderhood/st…
Строгая типизация не избавляет от разруливания union типов, просто не будет NaN и undefined
Если менять конструкцию инвалидного кресла, у человека новая нога все равно не вырастет. #javascript #it twitter.com/jsunderhood/st…
12:57
@just_hank_moody хорошая статья tjournal.ru/users/24702/po…, могу заметить что весь движ начался с @jsunderhood и jsunderhood.ru14:01
Друзья, рад сообщить: 8-й Node.js Meetup мы проводим в Яндексе! 13 июля, среда, 19:00. Регистрируйтесь events.yandex.ru/events/yagosti… #MoscowNodeJS14:43
Почти 100 человек проголосовало и из них целых 83% вообще не используют FRP. Отсюда у меня следующий вопрос
15:38@jsunderhood есть ещё третий вариант: мне нравится идея, но выглядит слишком сложно и боюсь брать на проект куда придут ещё люди после меня15:47
@jsunderhood кстати, о нашем милом и добром реакте: twitter.com/forwebdev/stat…
Cons какие-то мутноватые
@jsunderhood кстати, о нашем милом и добром реакте: twitter.com/forwebdev/stat…
19:36
@jsunderhood С ним код получается сложнее, если мне будет нужна абстракция которая усложняет я пойду в хаскель монады писать.19:37
@vladimore @jsunderhood иногда в JS что-то не прокатывает. Например в JS4 не прокатило полноценное ООП. И это на пике популярности ООП. 👻
Да, было время все пытались притягивать за уши js к ООП
@vladimore @jsunderhood иногда в JS что-то не прокатывает. Например в JS4 не прокатило полноценное ООП. И это на пике популярности ООП. 👻
19:39
@jsunderhood @vladimore удивительное то что не притянули тогда JS. Странно это. Имхо.19:44
# Суббота 40 твитов
@taujavarob Мне кажется для JS sweet spot это императивный код на низком уровне и иммутабельность и базовое ФП на высоком. @jsunderhood7:12
@freiksenet_ru @mr_mig_by @jsunderhood усложняют люди, которые выбирают неправильные абстракции для конкретного случая :)7:12
Норм визуализашка по Rx методам rxmarbles.com
9:21let capitalism = function(){ this.wellfare++; };9:24
let communism = () => { this.wellfare++; };
Давайте чуть-чуть про фулстек.
10:23@jsunderhood @raxpost есть распространенное мнение что человек-фулстек это как "не вашим и не нашим". Что думаешь про это?
Есть такое, частенько это ощущаю. Всегда тебя будут считать квалификацией ниже, чем профильные
@jsunderhood @raxpost есть распространенное мнение что человек-фулстек это как "не вашим и не нашим". Что думаешь про это?
10:27
Но я с собой ничего не могу поделать, есть Computer Science и мне интересно все, что с этим связано
10:34Еще для понимания всей системы в целом и принятия правильных решений полезно знать как работает каждая часть
10:35Времени конечно на все не хватает не будет хватать, но хорошо знать самые важные элементы нужно
10:37Расскажите про ваш опыт и ощущения фулстека
10:39К тому же все меняется каждую неделю только на фронте, информатика с математикой не меняются
10:42@jsunderhood, я на бэке, нра фронт как недостающий вариант10:43
@jsunderhood отличный опыт, отличные ощущения. Но печаль, потому что работать приходится с людьми, у которых такой суперсилы нет
Это да, но оно в твоей голове, я писал про мнение окружающих. Тут как обычно, каждый считает себя самым умным
@jsunderhood отличный опыт, отличные ощущения. Но печаль, потому что работать приходится с людьми, у которых такой суперсилы нет
10:49
@jsunderhood а ещё можно вести беседы со всеми специалистами и посещать любые конфы - всегда интересно и понятно10:50
Бек мне не нравится тем, что все самое интересное там происходит на нагрузках. А настоящие нагрузки редко где есть
10:51Получается такой кружок избранных, если ты получил там опыт, тебе открыта дорога дальше по соотв технологии
10:52@jsunderhood Без понимания бэка фронту жить будет очень тяжко. Это отсутствие возможности общаться на одном языке.
Если нет базового понимания, то все совсем плохо
@jsunderhood Без понимания бэка фронту жить будет очень тяжко. Это отсутствие возможности общаться на одном языке.
10:53
А быть одновременно на беке в нагрузках/биг дате и на фронте - нереально, тут хочешь не хочешь надо выбирать
10:54А уметь написать апи + базовое знание основных БД, не весть какой скил
10:55@jsunderhood Расставлять приоритеты. Можно в одно погружаться по полной, а в остальное — по остаточному принципу, по чуть-чуть.
Вот в бек с нагрузками к сожалению нельзя погрузится частично. И даже дома пет проджект будет бесполезен
@jsunderhood Расставлять приоритеты. Можно в одно погружаться по полной, а в остальное — по остаточному принципу, по чуть-чуть.
10:56
@jsunderhood Даже если в качестве джуна, подай-принеси, посмотреть, как умные люди работают.11:14
@jsunderhood начинал с ruby. потом перекочевал в js, тк изначально шёл в dev, чтобы делать законченные продукты (а без js тут никак) 1/311:23
@jsunderhood на текущем проекте бэк рельсовый. но жить в 2 языках, один из которых js, (мне) нереально, не успеваю. ruby уже чужой 2/311:23
@jsunderhood поэтому единственный вариант фулстек для меня—это нода. но имо каждый фронт должен быть фулстек, хоть немного. иначе тяжело 3/311:23
@jsunderhood Фронт веселее и приятнее, бек это скукота и рутина. Наклепай говнорест, заверни в него недоорм. 😖11:42
По поводу ноды, да очень удобно не переключать синтаксис языков.
12:11Забавно, раньше все думали что смогут переиспользовать код клиент-сервер. Оказалось это не нужно. Но сработало в плане npm
12:13Хейтеры обычно говорят что на беке есть языки лучше. Типо вот в питоне тоже появился евентлуп
12:15И что js ужасен. Но, если вы страдаете от типизации - берите typescript. От колбеков - async/await
12:17Единственное что нельзя поменять - дебильные методы, половина которых мутирует обьект, половина - нет
12:18@jsunderhood сейчас программистов гораздо гораздо больше. И % математиков среди них стал мизерным.12:20
@jsunderhood Засада в том, что, по моим наблюдения, пуфон не всегда лучше. Не всегда быстрее, уж точно.12:20
@jsunderhood В питоне зато все методы мутируют.
Ну хоть какая-то определенность
@jsunderhood В питоне зато все методы мутируют.
12:34
@jsunderhood JS решает проблемы без понтов, макро и штанги. Никто не ценит идейность JS, поэтому его просто развивать.
Да, идейность это ограничения. Поэтому безыдейный js получился таким гибким
@jsunderhood JS решает проблемы без понтов, макро и штанги. Никто не ценит идейность JS, поэтому его просто развивать.
12:36
@jsunderhood И я не говорю что питон или хаскель плохие (хотя питон конечно плохой), просто объясняю почему мнение "js говно" это отлично.
Проблема в том, что можно добавлять новый функционал, но нельзя выпиливать старое говно из-за бекворд компатибилити
@jsunderhood И я не говорю что питон или хаскель плохие (хотя питон конечно плохой), просто объясняю почему мнение "js говно" это отлично.
12:43
@jsunderhood Делаю фронт (реакт), делаю бек (питон), всё нравится, где мой вариант?14:40
@freiksenet_ru @jsunderhood поэтому чистый питон стоит дешевле чем фулстек? )
Вакансий кстати именно на фулстек мало почему-то по моим наблюдениям
@freiksenet_ru @jsunderhood поэтому чистый питон стоит дешевле чем фулстек? )
14:42
@jsunderhood делаю фронт, бек, архитектуру, big data, machine learning, semantic web и R&D - по-моему, это лучшая работа в мире :3
Воу
@jsunderhood делаю фронт, бек, архитектуру, big data, machine learning, semantic web и R&D - по-моему, это лучшая работа в мире :3
15:36
@yamalight @jsunderhood но в конце тебя всё равно в дурку посадят.16:17
# Воскресенье 30 твитов
@webholt ты опять взял интерпретируемый язык. сравни с чем-то побыстрее) @jsunderhood
А это тоже вопрос. Все помешались на Go, потому что он быстрый. А зачем им скорость еще не придумали
@webholt ты опять взял интерпретируемый язык. сравни с чем-то побыстрее) @jsunderhood
8:11
Сишники при этом как сидели, так и сидят, их все устраивает. Нет, вот теперь каждый пхпшник считает своим долгом написать на Go
8:12На моей памяти, узким местом всегда были базы данных и никогда - сам язык. Для этого нужны нагрузки уровня fb/badoo/vk
8:16@jsunderhood да тут, послушать, у всех проекты уровня fb/Google/Yandex8:31
@jsunderhood Ну, хз. Когда та же запросы к базе занимают 90% бюджета быстродействия, наверное, нужно, чтобы всё работало быстро.
Это как так, открыть сокет и начать слушать данные это 90% бюджета?
@jsunderhood Ну, хз. Когда та же запросы к базе занимают 90% бюджета быстродействия, наверное, нужно, чтобы всё работало быстро.
8:48
Если запросов очень много, то это либо кривость архитектуры, либо половина из них не нужна клиенту. И тут нода хороша евент лупом
8:50Поскольку у нас получилась неделя абстракций, давайте посмотрим выступление на эту тему Cheng Lou на React Europe youtu.be/mVVNJKv9esE
9:12@jsunderhood вполне себе нужно, с изоморфными приложениями
Кстати интересная тема. Давайте посмотрим кейсы изоморфа: сервер рендер, валидация. Что-то еще?
@jsunderhood вполне себе нужно, с изоморфными приложениями
10:40
У нас мы используем одну валидацию на клиенте и сервере, основанную на свегер схеме. Пока полет нормальный
10:46@jsunderhood @operatino переиспользование логики
А вот это как раз то о чем я писал,как мне кажется это не взлетело. Потому что общих кейсов не так много. Как у вас?
@jsunderhood @operatino переиспользование логики
10:47
@jsunderhood у нас есть переиспользование SQL запросов между сервером и мобильным приложением11:05
@jsunderhood Но в целом да, редко выходит что-то пошарить между платформами.11:05
Расскажите кто использует React сервер рендер, чем это вам помогает?
11:08@jsunderhood любые утилиты, сервисы, комбинирование запросов можно на том же сервере делать если нету отдельного АПИ сервера с доступом11:22
@jsunderhood static site generator11:22
@jsunderhood сайт работает без js. Ну и роботы, конечно.12:35
Еще один базворд не затронули - микросервисы
13:23Сама по себе модульность - вещь хорошая и работающая, но как любое хорошее дело ее легко запороть
13:23Вам нужны микросервисы, если: нужна распределенность, знаете как разделить бд, знаете как настроить кластер и CI
13:23Конечно докер. Но контейнеризация-вещь молодая, мало утилит, они сырые, бест практикс нет. Мы потратили несколько месяцев только на кластер
13:24Что касается разработки: все выносить в либы (npm через git), никогда не лезть в зону другого мс, заложиться на разные транспорты
13:24В общем никто не мешает использовать разные языки в контейнерах, если есть кому эти языки потом поддерживать
13:24В целом эти советы полезнее, чем вся эта книжка pic.twitter.com/B2KVcprZhy
Ну и традиционная рубрика других посмотри, себя покажи. Кидайте ссылки на ваши личные проекты
14:26@jsunderhood mds-online.ru поиск и послушать онлайн "Модель для сборки"15:52
@jsunderhood Генератор стайлгайдов для Реакта (вдруг кто-то ещё о нём не знает): github.com/sapegin/react-…16:57
@jsunderhood npmapi.invntrm.ru — быстрое открытие github-репозиториев для npm-пакетов17:06
@mxtnr @jsunderhood $ npm repo pkg — вот так проще17:13
Вот и время прощаться. Кстати через час финал ЧЕ. Как вы к футболу?
18:06Спасибо всем, кто участвовал в дискуссиях, это была классная неделя. Пишите фидбек по github.com/yarax/typelint, мне он очень важен :)
18:07# Ссылки
github.com
- https://github.com/vkurchatkin/typescript-vs-flow
- https://github.com/yarax/typelint
- https://github.com/yarax/typescript-flow-haskell-types-comparison
- https://github.com/nosovsh/reduceless
- https://github.com/gyzerok/adrenaline
- https://github.com/nordsimon/elasticsearch-graphql
- https://github.com/chrissrogers/maybe
- https://github.com/sapegin/react-styleguidist
other
- http://djcordhose.github.io/flow-vs-typescript/2016_hhjs.html#/12
- http://usejsdoc.org/tags-typedef.html
- https://telegram.me/typescriptru
- http://www.slideshare.net/MaxKlymyshyn/piterpy-2016-parallelization-aggregation-and-validation-of-api-in-python
- http://yarax.ru/2016/02/26/express-evil/
- https://gist.github.com/yarax/e68c76233f5600363fd8943a43afe480
- https://gist.github.com/boccob/22439048c149a2e70c431d94cf84c75a
- https://gist.github.com/yarax/3dac9ae1955449cbb520695d7d01ecb1
- https://gist.github.com/yarax/841ea9df4f9a52f4975227e1b27bfc88
- http://tonsky.livejournal.com/307231.html
- https://www.youtube.com/watch?v=Agu6jipKfYw
- http://victorsavkin.com/post/137821436516/managing-state-in-angular-2-applications
- https://jsbin.com/gogofa/4/edit?js,output
- https://tjournal.ru/users/24702/posts/club
- https://jsunderhood.ru/
- https://events.yandex.ru/events/yagosti/13-jul-2016/
- http://rxmarbles.com/
- https://www.lpi.org/
- https://youtu.be/mVVNJKv9esE
- http://mds-online.ru/
- http://npmapi.invntrm.ru/