будни

Мы перезапустили Вебиум!

Вебиум — онлайн-школа по подготовке к ЕГЭ. 30 тысяч школьников, тысяча наставников, 20 тысяч вопросов и 2 тысячи домашних заданий на сотни тем. Перед нами стояли 3 задачи:

1. Сделать так, чтобы фичи, которые хочет бизнес, разрабатывались быстрее и более предсказуемо. Обостряю для ясности, с чем часто сталкивается бизнес: «давайте добавим вот эту маленькую штуку; конечно, будет завтра (возвращаются через две недели), ой нет, это займет полгода» (и это ещё хорошо, если вернутся с таким честным ответом);

2. Нанять технического директора и создать внутреннюю команду разработки, чтобы в будущем не зависеть от аутсорса;

3. Сделать всё это «на лету», без остановки образовательного процесса, без потерь для бизнеса.

14 специалистов «Феди и Самата», 21 сотрудник Вебиума, год работы, 340 пользовательских сценариев на старте, 2900 коммитов, 5400 автотестов и я твердо говорю: все три задачи выполнены.

У Вебиума одна из самых сложных админок и систем кросс-сайтовой аутентификации, с которой я сталкивался. Мы сделали свой собственный мессенджер, информативный и при этом простой календарь, автоматическую систему распределения учеников по группам и продвинутую систему контроля доступа. Каждая из этих систем достойна отдельного рассказа.

Я прицепил скриншотами, как реагируют на запуск школьники.

В ближайшие недели мы поделимся, что неожиданно оказалось самым трудным, где и как мы накололись и чему научились.

А пока хочу поблагодарить ребят, без которых проект бы не получился:

- Миша Бурмистров, ведущий фронтендер, руководитель проекта
- Леша Чудин, ведущий бэкендер
- Саша Нестеров, фронтенд
- Эдуард Степанов, бэкенд
- Андрей Бацунов, фронтенд
- Антон Давыдов, архитектор
- Ксюша Сафронова, менеджер проекта

- Владимир Тарановский, фронтенд
- Вячеслав Набатчиков, бэкенд
- Леша Богословский, фулстек
- Николай Кирьянов, бэкенд
- Тимур Брачков, фронтенд
- Никита Лазаренко, бэкенд
- Никита Алешников, бэкенд.

Горжусь ребятами.

Мы сделали этот проект совместно с командами разработки, аналитики, техподдержки и тестирования Вебиума. Отдельное спасибо:
- Роксане Боровик, руководителю Вебиума, за доверие;
- Вике Гармаш, продакту Вебиума;
- Никите Савостину, техдиру Вебиума.

У вас трудности с разработкой и текст выше кажется нереальным? Пишите @samatg, мы любим сложные задачки :)

У меня на руках было 18 часов аудиозаписей, которые нужно было перевести в текст. Как расшифровать аудио в текст?

Можно заплатить профессионалам.

Можно самому всё слушать и печатать, это сложная и долгая работа.

Я решил скормить аудио дорожки машине и исправить трудные для алгоритма слова руками в специальном редакторе.

Для текстов на английском языке есть совершенно космический редактор — Descript. В нем редактируешь текст, а он при этом сам переставляет местами нужные куски аудио. Прорыв для редактуры подкастов, пока, к сожалению, для нас недоступный.

С поддержкой русского выбор немного сужается, но всё равно есть очень классные сервисы: HappyScribe, Trint, SimonSays, Sonix. Эти продукты отличаются моделью ценообразования и вниманием к деталям.

Эти сервисы не разрабывают алгоритмы распознавания речи. Я уверен, что они пользуются облачными API одного из крупных игроков — у гугла эта штука называется Google Cloud Speech-to-Text. Практические идентичные решения есть у Яндекса, Амазона и Microsoft.

По стоимости: расшифровка часа видеозвонка в гугле стоит 2.16$, у яндекса — 0.46$, а в Sonix — от 5 до 10$, остальные сервисы ещё дороже. Для сравнения, профессиональная расшифровка с русского — около 23$ за час.

Даже с крутым сервисом, работа заняла у меня больше 40 часов. Я сильно недооценил необходимый объем труда.

Кстати, у гугла есть вариант «поделиться своими аудиозаписями с гуглом для улучшения моделей распознавания». Тогда они дают скидку в 30% и берут за распознавания речи только 1.44$ в час.

Есть идея о том, что компании должны платить нам за наши данные. Это — первый известный мне пример реализации этой идеи на практике.

Жена температурит, я остался с детьми.

Ну и конечно же, fb выключил апи, которое мы использовали для получения числа шеров и лайков.

Боря быстро нашёл замену, но она оказалась с рейт-лимитами per user per hour. Слава Аллаху, у нас есть фб-приложение с сотней тысяч пользователей, так что в конце дня все заработало даже лучше, чем раньше, но я в результате целый день провёл в телефоне на детской площадке, а Боря тушил пожары вместе разработки крутого проекта.

Проблема не в том, что фб изменил апи, а в том, что мы об этом узнали пост фактум. В пн составлю список сервисов, от которых мы зависим и заведу их dev блоги в слек-канал с названием #api-changes. Вот так технические директора обретают опыт :(

Спасибо вам за поздравления и теплые слова. Я давно не чувствовал такой благодарности.

Уходить очень страшно. Я ценю вашу поддержку.

Отвечу на вопросы, которые мне задали много раз:

1. Что с каналом «запуск завтра»? Продолжаю вести. Расскажу, как передаю дела в Медузе. Увидите, как я принимаю новый проект, погружаюсь в игровой и блокчейн мир. Медиа-новости тоже будут.
2. Останусь ли в Риге? Да. Планирую каждые месяц-полтора летать в Москву.
3. Есть ли канал у Бори (нового техдира Медузы)? Пока нет. Как появится — дам ссылку обязательно.
4. Есть ли вакансии в RAWG? Скоро будут :)

Наш клиент, сеть медицинских клиник Чайка ищет UX дизайнера. Главный IT-продукт Чайки — медицинская информационная система, в которой 600 врачей ведут лечение тысяч пациентов. Ещё у них есть сайт и мобильное приложение для пациентов.

Чайка заслуженно гордится простотой и удобством своих интерфейсов, но им нужно расти. Сохранить систему простой при добавлении новых функций — сложная инженерная и дизайн задача.

Мы с Федей помогаем с технологиями, но дизайнер в Чайке всего один. Саша уже не справляется с нагрузкой и ищет себе партнера — крепкого мидла. Денег 180-230тр, удаленка. Подробная вакансия и инструкции — тут.

Как перезапустить проект технически?

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

Они пользуются уже третьей версией своей платформы. Фронтенд на low-code платформе Bubble, бэкенд частично на flask и частично n8n. Всё работает, приносит пользу, проект поднял больше миллиона долларов инвестиций.

Как навести порядок, радикально увеличить скорость доставки фич и гарантировать масштабируемость?

Первый порыв любого программиста — переписать всё с нуля. Благо, проект ещё не очень большой, за месяца 3–4 парой программистов, наверное, можно управиться. Составить список фичей, написать их заново, потушить сервис на пару часов, импортировать данные из старой системы в новую и запуститься.

Но это — ошибка. Во-первых, мы не понимаем истинного объема бизнес-логики, который успел накопиться в коде. Скорее всего, сам клиент её недооценивает. Во-вторых, пока будем переписывать — проект продолжит развиваться. Придется догонять. В-третьих, любой, кто делал импорт данных, скажет вам, что это задача из ада, и чем старее данные — тем сложнее их вытащить. Настроить тестирование этого нового проекта будет сложно, да и полноценным оно не может быть по определению.

В результате, в момент включения новой платформы в продакшен, точно возникнут проблемы, которые придется героически исправлять «прямо сейчас», в стрессе. Мало предсказуемости, о реальном объеме работы мы узнаем только в самом конце проекта, при попытке переключения. Мы такое не любим.

Правильный ход — это strangler fig pattern. Пишем небольшую обертку для старого бэкенда. Этот новый бэкенд действует как прокси — передает запросы к старому бэкенду, запоминая сами запросы и ответы. Дальше выделяем первые эндпоинты бэкенда, которые мы можем запрограммировать заново, красиво. Дублируем эти запросы пользователей в старый и новые движки. Сравниваем ответы нового движка с ответами старого, исправляем ошибки. Накапливаем информацию в новую, аккуратно составленную базу данных. И только после продолжительного тестирования на живых данных начинаем отдавать пользователю ответы нового бэкенда. Берем следующую пачку эндпоинтов и повторяем процесс.

Получается, у нас нет момента «большого рубильника», который переключит весь трафик со старого движка на новый, мы «едим этого слона по частям». Переход со старого бэкенда на новый происходит плавно, незаметно для бизнеса. Ошибки в новой системе видны только программистам и не затрагивают клиентов.

Не менее важна предсказуемость. В первом подходе мы весь проект живем под дамокловым мечом — какие сюрпризы нас ждут при запуске? Во втором подходе мы размазываем эту неопределенность по всей продолжительности проекта, так что уже через пару недель можно увидеть реальную скорость разработки, включая исправление ошибок, и оценить общий объем работы и сроки.

Наконец, этот подход позволяет выкатывать новые фичи в продукте внутри нового бэкенда до окончания переезда, параллельно с рефакторингом.

К сожалению, кажется, что каждый молодой программист обречен пытаться всё переписать правильно с нуля. Технарь, предлагающий strangler fig pattern, не лучше, просто за его обучение уже заплатил другой заказчик.

На фотографии тот самый фикус-душитель опутывает дерево, как новый бэкенд опутывает старый.

5 лет назад мы с Федей начали свое дело.

Начинали мы как два технических директора-консультанта и назвали компанию «Федя и Самат».

За 5 лет мы набрались опыта, собрали свою команду. Теперь мы автоматизируем бизнесы, проводим большие аудиты, (пере)запускаем сложные проекты; в компании уже больше 20 инженеров, архитекторов и менеджеров и называемся мы теперь более серьезно — «ФАНС разработка».

В этот праздничный для нас день, с гордостью представляю новый запущенный проект — цифровое рабочее пространство для управления международными грузоперевозкам. Это яркий пример, в котором мы не просто программируем, а помогли бизнесу уточнить и раскрыть задачу, реализовали ее, внедрили и продолжаем развивать — в общем, работаем «под ключ», прямо как хороший внутренний отдел разработки.

В честь праздника мы запускаем новый сайт, на котором будем потихоньку собирать кейсы и статьи. А еще там есть про то, как мы работаем и почти вся команда!

🎉 🥳

Почти 4 месяца назад мы в Медузе запустили путеводители «Атлас» — 10 приложений-путеводителей на 3 платформах — Web, iOS, Android. Вот короткое описание, какие подводные камни мы собрали в процессе реализации проекта: https://dev.meduza.io/как-запустить-20-приложений-за-3-месяца-или-что-такое-атласы-bdb0515748d7

Немного стыдно публиковать здесь вакансию в субботу утром после недельного перерыва в постах, но мы с Федей ищем сильного питониста в upmarket.

Работа хорошая: руководство слышит и уважает разработку, код без легаси покрыт тестами и приносит пользу реальному бизнесу, есть опытный питонист-напарник. Коммуникация в основном асинхронная, можно работать по своему графику — конечно же удаленно, но при желании можно заходить в офис к ребятам в Питере. Есть и скучная работа вроде парсинга маркетплейсов в настроенной для этого инфраструктуре и интересная — по динамическому ценообразованию и автоматическому заказу. По деньгам — 120-220тр в месяц на руки в зависимости от производительности и опыта; 50тр тому, кто направит вас к нам.

Подробности здесь, пишите Феде на почту fedor@borshev.com или мне в личку.