Спасибо всем за дельные замечания и вопросы. Как и обещал - делюсь своим видением проблемы стейт-менеджмента
Для меня сейчас - это основная и фундаментальная проблема в рамках GitLab. Я ее формулирую так "как реализовывать хранение и управление состоянием так, чтобы не рос технический долг и не страдал скорость деливери фич"
Нюанс начинается уже с определения: я осознанно ставлю вопрос технического долга важнее скорости деливери фич. Это связано с тем, что в случае "кризиса срочно-надо-на-вчера" (а так бывает и это нормально), когда мы ставим технический долг во главе угла - мы можем им пожертвовать
Другими словами - фокус на "скорость деливери фич" не даёт нам существенного запаса для "критического deliverable" и одновременно систематически убивает код. Фокус на технический долг - помогает коду жить, позволяя иногда использовать запретные заклинания (не злоупотребляя)
Что для меня важно - there is EXACTLY one way to do it. В проектах, где больше одного инженера, если что-то можно сделать "иначе" - оно будет сделано, и потом все будут морщить нос от кода друг друга.

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

Забавно, что дизайнеры, к примеру, знают, что "творить" когда заказчиком поставлены ограничения - сильно проще, чем когда просто "сделайте мне ВАУ!"
Именно поэтому, к примеру, "голый" Redux вызывает у меня боль - слишком много способов сделать одну и ту же вещь, да и в принципе поверх него каждый строит что кому нравится - thunk, observable, saga - выбирайте. И даже в рамках одного подхода можно сделать очень по-разному
В то же время, если взять допустим RTK (redux-toolkit) - то это на порядок более взрослая система, которая принудительно навязывает вам подходы "так, а никак иначе".

При этом, что важно, давая достаточное количество escape hatches, если ограничения все-таки сделают вам больно
Нет, я не фанат redux или redux-toolkit :)

Нельзя не упомянуть свежерелизнутую redux-toolkit.js.org/rtk-query/over… RTQ Query (которая вдохновлена react-query и аналогичным). Я рад что фундаментальная мысль, что КЕШИРОВАНИЕ ОТВЕТОВ СЕРВЕРА ЭТО НЕ СОСТОЯНИЕ идет в мейнстрим
Здесь я не могу не кинуть огород в камень Vuex, который является стандартом де-факто в мире Vue - там всё это выглядит как редакс лет 5 назад - совершенно "дикое поле" и мысли о том, что надо разделять состояние и кеш только-только начинают звучать среди разработчиков на Vue
Пока я писал этот пост, @themagicworldof прислал типичный ответ про состояние "в идеале его не должно быть". Как по мне, это неправильное заявление. Мы должны избегать состояния, там, где мы можем это сделать, но не должны отрицать его там, где оно по факту есть
@themagicworldof Хорошим примером "чётко выраженного" состояния является WebIDE в GitLab - где локальные сущности (открытые файлы как пример) важны для большого количества компонентов, могут изменяться разными путями и так далее.

При этом самих типов локальных сущностей у нас много
@themagicworldof Текущий уровень управления состоянием в WebIDE для человека, который пишет GitLab но не пишет WebIDE - взрыв мозга. Цепочки связей достаточно сложные, понять что где и как хранится достаточно сложно (кто сказал TypeScript?), а главное - это нереально начертить на листочке
@themagicworldof Здесь я вижу два выхода, о которых я бы хотел поговорить. Первый - дробить состояние на отдельные "атомы" и организовывать связи между ними. По этому пути к примеру движется эффектор
@themagicworldof Я не фанат эффектора, но прекрасно понимаю какие боли он решает. При этом вы еще и можете получить ряд "инженерных плюшек". Про это недавно хорошо написал @kamyshev_code в blog.kamyshev.me/effector-fork-…
@themagicworldof @kamyshev_code При этом для меня и по моему опыту консалтинга - внедрение эффектора по уровню боли и трешовости вещей, которые я вижу в коде от инженеров находится где-то на уровне такого ада от RxJS. Учитывая что команда aviasales мигрирует как раз с rx на effector - я не удивлен что им хорошо
@themagicworldof @kamyshev_code Другими словами - в моей картине мира, rx и effector - примеры систем, требующих ощутимого изменения мышления, и, что немаловажно, не дающие инструментов как делать это "постепенно". Вы просто в один момент должны начать видеть поток фотонов вместо волны :)
@themagicworldof @kamyshev_code Если вы и ваша команда понимаете и осознаете фундаментальные основы (а это сложнее чем кажется) - вы будете писать крутой и продуктивный код и будете счастливы. При этом найм программистов тоже придется вести с учетом этого понимания
@themagicworldof @kamyshev_code А вот к примеру как онбоарднуть абстрактную фронтенд команду, развращенную, к примеру Vuex и Apollo в мир эффектора так, чтобы у меня не дергался глаз - я просто не представляю. Я пытался сделать это два раза - оба раза вернул деньги за консалтинг ибо провал
@themagicworldof @kamyshev_code При этом внедрить эффектор в проект "с нуля" заходит достаточно хорошо - не имея "вредных примеров" и жестко контролируя на входе качество "первых решений" мы создаем эффективную проектную базу копи-пасты и получается хорошо даже с теми, кто не осознает эффектор в полной мере
@themagicworldof @kamyshev_code Минутка контекстной рекламы: если кто-то хочет сделать практический мастер-класс по эффектору, с удовольствием помогу с педагогической стороной вопроса - запрос в сообществе есть большой, заработать пятизначную сумму в долларе за качественный материал можно спокойно. Пишите в ДМ
@themagicworldof @kamyshev_code А мы продолжаем. Вторым подходом в борьбе со сложностью является построение иерархических систем. Основное отличие - не всё связано со всеми, а у нас дерево состояний (или лес)
@themagicworldof @kamyshev_code Последний год я на личных проектах (остатки роскоши от аутсорсинговой компании) очень активно использую xstate от DavidKPiano и мне кажется, что если мы говорим о next big thing в стейт менеджменте - то вот это ближе всего. Для меня это музыка (оцените отсылку)
@themagicworldof @kamyshev_code Мне нравится идея использования давно известного механизма (statecharts) для решения задачи и нравится двумя вещами: строгостью и визуализацией

XState как раз прекрасный пример того, как при описании системы накладываются ЖЕСТОЧАЙШИЕ ограничения на то, что мы можем делать
@themagicworldof @kamyshev_code И именно эти жесточайшие ограничения приводят к тому, что в среднем на одну проблему ты видишь ровно одно нормальное решение. К сожалению, это решение не всегда сразу очевидно (мечты, мечты), но "виртуальный" фидбек "это решение плохо" не дает ошибаться даже в процессе обучения
@themagicworldof @kamyshev_code Пример из реальной жизни. Я очень люблю давать это упражнение на тренингах внутри компаний. Возьмите штук 15 спичек, сложите из них фигуру. Посадите программиста и попросите его давать инструкции другому программисту как сложить списки. Сравните результаты
@themagicworldof @kamyshev_code О чем это я и при чем здесь XState? Когда я даю домашние задания студентам, я часто вижу разные решения, а вот с xstate решения получаются "как под копирку" :) И это просто замечательно
@themagicworldof @kamyshev_code Конечно у XState есть недостатки. Если взять то же WebIDE (я использую ее как пример очень сложной системы), то наружная стейт-машина там будет состоять из малого количества "внешних" состояний и огромного количества вложенных стейт-машин
@themagicworldof @kamyshev_code То есть фактически, на каждую открытую вкладку мы будем создавать стейт-машины, которые точно так же надо будет координировать между собой. Иерархические отношения работают плохо в ситуации, когда в реалиях задачи всё это "тесно связанный клубок" :)
@themagicworldof @kamyshev_code Справедливости ради - большинство задач сильно проще и не требуют хардкора. И для меня гораздо важнее знание, что мой коллега ФИЗИЧЕСКИ не сможет позвать сайд-эффект в коде машины. Закон Парето как он есть :)
@themagicworldof @kamyshev_code TL;DR этого треда:

- хотите "скучный мейнстрим" - берите redux-toolkit
- хотите "новый" и другой подход - берите effector, но внимательно следите за тем, как ваши инженеры решают задачи, чтоб не допустить говнокода
- не готовы принять новую религию? Попробуйте старую - xstate!
@themagicworldof @kamyshev_code Особняком от этого подхода стоит Apollo Client - странный graphql-клиент с кешированием и зачатками стейт менеджмента. Про него я хочу сегодня чуть-позже поговорить отдельно, так как это совсем другая философия :)

Stay tuned, а я пойду поработаю :)

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with jsunderhood

jsunderhood Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @jsunderhood

10 Jun
Итак urql. Если вдруг это буквосочетание прошло мимо-вас - это мощная и эффективная альтернатива apollo client в качестве graphql клиента
Когда я первый раз узрел formidable.com/open-source/ur… то-ли на Hacker News, то ли на Dev.to мой скепсис был столь же велик, как технический долг @vue/test-utils

Однако из этого выросла мощная библиотека с уникальными фичами
Более того, если бы в абстрактном GitLab я бы сейчас принимал решение - я бы взял именно urql и в этом треде попробую пояснить почему
Read 14 tweets
9 Jun
Итак, карьерные лестницы и мои ощущения на них.

Во многом этот тред навеян заполнением своего Career Mapping в GitLab и обсуждением этого с многими людьми "а как у вас это происходит" :)
Начнём с самого простого - с иерархии. Если с первыми шагами у инженера всё просто - junior, middle, senior, то дальше всё нетривиальнее - часто с точки зрения _инженерных_ позиций наступает карьерный тупик
Когда я говорю о карьерном тупике инженерной работы, то имею ввиду, что часто "продолжением" этой лесенки рисуют всякое "тимлидство" - должности, направленные на управление людьми, а не кодом.
Read 29 tweets
8 Jun
К примеру, @nodkz не очень любит все эти финты с локальным состоянием в Apollo, и я прекрасно его понимаю

Тем не менее, к примеру, в проектах где локального состояния мало и оно сравнительно простое - такой подход имеет право на жизнь
@nodkz Время рекламной паузы: я недавно сделал мастер-класс по GraphQL где половину времени посвятил работе с локальным состоянием Apollo.

Если вы познаёте мир GraphQL на фронте или другой мастер-класс вам приглянулся - то по промокоду JSUNDERHOOD скидка в 33% javascript.ninja
@nodkz Мои терзания по поводу стейт менеджмента в GitLab можно почитать в issue - gitlab.com/gitlab-org/git…

Я еще в поиске идеального решения - Apollo Client казался мне таким для задач GitLab, но сейчас очень сильно пугает ощущение, что всё движется не туда
Read 4 tweets
8 Jun
Итак, продолжаем про state management, а именно Apollo Client. apollographql.com/docs/react/

Для тех, кто не в курсе - Apollo Client это "толстый graphql-клиент". Он автоматически выполняет нормализацию кеша, пользуясь тем, что в GraphQL строго типизированные данные
О недостатках, хотя нет, хм... ОСОБЕННОСТЯХ Apollo Client можно говорить очень долго - к примеру, они КРАЙНЕ react-centric, но есть у Apollo Client важная фича - это управление local state
Фактически, вы можете из своих компонентов, продолжать писать GraphQL-запросы и мутации и ваши компоненты __почти__ не будут знать работают ли они с локальным состоянием или с состоянием сервера.

Почему почти? потому что придется писать директиву @client
Read 14 tweets
8 Jun
Доброе утро, коллеги! Как вам спалось?

Хочу в качестве утренней разминки рассказать о сне, своих экспериментах с ним и, возможно, подсказать как спать лучше Image
Для меня сон - это всегда ощущение потерянного времени и маленькой смерти. Мне жалко спать. Поэтому я всегда относился ко сну как к необходимому злу и пытался его оптимизировать
Когда я работал в аутсорсинговой компании, практиковал полифазный сон. Спал 3 часа ночью и 2х45 минут днём. Первые две недели нереально тяжело, потом нормально. Прекратил после 3 месяцев, когда понял что начал тупеть - работать в таком режиме можно, придумывать что-то нет
Read 17 tweets
23 May
Что вам больше всего не хватает в typescript?

Я начну 👇👇👇
Возможность сапресить конкретную ошибку, что бы в случае замены на другую я был уведомлён об этом Image
Возможность указывать текст кастомной ошибки, вместо подсовывания never, например через ключевое слово или вспомогательный дженерик raise Image
Read 9 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal Become our Patreon

Thank you for your support!

Follow Us on Twitter!

:(