Toastmasters, кофе и запуск функции: 30-минутная разработка

Toastmasters, кофе и запуск функции: 30-минутная разработка

Randal Eastman
Randal Eastman Founder & CEO
• 5 мин чтения

Это утро началось с подготовки к выступлению. Закончилось продакшн-деплоем.

Я готовлю выступление для своего клуба Toastmasters (Pitchmasters) о правильном создании нашего блога Updates и CMS на этой неделе. Во время подготовки структуры истории у меня был момент ясности: мои посты Updates относятся к разным типам, но в системе это никак не отражалось.

Некоторые посты — наблюдения («Посмотрите на этот тренд брендов»). Другие — размышления («Вот что я узнал»). Третьи — обновления разработки («Вот что мы запустили»). Ничего сложного — просто способ обозначить намерение.

Я написал Claude: «Нам нужно добавить типы постов».

30 минут спустя: Функция спроектирована, миграция написана, база данных обновлена, UI Hub улучшен, шаблоны Hugo обновлены визуальными значками, двусторонняя синхронизация подтверждена, продакшн развёрнут.

Последовательность разработки

1. Проектирование (5 минут)

Мы определили три начальных типа постов:

  • Build 🔧: Технические обновления, запуск функций, инфраструктурные работы
  • Reflect 💡: Личные инсайты, извлечённые уроки, стратегические мысли
  • Announce 📢: Новости платформы, запуск продуктов, важные события

Просто, понятно, сразу полезно. Без лишних размышлений. Каждый тип получает уникальную иконку и цвет для визуального различия.

2. Миграция базы данных (3 минуты)

-- Добавляем колонку post_type в таблицу updates
ALTER TABLE updates
ADD COLUMN post_type text
CHECK (post_type IN ('build', 'reflect', 'announce'));

-- Заполняем существующие посты на основе анализа контента
UPDATE updates SET post_type = 'build'
WHERE slug IN ('building-updates-cms', 'monorepo-migration-complete',
               'pwa-launch-offline-ready', 'dark-mode-launch', ...);

UPDATE updates SET post_type = 'announce'
WHERE slug IN ('welcome-to-updates', 'domain-migration-brandmine-ai', ...);

UPDATE updates SET post_type = 'reflect'
WHERE slug IN ('backlog-breakthrough', 'why-we-chose-supabase', ...);

Чистый DDL, валидация ограничений, продуманное заполнение. Готово для продакшна с самого начала.

3. Интеграция в Hub (10 минут)

Добавил поле postType в форму Updates с выпадающим селектором. Использовал тот же шаблон перечисления, что и для существующих полей таксономии (markets, sectors). Мгновенная визуальная обратная связь в режиме редактирования.

4. Синхронизация Hugo (8 минут)

Обновил оба скрипта синхронизации:

  • sync-updates-to-supabase.js — читает postType из YAML front matter
  • sync-updates-from-supabase.js — записывает post_type из базы данных в файлы Hugo

Запустил sync-from, чтобы подтянуть заполненные типы в Hugo. Все 13 существующих постов теперь правильно категоризированы.

5. Визуальный дизайн Hugo (6 минут)

Добавил тонкие, ненавязчивые значки на страницу списка Updates в Hugo:

  • Полупрозрачные с размытием фона (glassmorphism)
  • SVG-иконки Lucide (Wrench, Lightbulb, Megaphone)
  • Фоны с 10% непрозрачностью, которые сочетаются с hero-изображениями
  • Микро-взаимодействия (лёгкий подъём при наведении)
  • Полная поддержка тёмного режима

Минимализм 2025: информация без шума.

6. Визуальная валидация (4 минуты)

Открыл Hub → список Updates. Просканировал новую колонку типа поста. Каждый пост показывает правильную классификацию. Фильтр работает. Валидация формы надёжная.

Открыл сайт Hugo → /updates/. Значки рендерятся идеально. Светлый режим чистый. Тёмный режим адаптируется автоматически.

Готово.

Почему так быстро?

Три архитектурных решения сделали это возможным:

1. Database-First дизайн

Наша CMS Updates использует Supabase как источник истины. Файлы Hugo — это сгенерированные артефакты. Когда мы добавляем поле:

  • Добавляем колонку в базу данных
  • Обновляем скрипты синхронизации
  • Визуальная валидация в Hub

Никакой борьбы с форматами статических файлов или ручного редактирования front matter в десятках файлов.

2. Перечисляемые типы на каждом уровне

Ограничение PostgreSQL CHECK, TypeScript enum, массив React Admin choices — одинаковые значения, типобезопасность от базы данных до UI. Добавить новый тип поста? Изменить в одном месте, проверка во время компиляции везде.

3. Скрипты двусторонней синхронизации

Мы построили надёжную синхронизацию между Hugo и Supabase месяцы назад. Добавление нового поля означает обновление логики маппинга в двух функциях. Инфраструктура автоматически обрабатывает валидацию, проверку ошибок и резервное копирование.

Связь с Toastmasters

Почему я разрабатывал это во время подготовки к выступлению?

Потому что лучшая документация — это живая демонстрация.

Я могу сказать Pitchmasters «мы построили CMS» (они вежливо кивнут). Или я могу показать им: «У меня была идея сегодня утром, развернул до кофе, вот история коммитов».

Хорошие инструменты делают выпуск лёгким. Лёгкий выпуск создаёт доказательства. Доказательства рассказывают лучшие истории, чем слайды.

Что это открывает

Типы постов — это не просто метаданные. Они обеспечивают:

Фильтрованные представления

Показывать только обновления разработки в техническом changelog. Отображать наблюдения для исследователей трендов. Группировать размышления в нарратив пути основателя.

Визуальное различие

Уже реализовано: тонкие значки на карточках Hugo с разными цветами и иконками. Посты Build (синий гаечный ключ), посты Reflect (янтарная лампочка), посты Announce (бирюзовый мегафон). Чисто, минимально, информативно.

Интеллект контента

Отслеживать, что мы публикуем: много ли разработок, мало ли наблюдений? Соответствует ли микс контента потребностям аудитории?

Будущие функции

RSS-ленты по типу поста. Сегментация email-дайджестов. Рекомендации «Похожее» на основе типа + таксономии.

Уроки 30 минут

Ограничение порождает ясность

Ограниченное время заставляет вас чётко определять границы. Мы не строили сложную многомерную систему классификации контента. Мы добавили три слова в выпадающий список.

Инфраструктура накапливается

Каждое предыдущее техническое решение (дизайн схемы базы данных, архитектура скриптов синхронизации, типобезопасность TypeScript) сделало это быстрым. Хорошие основы не просто предотвращают проблемы — они ускоряют рост.

Выпускай быстро, проверяй быстрее

Мы могли бы потратить 3 часа на планирование идеальной системы типов постов. Вместо этого мы выпустили за 30 минут и проверили на реальных данных. Теперь мы знаем, полезно ли это.

Мета-уровень

Этот пост в блоге? Написан в CMS Updates, классифицирован как postType: build, синхронизирован с Hugo автоматически, развёрнут на три языка. У него синий значок гаечного ключа на странице Updates, потому что это пост типа build.

Время до публикации: 6 минут от «Сохранить черновик» до «Проверить живой сайт».

Это настоящее достижение. Не функция. Механизм, который делает функции такими лёгкими.


Полные детали реализации:


Обратный отсчёт до выступления в Pitchmasters: 3 дня. Теперь у меня есть лучшая история для рассказа.

Хотите следить за разработкой? LinkedInTwitter/X