URLs are state containers 🔥 Горячее 💬 Длинная дискуссия
URL может быть не просто адресом страницы, а полноценным хранилищем состояния веб-приложения. Автор статьи случайно обнаружил это, когда в коде PrismJS нашёл URL, который полностью восстанавливал его конфигурацию подсветки синтаксиса — все темы, языки и плагины были закодированы в одном адресе. Это напомнило ему о мощи URL как инструмента управления состоянием, который часто игнорируют в пользу сложных решений вроде глобальных хранилищ и контекстов.
URL предоставляет четыре ключевых преимущества бесплатно: возможность делиться ссылками, создавать закладки, использовать историю браузера и глубокую навигацию. Разные части URL кодируют различные типы состояния: путь — для иерархической навигации, параметры запроса — для фильтров и настроек, якоря — для клиентской навигации. Среди распространённых паттернов для параметров запроса — множественные значения через разделители, вложенные данные, булевы флаги и массивы.
Комментарии (196)
- Обсуждение охватывает вопросы: стоит ли хранить состояние в URL, какие ограничения накладывает это, какие есть альтернативы и какие есть подводные камни (отсутствие семантики, безопасность, длинные URL-ы и т.д.).
- Участники обмениваются опытом, что иногда приводит к тому, что URL становится слишком длинным, что это может вызвать проблемы.
- Обсуждается, что такое состояние должно быть сериализуемо так, чтобы его можно было закодировать в URL, и что такое состояние должно быть сериализуемо так, чтобы его можно было сохранить в URL.
- Разговор затрагивает, что такое состояние должно быть сериализуемо так, чтобы его можно было сохранить в URL.
- Участники обсуждают, что такое состояние должно быть сериализуемо так, чтобы его можно было сохранить в URL.
React vs. Backbone in 2025 🔥 Горячее 💬 Длинная дискуссия
Несмотря на 15 лет развития фронтенда, сравнение React и Backbone показывает удивительно мало прогресса в снижении сложности. Код для одинаковой функциональности в обеих фреймворках примерно одинаков по длине, что ставит под сомнение все усилия сообщества. React выглядит чище, но это достигается за счет скрытой сложности абстракций, в то время как Backbone предлагает явное, хоть и многословное, описание происходящего.
"Вы торгуете явной простотой за сложность абстракций" — ключевая мысль статьи. React скрывает множество деталей: неожиданное очищение инпутов из-за смены ключей компонентов, бесконечные циклы в useEffect из-за нестабильных зависимостей, "устаревшие" замыкания в обработчиках событий. Эти не крайние случаи, а обычные проблемы, требующие понимания алгоритмов согласования, фаз рендеринга и планировщика React.
Для 99% приложений, не имеющих тысячи компонентов на странице, такая сложность может быть избыточна. Фундаментальная задача "событие + состояние = UI" остается простой, но современные фреймворки создают ненужные абстракции, мешающие пониманию и отладке. Возможно, сообществу стоит искать более прозрачные и "взламываемые" решения, подобные Backbone и jQuery.
Комментарии (193)
- Обсуждение показало, что споры между сторонниками React и Backbone часто сводятся к сравнению простых примеров, что не отражает реальную сложность больших приложений и может вводить в заблуждение.
- Участники подчеркнули, что React и Backbone решают разные задачи: первый предлагает сложную, но мощную систему управления состоянием, тогда как второй предоставляет прямой и прозрачный контроль над DOM.
- Несколько человек отметили, что выбор между инструментами должен зависеть от характера проекта и команды, а не от сравнения "Hello World" примеров.
- Обсуждение также затронуло вопрос о том, что разработчики могут переоценивать или недооценивать сложность, связанную с управлением состоянием, и как это влияет на выбор инструмента.
- Наконец, было высказано мнение, что выбор между React и Backbone должен быть основан на факторах, таких как размер команды, сложность проекта и долгосрочная поддерживаемость, а не на сравнение простых примеров кода.
Make Any TypeScript Function Durable
Vercel представил Workflow DevKit — библиотеку, добавляющую надёжность, устойчивость и наблюдаемость в асинхронный JavaScript. С помощью простого директивного подхода "use workflow" разработчики могут превращать обычные TypeScript-функции в долговременные процессы, способные приостанавливаться, возобновляться и сохранять состояние. Это устраняет необходимость в ручной реализации очередей и механизмов повторных попыток.
Библиотека предлагает декларативный API для определения и использования рабочих процессов, поддерживает шаги с директивой "use step" и предоставляет встроенные инструменты наблюдаемости — отслеживание выполнения, возможность паузы, повтора и "путешествия во времени" по шагам с автоматическим сбором трассировок, логов и метрик. Код работает одинаково на локальной машине, в Docker, на Vercel или любом другом облаке, обеспечивая переносимость без привязки к платформе.
Комментарии (56)
- Обсуждение в основном крутится вокруг критики Vercel Workflow за то, что он представляет собой еще один слой абстракции, который скрывает детали реализации и ограничивает прозрачность, а также заставляет разработчиков использовать магические строки вроде "use workflow", что делает код менее читаемым и более трудным для отладки.
- Участники также отмечают, что это похоже на попытку создать vendor lock-in, поскольку Workflow требует специфичной для Vercel инфраструктуры, и что это может быть частью более широкой тенденции к созданию проприетарных инструментов вместо использования открытых стандартов.
- Некоторые участники также высказывают сомнения в том, что Vercel Workflow может быть не более чем оберткой вокруг очередной системы очередей/конечных автоматов, и что это может быть не более чем попытка создать vendor lock-in.
- Также поднимается вопрос о том, что если бы Vercel предоставил бы возможность самостоятельно хостить "Workflow" движок, это могло бы быть более приемлемо для сообщества, и что это могло бы быть шагом в сторону открытости и само-хостинга.
I Switched from Htmx to Datastar 🔥 Горячее 💬 Длинная дискуссия
Автор перешёл с HTMX на Datastar, потому что последний убирает две проблемы: размер кода и сложность синхронизации фронтенда с бэкендом. Он показывает, что на практике это сокращает код на 60-70% и убирает необходимость вручную управлять состоянием на клиенте. Datastar заставляет сервер описывать, какие элементы и как должны обновляться, и это упрощает логику. Пример: вместо 3-4 атрибутов HTMX достаточно одного data-on-click. Это также убирает необходимость вручную следить за событиеми и состоянием, потому что вся логика находится в одном месте.
Комментарии (207)
- Обсуждение в основном вращается вокруг сравнения Datastar и HTMX, где участники делятся опытом, спорят о том, какие фичи действительно нужны, и обсуждают, какие из фреймворков лучше подходят для разных сценариев использования.
- Несколько участников подчеркивают, что Datastar требует оплаты за ряд базовых функций, что вызывает сомнения в ценности продукта для open-source сообщества.
- Некоторые комментаторы высказывают, что Datastar и HTMX имеют разные подходы к обновлению контента: Datastar использует Server-Sent Events, в то время как HTMX использует обычные HTTP-запросы.
- Участники обсуждают, что Datastar требует больше кода на стороне сервера, в то время как HTMX позволяет легко обновлять различные части страницы без дополнительного кода.
- Некоторые комментаторы высказывают, что Datastar и HTMX имеют разные подходы к обновлению контента: Datastar использует Server-Sent Events, в то время как HTMX использует обычные HTTP-запросы.
Stategraph: Terraform state as a distributed systems problem
Почему мы создаём Stategraph: состояние Terraform как проблема распределённых систем
Экосистема Terraform десятилетиями обходила фундаментальное архитектурное проблему: использование файловой семантики для решения задач распределённых систем. Результат предсказуем и болезнен.
При масштабировании автоматизации инфраструктуры мы обнаружили, что управление состоянием в Terraform демонстрирует классические симптомы несоответствия между представлением данных и шаблонами доступа. Команды создают сложные обходные решения: разделение файлов состояния, оркестрация обёрток, внешние механизмы блокировок. Это не решения, а доказательство, что мы решаем не ту проблему.
Stategraph подходит к состоянию как к тому, чем оно является на самом деле: направленному ациклическому графу ресурсов с семантикой частичных обновлений, а не монолитному документу.
Патология файлового состояния
Состояние Terraform — это проблема координации. Множество акторов (инженеры, CI-системы) должны одновременно читать и изменять перекрывающиеся подмножества состояния инфраструктуры. Вместо решений с тонкими блокировками и управлением параллелизмом Terraform использует глобальный мьютекс для JSON-файла.
Наблюдение: Вероятность конфликта блокировок растёт сверхлинейно с увеличением команды и количества ресурсов.
Несоответствие гранулярности:
- Текущая модель: чтение 100%, блокировка 100%, изменение 0.5%
- Фактическая потребность: чтение 3%, блокировка 3%, изменение 3%
Разделение файлов состояния не решает проблему, а перераспределяет её, добавляя сложность управления зависимостями между состояниями.
Состояние как граф: естественное представление
Состояние инфраструктуры по своей природе является направленным графом. Ресурсы имеют зависимости, образующие рёбра. Изменения распространяются по этим рёбрам. Terraform внутренне представляет состояние как граф, но на уровне хранения уплощает эту структуру в blob.
При нормализации состояния в графовую базу данных появляются естественные свойства:
- Изоляция подграфов: операции над несвязанными подграфами параллелизуемы
- Точные блокировки: блокировка на уровне ресурсов и зависимостей
- Инкрементальное обновление: вычисление минимального набора изменений через обход графа
Управление параллелизмом через правильные абстракции
Stategraph реализует проверенные паттерны распределённых систем:
- MVCC для неблокирующего чтения
- Write-ahead logging для сохранности данных
- Уровни изоляции транзакций
Традиционный подход:
Acquiring global lock… waiting
Stategraph:
Locking subgraph (3 resources)… ready
Каждая операция блокирует только свой подграф. Менеджер блокировок использует граф зависимостей для предотвращения взаимных блокировок. Читатели получают согласованные снимки без блокировки писателей.
Результат: значительное улучшение пропускной способности при параллельной работе. Три команды могут одновременно применять изменения к независимым ресурсам.
Комментарии (55)
- Предлагается заменить файловую систему Terraform на графовую базу данных для улучшения масштабируемости и устранения глобальных блокировок.
- Текущий файл состояния Terraform ценится за простоту и предсказуемость, но становится узким местом при работе с тысячами ресурсов и большими командами.
- Ключевая проблема — разделение состояния (splitting state) создаёт новые сложности, такие как зависимости между состояниями и необходимость оркестрации.
- Новое решение должно обеспечивать детализированное блокирование ресурсов, а не глобальную блокировку, и предоставлять возможности для запросов и отчётности.
- Обсуждаются вопросы управления доступом (RBAC) и миграции существующих крупных setup'ов в новую модель.
- Подход сравнивается с другими инструментами (Pulumi, Crossplane, Terraform Cloud), но фокус — на оптимизации именно модели Terraform/OpenTofu.
- Мнения разделены: одни видят в этом фундаментальный сдвиг, другие считают, что проблема вызвана антипаттернами в организации инфраструктуры.