[{"data":1,"prerenderedAt":50},["ShallowReactive",2],{"api:\u002Fapi\u002Fconfig:ru":3,"api:\u002Fapi\u002Fabout:ru":8},{"email":4,"lang":5,"name":6,"role":7},"hello@ewsirdev.example","ru","Ewsirdev","Веб-разработчик: сайты, лендинги и сервисы на Go",{"honest":9,"how":15,"intro":31,"lang":5,"principles":34},[10,11,12,13,14],"Почти все проекты учебно-демонстрационные; один сайт — реализованный клиентский, имя клиента не называется. Отзывы и цифры по заказам здесь не заявляются.","Race-детектор (go test -race) на моей рабочей машине не запускается из-за отсутствия C-компилятора; он выполняется в CI.","Свой слой WebSocket не проходил Autobahn Test Suite: корректность проверена собственными тестами. В продакшене разумнее брать проверенную библиотеку.","Демо-данные в проектах (история мониторинга, ссылки, задачи) сгенерированы и помечены в интерфейсах как демо.","Контакты: только почта. Телефон и соцсети намеренно не указаны.",[16,19,22,25,28],{"title":17,"text":18},"Разговор","Выясняем задачу, аудиторию и ограничения. Если сайт не нужен, скажу об этом сразу.",{"title":20,"text":21},"Договорённости","Состав работ, сроки и что считается готовым. Письменно, без сюрпризов.",{"title":23,"text":24},"Сборка","Короткие итерации: промежуточный результат можно открыть и потрогать.",{"title":26,"text":27},"Проверка","Тесты, мобильные экраны, доступность, нагрузка на форму и API.",{"title":29,"text":30},"Запуск","Docker-образ или статика, инструкция по запуску, передача кода.",[32,33],"Я веб-разработчик: делаю лендинги и небольшие сервисы на Go. Почти все проекты на этом сайте учебно-демонстрационные: бренды вымышленные, данные демо, код приватный и открывается по запросу. Исключение — один реализованный клиентский сайт (клиента не называю).","Здесь нет отзывов и цифр о заказах: показываю только то, что можно проверить, то есть работающий код, тесты и README с ограничениями.",[35,38,41,44,47],{"title":36,"text":37},"Просто и проверяемо","Стандартная библиотека Go, понятная структура пакетов, тесты на то, что действительно важно: конкурентный захват задач, двойная бронь, протокол WebSocket.",{"title":39,"text":40},"Честные ограничения","В каждом README есть раздел «Ограничения»: один токен вместо ролей, один процесс, at-least-once вместо exactly-once. Лучше сказать заранее, чем объяснять потом.",{"title":42,"text":43},"Доступность по умолчанию","Контраст по WCAG AA, видимый фокус, работа с клавиатуры, уважение к prefers-reduced-motion, mobile-first вёрстка.",{"title":45,"text":46},"Без секретов в коде","Настройки идут через переменные окружения, токены генерируются при старте, если не заданы.",{"title":48,"text":49},"Один бинарник","Фронтенд встроен в Go-сервис через embed, запуск не требует установки зависимостей; для SQLite используется драйвер без CGO.",1792697892477]