Дедлайны могут подорвать работу даже самой сильной команды разработчиков. В работе по дедлайнам существует несколько альтернатив, одна из них — теория про демо-версии. Подробно рассказываем, что это такое и как внедрить эту практику в вашу разработку.
Это адаптированный перевод статьи Demos Over Deadlines, повествование ведется от лица автора — Эрика Эллиотта. Он сооснователь онлайн-школы программирования и опытный разработчик, который пишет на JavaScript. При этом он еще написал несколько книг и работал с BBC, Adobe, Wall Street Journal.
За свою карьеру я видел всякие команды — эффективные, и не очень. По моим наблюдениям, только один фактор позволяет предсказать успех команды разработчиков — как она работает под внешним давлением. Если на разработчика слишком сильно давить — он начнет страдать от выгорания, и даже может уволиться.
Как опытный руководитель, я стараюсь держать баланс между двумя конфликтующими целями. Первая цель — как можно быстрее выпустить продукт. Вторая цель — не перенапрягать команду сроками. Чтобы добиться обеих целей, я обычно расставляю команде приоритеты, после чего отхожу в сторону и просто не мешаю людям делать свою работу.
Но это еще не все. Когда команда добавляет новую фичу, она обязана показать ее демо-версию. Привязки к срокам нет: если показывать нечего, разработчики ничего и не показывают. Получается, что мы фокусируемся не на сроках, а на том, чтобы добавить фичу и показать ее. Если бы мы фокусировались на сроках — а они, признаем честно, обычно совершенно нереалистичные — то все страдали бы от лишнего стресса. Но когда перед командой стоит задача показать демо, разработчики ощущают не стресс, а азарт.
По крайней мере так показывает мой опыт работы. Я вижу, что с фокусом на демо-версиях фичи команда чаще испытывает гордость за проделанную работу, а еще радуется тому, что ее труд замечают и ценят. Еще бы — ведь у нас в компании остальные сотрудники аплодируют ребятам каждый раз, когда те показывают новую фичу.
Но чтобы по-настоящему оценить пользу такого подхода, нам нужно глубже взглянуть на явление дедлайнов и их ключевую проблему: невозможно точно оценить сроки работы над программным обеспечением.
Содержание
Сроки врут
Чаще всего сроки и дедлайны врут. В 2012 году CNN проанализировал топ-50 проектов на Kickstarter и обнаружил, что 85% из них запустились позже назначенного срока. Другое исследование под названием «Почему сроки срываются? Эмпирическое исследование причин задержки запуска программных продуктов» было опубликовано научным журналом IEEE. В нем исследователи обнаружили, что в среднем реальные сроки сдачи проекта отличаются от прогнозируемых на 36% (данные на основании изучения дедлайнов в 72 проектах).
Сложности в оценке сроков
Прежде, чем мы мы начнем, попробуйте ответить на вопрос — сколько пчел в обычном улье? Ответьте пожалуйста без использования гугла, и запишите свой ответ на бумажке.
Почему мы так часто ошибаемся с оценкой сроков. И иногда очень сильно
-
Фичеризм, также известный как синдром кухонной раковины — когда в проект решают добавить незапланированные на старте продукты.
-
Terra Incognita. Разработка программного обеспечения — всегда путешествие в неизвестное. Мы делаем то, что никто до нас не делал, и узнаем о новых API, новых протоколах, создаем новые компоненты с нуля, а иногда мимоходом решаем проблемы, которые никто до нас не решал. Процесс разработки — это кроличья нора, но почему-то это не мешает нам чересчур оптимистично оценивать сроки проекта.
-
Не учитываем все задачи. Отладка, интеграция, написание тестов, написание новых тестов, сборка и пересборка. Все эти задачи требуют кучи времени, но мы не учитываем это при постановке дедлайна.
-
Библиотеки. Когда возникает проблема с подключенной библиотекой (а она обязательно возникает), и тогда у команды остается два варианта — связаться с авторами библиотеки или с нуля разрабатывать альтернативу. То и другое занимает кучу времени.
-
Жизнь. В жизни всякое бывает: больничные, отпуска, свадьбы, дети. Такое не запланируешь.
Поэтому я говорю, что оценка сроков — это беззастенчивая ложь. Ведь мы пытаемся оценить новый программный продукт, то есть что-то совершенно новое, таящее в себе море нюансов и подводных камней.
Чтобы что-то оценить, нам нужны данные о том, какие задачи требуется выполнить и сколько времени занимает каждая из них в отдельности. Но если мы создаем что-то новое, то у нас таких данных нет.
Иногда работа ускоряется: например, когда мы выпускаем новую версию уже знакомого продукта. Но бывает и наоборот, проект задерживается — например из-за того, что мы вводим в проект нового разработчика и надо дать ему время на адаптацию.
Переменных слишком много. Даже если каждый сотрудник будет сам высчитывать свое среднее время работы над каждой задачей, нам это не поможет.
Так и зачем тогда это все?
Силы, которые заставляют нас ставить дедлайны, кажутся непреодолимыми. Клиент хочет знать, во сколько ему обойдется проект. Инвестор в свою очередь должен убедиться, что его деньги не пустят на ветер. И вам тоже очень важно угодить инвестору, иначе работать будет не на что. И вот, вам нужно что-то показать к началу следующего года. Но это реальный дедлайн или плод нашего воображения? Давайте рассмотрим конкретный пример.
Клиент подписал с вами контракт
Клиент хочет заказать клон TikTok и спрашивает, сколько времени займет работа. Честный ответ тут один:
«Чтобы точно сказать, сколько времени займет работа, нам нужно узнать полный список функций, которые должны быть в приложении. И мы не узнаем точный список, пока не погрузимся в проект».
Вместо того, чтобы соблазнять клиента нереалистичными сроками, покажите ему свое портфолио. Дайте почитать отзывы прошлых клиентов. А потом предложите такую сделку: за определенную сумму вы выделяете определенное количество ресурсов на работу над его проектом.
То есть не надо просить деньги за готовый продукт. Намного эффективнее просить оплату за время работы над проектом. А уже потом тщательно контролировать объем работы, чтобы не выйти за рамки бюджета. Для этого регулярно проводите встречи и обсуждайте приоритеты в работе над проектом. Показывайте демо-версию каждый раз, когда у приложения появилась новая функция.
Я люблю этот подход за то, что риск провала уменьшается для обеих сторон. Допустим, вы поработали месяц и понимаете, что недооценили сложность проекта — тогда обсудите это с клиентом. Определите, какие функции приложения действительно решают бизнес-задачи, а какие — нет. Откажитесь от всего лишнего.
Отчеты перед инвестором
Одна из самых больших проблем в разработке программного обеспечения состоит в том, что люди делят шкуру неубитого медведя. В мире стартапов это нормально — просить деньги за несуществующий продукт. Чтобы убедить инвестора дать денег, стартап обещает использовать систему майлстоунов: компания достигает цели за n месяцев, а инвестор дает новый мешок денег. Потом новая цель и новый мешок.
Я бы советовал отказаться от датированных майлстоунов. Амбициозные цели — это хорошо, но не привязывайте их выполнение к конкретным срокам. Никто из нас не умеет предсказывать будущее, наши ресурсы и приоритеты часто меняются. Когда вы планируете майлстоуны без конкретных дат, вы оставляете себе возможность проявлять гибкость, а гибкость — это хорошо и для разработчиков, и для бизнеса.
Хотя бы потому что весь проект не отменяют только потому, что вы неправильно оценили сроки. В стратегии, которую я предлагаю, от разработчиков требуется только хорошо работать и показывать результаты своей работы. Конечно, всегда есть риски: например, вы плохо расставили приоритеты и потратили все деньги. Однако в этом случае гнев инвестора хотя бы оправдан.
Но бывают и такие инвесторы, которые настаивают на том, чтобы у проекта были фиксированные сроки. Я бы советовал просто избегать таких партнеров. Я придумал универсальную формулировку на тот случай, если инвестор спросит, почему вы не хотите ставить дедлайны:
«Мы предпочитаем показывать демо-версии продукта вместо того, чтобы строить работу вокруг дедлайнов. Так мы поступили с продуктом A и B, а недавно вот выпустили приложение C. Давайте я его вам покажу».
Покажите демо-версию продукта и похвастайтесь тем, какую классную фичу вы добавили, вместо того, чтобы жаловаться, как вас достали нереалистичные сроки. Если вы избегаете фичеризма, то вероятно, что новые демо будут появляться каждые несколько недель. А это значит, что при каждой встрече с инвестором вы сможете показывать ему что-нибудь новенькое.
Фиксированные сроки сдачи проекта
Компании часто анонсируют новые продукты задолго до их выпуска. Я придумал легкое, но не универсальное решение: просто не надо так делать. Не надо анонсировать продукты до того, как они будут готовы к запуску. Тогда у вас не будет аврала перед сдачей, и не придется срезать углы. Вообще, как правило, разработчики срезают углы только ради того, чтобы достичь воображаемого дедлайна. Но вред, который наносит такой подход, совсем не воображаемый, а вполне реальный.
Компании используют ранние анонсы для того, чтобы клиенты дождались их продукта, вместо того, чтобы купить аналог у конкурента уже сейчас.
Ранний анонс — очень опасная игра. В нее можно играть, только если
- У вас есть надежные партнеры, которые всегда и точно в срок выполняют свои обязательства
- У вас есть хорошо отлаженный процесс производства и большой опыт в сфере, что на самом деле редкость, ведь программист редко создает что-то, что было уже создано до него
- Продукт полностью или почти полностью готов, поэтому вы отдадите клиенту то, что обещали
- У вас есть некоторая гибкость, а потому вы можете отказаться от нескольких фич, чтобы успеть к дедлайну. Даже если его перенесут на конец следующего месяца
Если вы не успеете запустить продукт к анонсированной дате, то у PR-отдела будут крупные неприятности, и это не говоря уже о финансовых расходах. Так что в итоге да, компании с надежными партнерами и эффективным процессом производства могут позволить себе ранние анонсы. Но большинство IT-компаний не могут этим похвастаться и должны их избегать. Если вы устанавливаете дедлайн, убедитесь, что сможете поменять приоритеты на случай спешки. Занимайтесь задачами с низким приоритетом уже после запуска продукта.
Закон Брукса
«Добавление рабочей силы на поздних стадиях разработки продукта обычно затягивает его выпуск».
Возможно, вы слышали об этом законе раньше. Если углубиться в этот вопрос, мы узнаем еще кое-что:
-
Новым разработчикам нужно время на то, чтобы включиться в проект. Это как минимум 2-3 месяца перед тем, как программист сможет стать полноценным членом команды. И помните о том, что все остальные разработчики будут работать над самим проектом меньше, ведь они будут отвлекаться на обучение новичка.
-
Новички делают много ошибок. А эти ошибки еще кому-то переделывать, что тоже занимает время.
-
С ростом количества сотрудников растут и затраты на коммуникацию. Чем больше разработчиков — тем больше каналов коммуникации: чатов, тредов, созвонов. А чем больше каналов, тем ниже прозрачность проекта и тем он становится сложнее. Да и в общем координировать работу большой команды довольно сложно.
-
Написание кода — это не самая сложная часть разработки. Самое сложное — декомпозировать процесс создания продукта на маленькие задачки. Если команда слишком большая, задач на всех будет просто не хватать, разработчики начнут делить одну и ту же задачу и мешаться друг другу.
Надо также помнить, что заключительные этапы проекта сжирают больше всего времени. Вот на этом графике из реального проекта заметно, какой прогресс мы делали в первые месяцы, и как замедлились в последующие:
Решение для проблемы оценки сроков
Помните, я просил вас примерно прикинуть количество пчел в улье? Я понимаю, что вы не располагаете фактами, чтобы сделать точную оценку. Да и что именно мы пытаемся посчитать?
- Мы считаем число пчел, которые участвуют в жизни колонии на протяжении всего времени существования конкретной колонии?
- Мы считаем количество пчел, которые живут в улье за год?
- Мы считаем среднее количество пчел, которые находятся в улье прямо сейчас?
- Меняется ли количество пчел в зависимости от географического положения улья и времени года?
В вашем ответе был численный диапазон или конкретное число? Забавно, что разработчики называют конкретные числа при оценках, предпочитая конкретику точности, однако когда их просишь назвать сроки, их ответы очень размытые. Никто не согласится сделать фичу за один день или за две недели.
Натыкаясь на подводные камни
Большинство разработчиков смогут назвать какие-то сроки, если надавить на них. Однако все понимают, что эти сроки взяты с потолка. Кто знает, сколько времени займет один тикет? А сколько тикетов надо, чтобы закончить проект? А кто-то знает вообще реальный список всех задач, которые надо выполнить для запуска проекта?
Правда в том, что процесс оценки сложности — это часть разработки программного обеспечения. То есть вы сможете точно оценить сложность, только с головой нырнув в разработку. Делайте оценку постепенно, в процессе разработки проекта, но не перед его началом.
В своей книге «Построение приложений» я пишу о том, что всё в программировании так или иначе связано с построением систем. Мы берем задачу и делим ее на части, как правило на независимые и удобные для работы — и это тоже является построением системы.
Реализовать части системы и собрать их вместе — это не самое сложное. Самое сложное — это создать интерфейс, который будет обеспечивать хорошую связь этих частей внутри системы. Как это сделать? Надо продумать, на какие именно части разделить систему.
Это нешуточный объем работы, и его необходимо сделать в самом начале разработки. Только после этого мы можем оценить сложность проекта, и в конечном итоге обозначить какие-то сроки.
Даже если вы измерили среднюю скорость работы над задачей, нельзя предполагать, что вы будете выполнять новые задачи с одинаковой скоростью. За любой задачей может скрываться несколько подзадач, что автоматически делает наши расчеты неверными.
Посмотрите на график ниже, он показывает количество открытых issues в конкретный момент времени. Если бы скорость работы было так просто рассчитать, то число задач просто бы снижалось со временем. Но нет, график ниже напоминает график цен на акции: он ломаный, непредсказуемый.
В самом начале число issues большое, потом это число стабилизируется в определенном диапазоне. Он может меняться, если меняется сложность задачи или количество разработчиков в команде. Примерно с середины проекта количество задач непредсказуемо колеблется и только в самом конце существенно снижается.
Кстати, в обычном улье от 10 тыс. до 80 тыс. пчел.
- Если вы назвали число, которое меньше 10 тыс. — вы проиграли. Будем считать, что вы сорвали сроки. Game over
- Если вы назвали число больше 80 тыс., то управление сроками берет на себя ваш босс. Он считает, что вы себя недооцениваете, а потому объявляет анонс продукта на срок вдвое меньший, чем вы бы того хотели. А вы в ответ срываете новый срок сдачи. Вы снова проиграли
- Если ваш ответ тоже был диапазоном, но наименьшее число меньше 10 тыс. — вы тоже проиграли
- Если ваш ответ был конкретным числом и вы попали в диапазон, то сделайте следующее, чтобы вычислить свои баллы. Вычислите разницу между вашим числом и 45 тыс., а потом умножьте результат на -1. Вот ваши баллы, поздравляю! Вы как бы не проиграли, но и выигрышем это назвать сложно.
- Если вы назвали точное количество пчел в улье, используя диапазон, поздравляю с победой.
Ну и какое же решение я предлагаю для проблемы оценки сроков? Просто не оценивайте точно сроки.
Вот ключевые шаги для отказа от дедлайнов:
- Выпускайте демо-версии продукта
- Избегайте фичеризма
- Расставляйте приоритеты
Если вам надо поставить дедлайн, или у вас ограниченный бюджет, то не пытайтесь добавить все фичи. Вместо этого стройте приложение из независимых компонентов, чтобы ничего не сломалось, если вдруг вы откажетесь от реализации каких-то функций. Это очень важно — построить приложение так, чтобы можно было безболезненно сократить круг задач. Чтобы этого добиться, требуется очень хороший уровень коммуникации как внутри продуктовой команды, так и со стейкхолдерами.
Я призываю вас использовать демо-версии вместо дедлайнов, потому что от этого ваша команда будет счастливее и продуктивнее. Ирония в том, что отказавшись от дедлайна, вы больше никогда не будете срывать сроки.
<!DOCTYPE html>
<html class="h-100" data-bs-theme="light" data-mantine-color-scheme="light" lang="ru" prefix="og: https://ogp.me/ns#">
<head>
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<link crossorigin="true" href="https://cdn.hexlet.io" rel="preconnect">
<link href="https://mc.yandex.ru" rel="preconnect">
<meta content="aa2vrdtq64dub8knuf83lwywit311w" name="facebook-domain-verification">
<link href="/favicon.ico" rel="icon" sizes="any">
<link href="/favicon.svg" rel="icon" type="image/svg+xml">
<link href="/apple-touch-icon.png" rel="apple-touch-icon">
<link href="/manifest.webmanifest" rel="manifest">
<script>
//<![CDATA[
window.gon={};gon.ym_counter="25559621";gon.is_bot=true;gon.applications={};gon.current_user={"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26 19:58:32 UTC","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false};gon.token="LPmXovkD2cmv4j-nqauP6pprLcrGcBHd2KpUR2e171fDKFyVC310qRmhGz-lpH-dWmIAYM5H739lSs4TNbIIOQ";gon.locale="ru";gon.language="ru";gon.theme="light";gon.rails_env="production";gon.mobile=false;gon.google={"analytics_key":"UA-1360700-51","optimize_key":"GTM-5QDVFPF"};gon.captcha={"google_v3_site_key":"6LenGbgZAAAAAM7HbrDbn5JlizCSzPcS767c9vaY","yandex_site_key":"ysc1_Vyob5ZPPUdPBsu0ykt8bVFdzsfpoVjQChLGl2b4g19647a89","verification_failed":null};gon.social_signin=false;gon.typoreporter_google_form_id="1FAIpQLSeibfGq-KvWQ2Fyru-zkFFRVTLBuzXAHAoEyN1p49FtDmNoNA";
//]]>
</script>
<meta charset="utf-8">
<title>Теория демо-версий: Как дедлайны делают разработчиков несчастными</title>
<meta name="description" content="Дедлайны могут подорвать работу даже самой сильной команды разработчиков. У работе по дедлайнам существует несколько альтернатив, одна из них — теория про демо-версии.">
<link rel="canonical" href="https://ru.hexlet.io/blog/posts/teoriya-demo-versiy-kak-dedlayny-delayut-razrabotchikov-neschastnymi">
<meta property="og:title" content="Теория демо-версий: Как дедлайны делают разработчиков несчастными">
<meta property="og:description" content="Дедлайны могут подорвать работу даже самой сильной команды разработчиков. У работе по дедлайнам существует несколько альтернатив, одна из них — теория про демо-версии.">
<meta property="og:image" content="https://ru.hexlet.io/vite/assets/blog_post-7eTyeLLt.webp">
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="HrTLFcU-BggEyaFr8Vzhaw4P2NxSlCEayXYcp1MGFojxZQAiN0CraLKKhfP9UxEczgb1dlqj37h0lobzAQHx5g" />
<script src="/vite/assets/inertia-DfXos102.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/preload-helper-BJ4cLWpC.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ahoy-DrlRQ-1D.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/analytics-cb8xch9l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Surface-DL2bpZA-.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/extends-C-EagtpE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/inheritsLoose-BBd-DCVI.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/objectWithoutPropertiesLoose-DRHXDhjp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/index.esm-DAqKOkZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Button-CGPUux8l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/CloseButton-D1euiPao.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Group-BX48WcuU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Loader-BQEY8g6v.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Modal-Cy3HByv7.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/OptionalPortal-1Hza5P2w.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Stack-CtjJzfw4.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Textarea-Ck64llAy.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/DirectionProvider-Dc9zdUke.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/events-DJQOhap0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-reduced-motion-D2owz4wa.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-disclosure-zKtK5W1r.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-hotkeys-Cnc_Rwkb.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/random-id-DOQyszCZ.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/exports-C_MrNx_T.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<link rel="stylesheet" href="/vite/assets/application-BqhCP46M.js" />
<script src="/vite/assets/application-Df9RExpe.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/autocomplete-VMNbxKGl.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/createPopper-C3aM9r1M.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/js.cookie-D1-O8zkX.js" as="script" crossorigin="anonymous"><link rel="stylesheet" href="/vite/assets/application-C8HjmMaq.css" media="screen" />
<script>
window.ym = function(){(ym.a=ym.a||[]).push(arguments)};
window.addEventListener('load', function() {
setTimeout(function() {
ym.l = 1*new Date();
ym(window.gon.ym_counter, "init", {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true
});
// Загружаем скрипт
var k = document.createElement('script');
k.async = 1;
k.src = 'https://mc.yandex.ru/metrika/tag.js';
document.head.appendChild(k);
ym(window.gon.ym_counter, 'getClientID', function(clientID) {
window.ymClientId = clientID;
});
}, 1500);
});
</script>
<!-- Google Tag Manager - deferred -->
<script>
// dataLayer stub сразу — пуши работают до загрузки скрипта
window.dataLayer = window.dataLayer || [];
// Сам скрипт — отложенно после load
window.addEventListener('load', function() {
setTimeout(function() {
dataLayer.push({'gtm.start': new Date().getTime(), event: 'gtm.js'});
var j = document.createElement('script');
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=GTM-WK88TH';
document.head.appendChild(j);
}, 1500);
});
</script>
<!-- End Google Tag Manager -->
</head>
<body>
<noscript>
<div>
<img alt="" src="https://mc.yandex.ru/watch/25559621" style="position:absolute; left:-9999px;">
</div>
</noscript>
<header class="sticky-top bg-body">
<nav class="navbar navbar-expand-lg">
<div class="container-xxl">
<a class="navbar-brand" href="/"><img alt="Логотип Хекслета" height="24" src="https://ru.hexlet.io/vite/assets/logo_ru_light-BpiEA1LT.svg" width="96">
</a><button aria-controls="collapsable" aria-expanded="false" aria-label="Меню" class="navbar-toggler border-0 mb-0 mt-1" data-bs-target="#collapsable" data-bs-toggle="collapse">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsable">
<ul class="navbar-nav mb-lg-0 mt-lg-1">
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
Все курсы
<span class="bi bi-chevron-down align-middle ms-1"></span>
</button>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item d-flex py-2" href="/courses"><div class="fw-bold me-auto">Все что есть</div>
<div class="text-muted">117</div>
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные категории</b>
</li>
<li>
<a class="dropdown-item py-2" href="/courses_devops">Курсы по DevOps
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_data_analytics">Курсы по аналитике данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_programming">Курсы по программированию
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_testing">Курсы по тестированию
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные курсы</b>
</li>
<li>
<a class="dropdown-item py-2" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/go">Go-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/java">Java-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/python">Python-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/qa-auto-engineer-java">Автоматизатор тестирования на Java
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/data-analytics">Аналитик данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/frontend">Фронтенд-разработчик
</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
О Хекслете
<span class="bi bi-chevron-down align-middle"></span>
</button>
<ul class="dropdown-menu bg-body">
<li>
<a class="dropdown-item py-2" href="/pages/about">О нас
</a></li>
<li>
<a class="dropdown-item py-2" href="/blog">Блог
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/hse-research" role="button">Результаты (Исследование)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://career.hexlet.io" role="button">Хекслет Карьера
</span></li>
<li>
<a class="dropdown-item py-2" href="/testimonials">Отзывы студентов
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://t.me/hexlet_help_bot" role="button">Поддержка (В ТГ)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/referal-program/?promo_creative=priglasite-druzei&promo_name=referal-program&promo_position=promo_position&promo_start=010724&promo_type=link" role="button">Реферальная программа
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/certificate" role="button">Подарочные сертификаты
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://hh.ru/employer/4307094" role="button">Вакансии
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://b2b.hexlet.io" data-target="_blank" role="button">Компаниям
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexly.ru/" data-target="_blank" role="button">Колледж
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexlyschool.ru/" data-target="_blank" role="button">Частная школа
</span></li>
</ul>
</li>
<li><a class="nav-link" href="/subscription/new">Подписка</a></li>
</ul>
<ul class="navbar-nav flex-lg-row align-items-lg-center gap-2 ms-auto">
<li>
<a class="nav-link" aria-label="Переключить тему" href="/theme/switch?new_theme=dark"><span aria-hidden="true" class="bi bi-moon"></span>
</a></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="/u/new" role="button"><span>Регистрация</span>
</span></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="https://ru.hexlet.io/session/new" role="button"><span>Вход</span>
</span></li>
</ul>
</div>
</div>
</nav>
</header>
<div class="x-container-xxxl">
</div>
<main class="mb-6 min-vh-100 h-100">
<link rel="preload" as="image" href="/vite/assets/blog_post-7eTyeLLt.webp"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAwNywicHVyIjoiYmxvYl9pZCJ9fQ==--f0b38f0e25ed59255acec6eaeaeec0a99aec453f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Binary%20code-rafiki.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxOSwicHVyIjoiYmxvYl9pZCJ9fQ==--84efd2b6854b7000046e9ce06e6be85d38af5ab8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/JavaScript%20frameworks-cuate.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzcyNywicHVyIjoiYmxvYl9pZCJ9fQ==--2d5cbbf5c3b4a73ae4b2c50632305d78f5872e4d/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programmer-rafiki.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDA0MywicHVyIjoiYmxvYl9pZCJ9fQ==--e2c6c0775e2308e42fbc5dc592ba2db0470632ca/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programmer-rafiki.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDA0OSwicHVyIjoiYmxvYl9pZCJ9fQ==--a6531362dd1f3afb65f5b269e1a23113df7171b1/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Devices-amico.png"/><link rel="preload" as="image" href="/vite/assets/development-BVihs_d5.png"/><div id="app" data-page="{"component":"web/blog/posts/show","props":{"errors":{},"locale":"ru","language":"ru","httpsHost":"https://ru.hexlet.io","host":"ru.hexlet.io","colorScheme":"light","auth":{"user":{"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26T19:58:32.718Z","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false}},"cloudflareTurnstileSiteKey":"0x4AAAAAAA15KmeFXzd2H0Xo","vkIdClientId":"51586979","yandexIdClientId":"88d071f1d3384eb4bd1deb37910235c7","formAuthToken":"6_puP5xTxj21pekgndplNSeoH3ya1Zy5MqpwQ0dzI9wEK6UIbi1rXQPmzbiR1ZVC56Ey1pLiYhuPSuoXFXTEsg","post":{"model_name":"BlogPost","category":{"id":6,"name":"Мотивация","slug":"motivation","state":"published","created_at":"2016-10-06T18:31:38.903Z"},"creator":{"public_name":"Lada Golunova","id":332961,"is_tutor":false},"tags":[{"id":1119,"slug":"bez-steka","name":"Без стека"}],"id":1706,"title":"Теория демо-версий: Как дедлайны делают разработчиков несчастными","slug":"teoriya-demo-versiy-kak-dedlayny-delayut-razrabotchikov-neschastnymi","state":"published","summary":"Дедлайны могут подорвать работу даже самой сильной команды разработчиков. У работе по дедлайнам существует несколько альтернатив, одна из них — теория про демо-версии. Подробно рассказываем, что это такое и как внедрить эту практику в разработку.","votes_count":6,"created_at":"2022-02-03T01:39:51.799Z","published_at":"2022-02-07T12:50:39.238Z","body":"**Дедлайны могут подорвать работу даже самой сильной команды разработчиков. В работе по дедлайнам существует несколько альтернатив, одна из них — теория про демо-версии. Подробно рассказываем, что это такое и как внедрить эту практику в вашу разработку.**\n\n_Это адаптированный перевод статьи [Demos Over Deadlines](https://medium.com/javascript-scene/demos-over-deadlines-8ed8dcdecb6), повествование ведется от лица автора — [Эрика Эллиотта](https://ericelliottjs.com/). Он сооснователь онлайн-школы программирования и опытный разработчик, который пишет на JavaScript. При этом он еще написал несколько книг и работал с BBC, Adobe, Wall Street Journal._\n\n::programs\n\nЗа свою карьеру я видел всякие команды — эффективные, и не очень. По моим наблюдениям, только один фактор позволяет предсказать успех команды разработчиков — как она работает под внешним давлением. Если на разработчика слишком сильно давить — он начнет страдать от выгорания, и даже может уволиться.\n\nКак опытный руководитель, я стараюсь держать баланс между двумя конфликтующими целями. Первая цель — как можно быстрее выпустить продукт. Вторая цель — не перенапрягать команду сроками. Чтобы добиться обеих целей, я обычно расставляю команде приоритеты, после чего отхожу в сторону и просто не мешаю людям делать свою работу.\n\nНо это еще не все. Когда команда добавляет новую фичу, она обязана показать ее демо-версию. Привязки к срокам нет: если показывать нечего, разработчики ничего и не показывают. Получается, что мы фокусируемся не на сроках, а на том, чтобы добавить фичу и показать ее. Если бы мы фокусировались на сроках — а они, признаем честно, обычно совершенно нереалистичные — то все страдали бы от лишнего стресса. Но когда перед командой стоит задача показать демо, разработчики ощущают не стресс, а азарт.\n\nПо крайней мере так показывает мой опыт работы. Я вижу, что с фокусом на демо-версиях фичи команда чаще испытывает гордость за проделанную работу, а еще радуется тому, что ее труд замечают и ценят. Еще бы — ведь у нас в компании остальные сотрудники аплодируют ребятам каждый раз, когда те показывают новую фичу.\n\nНо чтобы по-настоящему оценить пользу такого подхода, нам нужно глубже взглянуть на явление дедлайнов и их ключевую проблему: **невозможно точно оценить сроки работы над программным обеспечением.**\n\n## Содержание\n\n## Сроки врут\n\nЧаще всего сроки и дедлайны врут. В 2012 году CNN проанализировал топ-50 проектов на Kickstarter и обнаружил, что [85% из них запустились позже назначенного срока](https://money.cnn.com/2012/12/18/technology/innovation/kickstarter-ship-delay/index.html). Другое исследование под названием «Почему сроки срываются? Эмпирическое исследование причин задержки запуска программных продуктов» было опубликовано научным журналом [IEEE](https://en.wikipedia.org/wiki/IEEE_Transactions_on_Software_Engineering). В нем [исследователи обнаружили](https://www.proquest.com/openview/6035cbc6ccae06dc0f692504eaf1226d/1?pq-origsite=gscholar&cbl=21418), что в среднем реальные сроки сдачи проекта отличаются от прогнозируемых на 36% (данные на основании изучения дедлайнов в 72 проектах).\n\n## Сложности в оценке сроков\n\nПрежде, чем мы мы начнем, попробуйте ответить на вопрос — сколько пчел в обычном улье? Ответьте пожалуйста без использования гугла, и запишите свой ответ на бумажке.\n\n## Почему мы так часто ошибаемся с оценкой сроков. И иногда очень сильно\n\n- [**Фичеризм**](https://habr.com/ru/company/otus/blog/565688/), также известный как [синдром кухонной раковины](https://idioms.thefreedictionary.com/everything+but+the+kitchen+sink) — когда в проект решают добавить незапланированные на старте продукты.\n- **Terra Incognita**. Разработка программного обеспечения — всегда путешествие в неизвестное. Мы делаем то, что никто до нас не делал, и узнаем о новых API, новых протоколах, создаем новые компоненты с нуля, а иногда мимоходом решаем проблемы, которые никто до нас не решал. Процесс разработки — это кроличья нора, но почему-то это не мешает нам чересчур оптимистично оценивать сроки проекта.\n- **Не учитываем все задачи**. Отладка, интеграция, написание тестов, написание новых тестов, сборка и пересборка. Все эти задачи требуют кучи времени, но мы не учитываем это при постановке дедлайна.\n- **Библиотеки**. Когда возникает проблема с подключенной библиотекой (а она обязательно возникает), и тогда у команды остается два варианта — связаться с авторами библиотеки или с нуля разрабатывать альтернативу. То и другое занимает кучу времени.\n- **Жизнь**. В жизни всякое бывает: больничные, отпуска, свадьбы, дети. Такое не запланируешь.\n\nПоэтому я говорю, что оценка сроков — это беззастенчивая ложь. Ведь мы пытаемся оценить новый программный продукт, то есть что-то совершенно новое, таящее в себе море нюансов и подводных камней.\n\nЧтобы что-то оценить, нам нужны данные о том, какие задачи требуется выполнить и сколько времени занимает каждая из них в отдельности. Но если мы создаем что-то новое, то у нас таких данных нет.\n\nИногда работа ускоряется: например, когда мы выпускаем новую версию уже знакомого продукта. Но бывает и наоборот, проект задерживается — например из-за того, что мы вводим в проект нового разработчика и надо дать ему время на адаптацию.\n\nПеременных слишком много. Даже если каждый сотрудник будет сам высчитывать свое среднее время работы над каждой задачей, нам это не поможет.\n\n## Так и зачем тогда это все?\n\nСилы, которые заставляют нас ставить дедлайны, кажутся непреодолимыми. Клиент хочет знать, во сколько ему обойдется проект. Инвестор в свою очередь должен убедиться, что его деньги не пустят на ветер. И вам тоже очень важно угодить инвестору, иначе работать будет не на что. И вот, вам нужно что-то показать к началу следующего года. Но это реальный дедлайн или плод нашего воображения? Давайте рассмотрим конкретный пример.\n\n## Клиент подписал с вами контракт\n\nКлиент хочет заказать клон TikTok и спрашивает, сколько времени займет работа. Честный ответ тут один: \n\n\n> «Чтобы точно сказать, сколько времени займет работа, нам нужно узнать полный список функций, которые должны быть в приложении. И мы не узнаем точный список, пока не погрузимся в проект».\n\nВместо того, чтобы соблазнять клиента нереалистичными сроками, покажите ему свое портфолио. Дайте почитать отзывы прошлых клиентов. А потом предложите такую сделку: за определенную сумму вы выделяете определенное количество ресурсов на работу над его проектом.\n\nТо есть не надо просить деньги за готовый продукт. Намного эффективнее просить оплату за время работы над проектом. А уже потом тщательно контролировать объем работы, чтобы не выйти за рамки бюджета. Для этого регулярно проводите встречи и обсуждайте приоритеты в работе над проектом. Показывайте демо-версию каждый раз, когда у приложения появилась новая функция.\n\nЯ люблю этот подход за то, что риск провала уменьшается для обеих сторон. Допустим, вы поработали месяц и понимаете, что недооценили сложность проекта — тогда обсудите это с клиентом. Определите, какие функции приложения действительно решают бизнес-задачи, а какие — нет. Откажитесь от всего лишнего.\n\n## Отчеты перед инвестором\n\nОдна из самых больших проблем в разработке программного обеспечения состоит в том, что люди делят шкуру неубитого медведя. В мире стартапов это нормально — просить деньги за несуществующий продукт. Чтобы убедить инвестора дать денег, стартап обещает использовать систему [майлстоунов](https://ru.wikipedia.org/wiki/%D0%92%D0%B5%D1%85%D0%B0_(%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0%D0%BC%D0%B8)): компания достигает цели за n месяцев, а инвестор дает новый мешок денег. Потом новая цель и новый мешок.\n\nЯ бы советовал отказаться от датированных майлстоунов. Амбициозные цели — это хорошо, но не привязывайте их выполнение к конкретным срокам. Никто из нас не умеет предсказывать будущее, наши ресурсы и приоритеты часто меняются. Когда вы планируете майлстоуны без конкретных дат, вы оставляете себе возможность проявлять гибкость, а гибкость — это хорошо и для разработчиков, и для бизнеса.\n\nХотя бы потому что весь проект не отменяют только потому, что вы неправильно оценили сроки. В стратегии, которую я предлагаю, от разработчиков требуется только хорошо работать и показывать результаты своей работы. Конечно, всегда есть риски: например, вы плохо расставили приоритеты и потратили все деньги. Однако в этом случае гнев инвестора хотя бы оправдан.\n\nНо бывают и такие инвесторы, которые настаивают на том, чтобы у проекта были фиксированные сроки. Я бы советовал просто избегать таких партнеров. Я придумал универсальную формулировку на тот случай, если инвестор спросит, почему вы не хотите ставить дедлайны:\n\n\n> «Мы предпочитаем показывать демо-версии продукта вместо того, чтобы строить работу вокруг дедлайнов. Так мы поступили с продуктом A и B, а недавно вот выпустили приложение C. Давайте я его вам покажу».\n\nПокажите демо-версию продукта и похвастайтесь тем, какую классную фичу вы добавили, вместо того, чтобы жаловаться, как вас достали нереалистичные сроки. Если вы избегаете _фичеризма_, то вероятно, что новые демо будут появляться каждые несколько недель. А это значит, что при каждой встрече с инвестором вы сможете показывать ему что-нибудь новенькое.\n\n## Фиксированные сроки сдачи проекта\n\nКомпании часто анонсируют новые продукты задолго до их выпуска. Я придумал легкое, но не универсальное решение: просто не надо так делать. Не надо анонсировать продукты до того, как они будут готовы к запуску. Тогда у вас не будет аврала перед сдачей, и не придется срезать углы. Вообще, как правило, разработчики срезают углы только ради того, чтобы достичь воображаемого дедлайна. Но вред, который наносит такой подход, совсем не воображаемый, а вполне реальный.\n\nКомпании используют ранние анонсы для того, чтобы клиенты дождались их продукта, вместо того, чтобы купить аналог у конкурента уже сейчас. \n\nРанний анонс — очень опасная игра. В нее можно играть, только если\n\n- У вас есть надежные партнеры, которые всегда и точно в срок выполняют свои обязательства\n- У вас есть хорошо отлаженный процесс производства и большой опыт в сфере, что на самом деле редкость, ведь программист редко создает что-то, что было уже создано до него\n- Продукт полностью или почти полностью готов, поэтому вы отдадите клиенту то, что обещали\n- У вас есть некоторая гибкость, а потому вы можете отказаться от нескольких фич, чтобы успеть к дедлайну. Даже если его перенесут на конец следующего месяца\n\nЕсли вы не успеете запустить продукт к анонсированной дате, то у PR-отдела будут крупные неприятности, и это не говоря уже о финансовых расходах. Так что в итоге да, компании с надежными партнерами и эффективным процессом производства могут позволить себе ранние анонсы. Но большинство IT-компаний не могут этим похвастаться и должны их избегать. Если вы устанавливаете дедлайн, убедитесь, что сможете поменять приоритеты на случай спешки. Занимайтесь задачами с низким приоритетом уже после запуска продукта.\n\n## Закон Брукса\n\n\n> «Добавление рабочей силы на поздних стадиях разработки продукта обычно затягивает его выпуск».\n\nВозможно, вы слышали об этом законе раньше. Если углубиться в этот вопрос, мы узнаем еще кое-что:\n\n1. **Новым разработчикам нужно время на то, чтобы включиться в проект.** Это как минимум 2-3 месяца перед тем, как программист сможет стать полноценным членом команды. И помните о том, что все остальные разработчики будут работать над самим проектом меньше, ведь они будут отвлекаться на обучение новичка.\n2. **Новички делают много ошибок.** А эти ошибки еще кому-то переделывать, что тоже занимает время.\n3. **С ростом количества сотрудников растут и затраты на коммуникацию**. Чем больше разработчиков — тем больше каналов коммуникации: чатов, тредов, созвонов. А чем больше каналов, тем ниже прозрачность проекта и тем он становится сложнее. Да и в общем координировать работу большой команды довольно сложно.\n4. **Написание кода — это не самая сложная часть разработки.** Самое сложное — декомпозировать процесс создания продукта на маленькие задачки. Если команда слишком большая, задач на всех будет просто не хватать, разработчики начнут делить одну и ту же задачу и мешаться друг другу.\n\nНадо также помнить, что заключительные этапы проекта сжирают больше всего времени. Вот на этом графике из реального проекта заметно, какой прогресс мы делали в первые месяцы, и как замедлились в последующие:\n\n\n\n## Решение для проблемы оценки сроков\n\nПомните, я просил вас примерно прикинуть количество пчел в улье? Я понимаю, что вы не располагаете фактами, чтобы сделать точную оценку. Да и что именно мы пытаемся посчитать?\n\n- Мы считаем число пчел, которые участвуют в жизни колонии на протяжении всего времени существования конкретной колонии?\n- Мы считаем количество пчел, которые живут в улье за год?\n- Мы считаем среднее количество пчел, которые находятся в улье прямо сейчас?\n- Меняется ли количество пчел в зависимости от географического положения улья и времени года?\n\nВ вашем ответе был численный диапазон или конкретное число? Забавно, что разработчики называют конкретные числа при оценках, предпочитая конкретику точности, однако когда их просишь назвать сроки, их ответы очень размытые. Никто не согласится сделать фичу за один день или за две недели.\n\n## Натыкаясь на подводные камни\n\nБольшинство разработчиков смогут назвать какие-то сроки, если надавить на них. Однако все понимают, что эти сроки взяты с потолка. Кто знает, сколько времени займет один тикет? А сколько тикетов надо, чтобы закончить проект? А кто-то знает вообще реальный список всех задач, которые надо выполнить для запуска проекта?\n\nПравда в том, что процесс оценки сложности — это часть разработки программного обеспечения. То есть вы сможете точно оценить сложность, только с головой нырнув в разработку. Делайте оценку постепенно, в процессе разработки проекта, но не перед его началом.\n\nВ своей книге [«Построение приложений»](https://leanpub.com/composingsoftware) я пишу о том, что всё в программировании так или иначе связано с построением систем. Мы берем задачу и делим ее на части, как правило на независимые и удобные для работы — и это тоже является построением системы.\n\nРеализовать части системы и собрать их вместе — это не самое сложное. Самое сложное — это создать интерфейс, который будет обеспечивать хорошую связь этих частей внутри системы. Как это сделать? Надо продумать, на какие именно части разделить систему.\n\nЭто нешуточный объем работы, и его необходимо сделать в самом начале разработки. Только после этого мы можем оценить сложность проекта, и в конечном итоге обозначить какие-то сроки.\n\nДаже если вы измерили среднюю скорость работы над задачей, нельзя предполагать, что вы будете выполнять новые задачи с одинаковой скоростью. За любой задачей может скрываться несколько подзадач, что автоматически делает наши расчеты неверными.\n\nПосмотрите на график ниже, он показывает количество открытых issues в конкретный момент времени. Если бы скорость работы было так просто рассчитать, то число задач просто бы снижалось со временем. Но нет, график ниже напоминает график цен на акции: он ломаный, непредсказуемый.\n\n\n\nВ самом начале число issues большое, потом это число стабилизируется в определенном диапазоне. Он может меняться, если меняется сложность задачи или количество разработчиков в команде. Примерно с середины проекта количество задач непредсказуемо колеблется и только в самом конце существенно снижается.\n\nКстати, в обычном улье от 10 тыс. до 80 тыс. пчел.\n\n- Если вы назвали число, которое меньше 10 тыс. — вы проиграли. Будем считать, что вы сорвали сроки. Game over\n- Если вы назвали число больше 80 тыс., то управление сроками берет на себя ваш босс. Он считает, что вы себя недооцениваете, а потому объявляет анонс продукта на срок вдвое меньший, чем вы бы того хотели. А вы в ответ срываете новый срок сдачи. Вы снова проиграли\n- Если ваш ответ тоже был диапазоном, но наименьшее число меньше 10 тыс. — вы тоже проиграли\n- Если ваш ответ был конкретным числом и вы попали в диапазон, то сделайте следующее, чтобы вычислить свои баллы. Вычислите разницу между вашим числом и 45 тыс., а потом умножьте результат на -1. Вот ваши баллы, поздравляю! Вы как бы не проиграли, но и выигрышем это назвать сложно.\n- Если вы назвали точное количество пчел в улье, используя диапазон, поздравляю с победой.\n\n**Ну и какое же решение я предлагаю для проблемы оценки сроков? Просто не оценивайте точно сроки.**\n\n::posts\n\nВот ключевые шаги для отказа от дедлайнов:\n\n- Выпускайте демо-версии продукта\n- Избегайте фичеризма\n- Расставляйте приоритеты\n\nЕсли вам надо поставить дедлайн, или у вас ограниченный бюджет, то не пытайтесь добавить все фичи. Вместо этого стройте приложение из независимых компонентов, чтобы ничего не сломалось, если вдруг вы откажетесь от реализации каких-то функций. Это очень важно — построить приложение так, чтобы можно было безболезненно сократить круг задач. Чтобы этого добиться, требуется очень хороший уровень коммуникации как внутри продуктовой команды, так и со [стейкхолдерами](https://habr.com/ru/post/127630/).\n\nЯ призываю вас использовать демо-версии вместо дедлайнов, потому что от этого ваша команда будет счастливее и продуктивнее. Ирония в том, что отказавшись от дедлайна, вы больше никогда не будете срывать сроки.\n","reading_time":9,"url":"https://ru.hexlet.io/blog/posts/teoriya-demo-versiy-kak-dedlayny-delayut-razrabotchikov-neschastnymi","cover_thumb_variant":null,"cover_list_variant":"/vite/assets/blog_post-7eTyeLLt.webp","cover_main_variant":"/vite/assets/blog_post-7eTyeLLt.webp","related_stacks_count":5},"relatedPosts":[{"model_name":"BlogPost","id":1116,"title":"Лайв-кодинг, совместное решение задач, поддержка друг друга: как устроено групповое обучение программированию на Хекслете","slug":"group-training","summary":"На Хекслете существует несколько форматов обучения, один из них — «Групповой», в котором студенты учатся программированию не в одиночку, а с другими начинающими разработчиками под руководством опытного наставника. Подробно рассказываем, как устроено групповое обучение на Хекслете и что оно дает.","created_at":"2020-11-19T08:52:11.759Z","published_at":"2023-03-09T11:00:49.359Z","cover_list_variant":"/vite/assets/blog_post-7eTyeLLt.webp"},{"model_name":"BlogPost","id":420,"title":"50 лучших фильмов и сериалов о технологиях","slug":"filmoteka-dlya-programmistov-25-filmov-o-programmirovanii-tehnologiyah-i-iskusstvennom-intellekte","summary":"Сделали подборку фильмов о технологиях, программировании, искусственном интеллекте и роботах.","created_at":"2019-07-30T13:04:28.309Z","published_at":"2022-12-30T12:14:16.059Z","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTY5OSwicHVyIjoiYmxvYl9pZCJ9fQ==--ecd38e914c68debadef03c88a60804b37146e5b5/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%D1%8B%20IT-01.png"},{"model_name":"BlogPost","id":694,"title":"8 книг, которые помогут вам в жизни и в работе: советует комьюнити-менеджер Хекслета Наталья Мусина","slug":"marketolog-heksleta-natalya-musina-8-knig-kotorye-pomogut-vam-v-zhizni-i-v-rabote","summary":"Комьюнити-менеджер Хекслета Наталья Мусина делится подборкой своих любимых книг, которые помогают расширять кругозор.","created_at":"2020-02-12T14:19:01.136Z","published_at":"2022-12-29T12:48:31.067Z","cover_list_variant":"/vite/assets/blog_post-7eTyeLLt.webp"}],"category":{"id":6,"name":"Мотивация","slug":"motivation","state":"published","created_at":"2016-10-06T18:31:38.903Z"},"mainStackCategory":{"id":12,"name":"Курсы по JavaScript","slug":"javascript","short_name":"JavaScript","order":71,"state":"published","category_slug":"courses_javascript"},"categories":[{"id":6,"name":"Мотивация","slug":"motivation","state":"published","created_at":"2016-10-06T18:31:38.903Z"},{"id":3,"name":"Истории успеха","slug":"success","state":"published","created_at":"2016-07-30T12:57:18.308Z"},{"id":14,"name":"Дневник студента","slug":"student-diary","state":"published","created_at":"2019-02-25T13:27:09.471Z"},{"id":4,"name":"Код","slug":"code","state":"published","created_at":"2016-08-23T13:33:44.258Z"},{"id":12,"name":"Карьера","slug":"career","state":"published","created_at":"2017-07-21T15:42:21.481Z"}],"relatedLandings":[{"stack":{"id":71,"slug":"js-domain-driven-design","title":"DDD на Javascript","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":4700,"duration_in_months":2},"id":127,"slug":"js-domain-driven-design","title":"DDD на Javascript","subtitle":"Навык ООП и предметно-ориентированного программирования для создания масштабируемого кода и карьерного роста","subtitle_for_lists":"Изучите ООП и DDD для создания масштабируемого кода","locale":"ru","current":true,"duration_in_months_text":"2 месяца","stack_slug":"js-domain-driven-design","price_text":"от 3 900 ₽","duration_text":"2 месяца","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAwNywicHVyIjoiYmxvYl9pZCJ9fQ==--f0b38f0e25ed59255acec6eaeaeec0a99aec453f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Binary%20code-rafiki.png"},{"stack":{"id":29,"slug":"js-oop","title":"ООП на Javascript","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":4250,"duration_in_months":2},"id":46,"slug":"js-oop","title":"ООП на Javascript","subtitle":"Навык глубокого понимания архитектуры и написания чистого кода, позволяющий решать сложные задачи","subtitle_for_lists":"Изучите архитектуру и принципы чистого кода на JS","locale":"ru","current":true,"duration_in_months_text":"2 месяца","stack_slug":"js-oop","price_text":"от 3 900 ₽","duration_text":"2 месяца","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxOSwicHVyIjoiYmxvYl9pZCJ9fQ==--84efd2b6854b7000046e9ce06e6be85d38af5ab8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/JavaScript%20frameworks-cuate.png"},{"stack":{"id":12,"slug":"frontend","title":"Фронтенд-разработчик","audience":"for_beginners","start_type":"weekly","pricing_model":"purchase","priority":"high","kind":"profession","state":"published","stack_state":"finished","order":20,"duration_in_months":10},"id":17,"slug":"frontend","title":"Фронтенд-разработчик","subtitle":"Изучите HTML, CSS, JavaScript и React","subtitle_for_lists":"Изучите HTML, CSS, JavaScript и React","locale":"ru","current":true,"duration_in_months_text":"10 месяцев","stack_slug":"frontend","price_text":"от 6 792 ₽","duration_text":"10 месяцев","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzcyNywicHVyIjoiYmxvYl9pZCJ9fQ==--2d5cbbf5c3b4a73ae4b2c50632305d78f5872e4d/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programmer-rafiki.png"},{"stack":{"id":43,"slug":"fullstack-javascript","title":"Fullstack-разработчик на Node.js","audience":"for_beginners","start_type":"weekly","pricing_model":"purchase","priority":"high","kind":"profession","state":"published","stack_state":"finished","order":140,"duration_in_months":12},"id":74,"slug":"fullstack-javascript","title":"Fullstack-разработчик на Node.js","subtitle":"Освоите JavaScript, Node.js, Fastify и React для фронтенда и бэкенда.","subtitle_for_lists":"Освоите JavaScript, Node.js, Fastify и React для фронтенда и бэкенда.","locale":"ru","current":true,"duration_in_months_text":"12 месяцев","stack_slug":"fullstack-javascript","price_text":"от 7 934 ₽","duration_text":"12 месяцев","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDA0MywicHVyIjoiYmxvYl9pZCJ9fQ==--e2c6c0775e2308e42fbc5dc592ba2db0470632ca/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programmer-rafiki.png"},{"stack":{"id":23,"slug":"js-react-development","title":"React","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":350,"duration_in_months":2},"id":34,"slug":"js-react-developer","title":"React","subtitle":"Навык разрабатывать быстрые и удобные интерфейсы, открывающий доступ к интересным вакансиям в крупных компаниях","subtitle_for_lists":"Освоите React и создание быстрых интерфейсов","locale":"ru","current":true,"duration_in_months_text":"2 месяца","stack_slug":"js-react-development","price_text":"от 3 900 ₽","duration_text":"2 месяца","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDA0OSwicHVyIjoiYmxvYl9pZCJ9fQ==--a6531362dd1f3afb65f5b269e1a23113df7171b1/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Devices-amico.png"}]},"url":"/blog/posts/teoriya-demo-versiy-kak-dedlayny-delayut-razrabotchikov-neschastnymi","version":"8f286f6358a90a7bef2263b3a6edf5a90a94fa42","encryptHistory":false,"clearHistory":false}"><style data-mantine-styles="true">:root, :host{--mantine-font-family: Arial, sans-serif;--mantine-font-family-headings: Arial, sans-serif;--mantine-heading-font-weight: normal;--mantine-radius-default: 0rem;--mantine-primary-color-filled: var(--mantine-color-indigo-filled);--mantine-primary-color-filled-hover: var(--mantine-color-indigo-filled-hover);--mantine-primary-color-light: var(--mantine-color-indigo-light);--mantine-primary-color-light-hover: var(--mantine-color-indigo-light-hover);--mantine-primary-color-light-color: var(--mantine-color-indigo-light-color);--mantine-spacing-xxl: calc(4rem * var(--mantine-scale));--mantine-font-size-xs: 12px;--mantine-font-size-sm: 14px;--mantine-font-size-md: 16px;--mantine-font-size-lg: clamp(16.0000px, calc(15.2727px + 0.2273vw), 18.0000px);--mantine-font-size-xl: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-display-3: clamp(32.0000px, calc(26.1818px + 1.8182vw), 48.0000px);--mantine-font-size-display-2: clamp(36.0000px, calc(25.8182px + 3.1818vw), 64.0000px);--mantine-font-size-display-1: clamp(40.0000px, calc(25.4545px + 4.5455vw), 80.0000px);--mantine-font-size-h1: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-font-size-h2: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-font-size-h3: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-font-size-h4: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-font-size-h5: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-h6: 1rem;--mantine-primary-color-0: var(--mantine-color-indigo-0);--mantine-primary-color-1: var(--mantine-color-indigo-1);--mantine-primary-color-2: var(--mantine-color-indigo-2);--mantine-primary-color-3: var(--mantine-color-indigo-3);--mantine-primary-color-4: var(--mantine-color-indigo-4);--mantine-primary-color-5: var(--mantine-color-indigo-5);--mantine-primary-color-6: var(--mantine-color-indigo-6);--mantine-primary-color-7: var(--mantine-color-indigo-7);--mantine-primary-color-8: var(--mantine-color-indigo-8);--mantine-primary-color-9: var(--mantine-color-indigo-9);--mantine-color-red-0: #ffeaea;--mantine-color-red-1: #fed4d4;--mantine-color-red-2: #f4a7a8;--mantine-color-red-3: #ec7878;--mantine-color-red-4: #e55050;--mantine-color-red-5: #e03131;--mantine-color-red-6: #e02829;--mantine-color-red-7: #c71a1c;--mantine-color-red-8: #b21218;--mantine-color-red-9: #9c0411;--mantine-color-violet-0: #fce9ff;--mantine-color-violet-1: #f1cfff;--mantine-color-violet-2: #e09bff;--mantine-color-violet-3: #d16fff;--mantine-color-violet-4: #be37fe;--mantine-color-violet-5: #b51afe;--mantine-color-violet-6: #b009ff;--mantine-color-violet-7: #9b00e4;--mantine-color-violet-8: #8a00cc;--mantine-color-violet-9: #7800b3;--mantine-color-indigo-0: #edecff;--mantine-color-indigo-1: #d6d5fe;--mantine-color-indigo-2: #aaa9f4;--mantine-color-indigo-3: #7b79eb;--mantine-color-indigo-4: #5451e4;--mantine-color-indigo-5: #3b37e0;--mantine-color-indigo-6: #2d2adf;--mantine-color-indigo-7: #1f1ec7;--mantine-color-indigo-8: #1819b2;--mantine-color-indigo-9: #0c149e;--mantine-color-cyan-0: #dffdff;--mantine-color-cyan-1: #caf5ff;--mantine-color-cyan-2: #99e8ff;--mantine-color-cyan-3: #64daff;--mantine-color-cyan-4: #3ccffe;--mantine-color-cyan-5: #24c8fe;--mantine-color-cyan-6: #00c2ff;--mantine-color-cyan-7: #00ade4;--mantine-color-cyan-8: #009acd;--mantine-color-cyan-9: #0085b5;--mantine-color-green-0: #e9fdec;--mantine-color-green-1: #d7f6dc;--mantine-color-green-2: #b0eab9;--mantine-color-green-3: #86df94;--mantine-color-green-4: #62d574;--mantine-color-green-5: #4ccf5f;--mantine-color-green-6: #3fcc54;--mantine-color-green-7: #2fb344;--mantine-color-green-8: #25a03b;--mantine-color-green-9: #138a2e;--mantine-color-yellow-0: #fff7e2;--mantine-color-yellow-1: #ffeecd;--mantine-color-yellow-2: #ffdc9c;--mantine-color-yellow-3: #ffc966;--mantine-color-yellow-4: #feb93a;--mantine-color-yellow-5: #feae1e;--mantine-color-yellow-6: #ffa90f;--mantine-color-yellow-8: #ca8200;--mantine-color-yellow-9: #af7000;--mantine-h1-font-size: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-h1-font-weight: normal;--mantine-h2-font-size: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-h2-font-weight: normal;--mantine-h3-font-size: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-h3-font-weight: normal;--mantine-h4-font-size: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-h4-font-weight: normal;--mantine-h5-font-size: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-h5-font-weight: normal;--mantine-h6-font-size: 1rem;--mantine-h6-font-weight: normal;}
:root[data-mantine-color-scheme="dark"], :host([data-mantine-color-scheme="dark"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-dark-filled: var(--mantine-color-dark-5);--mantine-color-dark-filled-hover: var(--mantine-color-dark-6);--mantine-color-dark-light: rgba(105, 105, 105, 0.15);--mantine-color-dark-light-hover: rgba(105, 105, 105, 0.2);--mantine-color-dark-light-color: var(--mantine-color-dark-0);--mantine-color-dark-outline: var(--mantine-color-dark-1);--mantine-color-dark-outline-hover: rgba(184, 184, 184, 0.05);--mantine-color-gray-filled: var(--mantine-color-gray-5);--mantine-color-gray-filled-hover: var(--mantine-color-gray-6);--mantine-color-gray-light: rgba(222, 226, 230, 0.15);--mantine-color-gray-light-hover: rgba(222, 226, 230, 0.2);--mantine-color-gray-light-color: var(--mantine-color-gray-0);--mantine-color-gray-outline: var(--mantine-color-gray-1);--mantine-color-gray-outline-hover: rgba(241, 243, 245, 0.05);--mantine-color-red-filled: var(--mantine-color-red-5);--mantine-color-red-filled-hover: var(--mantine-color-red-6);--mantine-color-red-light: rgba(236, 120, 120, 0.15);--mantine-color-red-light-hover: rgba(236, 120, 120, 0.2);--mantine-color-red-light-color: var(--mantine-color-red-0);--mantine-color-red-outline: var(--mantine-color-red-1);--mantine-color-red-outline-hover: rgba(254, 212, 212, 0.05);--mantine-color-pink-filled: var(--mantine-color-pink-5);--mantine-color-pink-filled-hover: var(--mantine-color-pink-6);--mantine-color-pink-light: rgba(250, 162, 193, 0.15);--mantine-color-pink-light-hover: rgba(250, 162, 193, 0.2);--mantine-color-pink-light-color: var(--mantine-color-pink-0);--mantine-color-pink-outline: var(--mantine-color-pink-1);--mantine-color-pink-outline-hover: rgba(255, 222, 235, 0.05);--mantine-color-grape-filled: var(--mantine-color-grape-5);--mantine-color-grape-filled-hover: var(--mantine-color-grape-6);--mantine-color-grape-light: rgba(229, 153, 247, 0.15);--mantine-color-grape-light-hover: rgba(229, 153, 247, 0.2);--mantine-color-grape-light-color: var(--mantine-color-grape-0);--mantine-color-grape-outline: var(--mantine-color-grape-1);--mantine-color-grape-outline-hover: rgba(243, 217, 250, 0.05);--mantine-color-violet-filled: var(--mantine-color-violet-5);--mantine-color-violet-filled-hover: var(--mantine-color-violet-6);--mantine-color-violet-light: rgba(209, 111, 255, 0.15);--mantine-color-violet-light-hover: rgba(209, 111, 255, 0.2);--mantine-color-violet-light-color: var(--mantine-color-violet-0);--mantine-color-violet-outline: var(--mantine-color-violet-1);--mantine-color-violet-outline-hover: rgba(241, 207, 255, 0.05);--mantine-color-indigo-filled: var(--mantine-color-indigo-5);--mantine-color-indigo-filled-hover: var(--mantine-color-indigo-6);--mantine-color-indigo-light: rgba(123, 121, 235, 0.15);--mantine-color-indigo-light-hover: rgba(123, 121, 235, 0.2);--mantine-color-indigo-light-color: var(--mantine-color-indigo-0);--mantine-color-indigo-outline: var(--mantine-color-indigo-1);--mantine-color-indigo-outline-hover: rgba(214, 213, 254, 0.05);--mantine-color-blue-filled: var(--mantine-color-blue-5);--mantine-color-blue-filled-hover: var(--mantine-color-blue-6);--mantine-color-blue-light: rgba(116, 192, 252, 0.15);--mantine-color-blue-light-hover: rgba(116, 192, 252, 0.2);--mantine-color-blue-light-color: var(--mantine-color-blue-0);--mantine-color-blue-outline: var(--mantine-color-blue-1);--mantine-color-blue-outline-hover: rgba(208, 235, 255, 0.05);--mantine-color-cyan-filled: var(--mantine-color-cyan-5);--mantine-color-cyan-filled-hover: var(--mantine-color-cyan-6);--mantine-color-cyan-light: rgba(100, 218, 255, 0.15);--mantine-color-cyan-light-hover: rgba(100, 218, 255, 0.2);--mantine-color-cyan-light-color: var(--mantine-color-cyan-0);--mantine-color-cyan-outline: var(--mantine-color-cyan-1);--mantine-color-cyan-outline-hover: rgba(202, 245, 255, 0.05);--mantine-color-teal-filled: var(--mantine-color-teal-5);--mantine-color-teal-filled-hover: var(--mantine-color-teal-6);--mantine-color-teal-light: rgba(99, 230, 190, 0.15);--mantine-color-teal-light-hover: rgba(99, 230, 190, 0.2);--mantine-color-teal-light-color: var(--mantine-color-teal-0);--mantine-color-teal-outline: var(--mantine-color-teal-1);--mantine-color-teal-outline-hover: rgba(195, 250, 232, 0.05);--mantine-color-green-filled: var(--mantine-color-green-5);--mantine-color-green-filled-hover: var(--mantine-color-green-6);--mantine-color-green-light: rgba(134, 223, 148, 0.15);--mantine-color-green-light-hover: rgba(134, 223, 148, 0.2);--mantine-color-green-light-color: var(--mantine-color-green-0);--mantine-color-green-outline: var(--mantine-color-green-1);--mantine-color-green-outline-hover: rgba(215, 246, 220, 0.05);--mantine-color-lime-filled: var(--mantine-color-lime-5);--mantine-color-lime-filled-hover: var(--mantine-color-lime-6);--mantine-color-lime-light: rgba(192, 235, 117, 0.15);--mantine-color-lime-light-hover: rgba(192, 235, 117, 0.2);--mantine-color-lime-light-color: var(--mantine-color-lime-0);--mantine-color-lime-outline: var(--mantine-color-lime-1);--mantine-color-lime-outline-hover: rgba(233, 250, 200, 0.05);--mantine-color-yellow-filled: var(--mantine-color-yellow-5);--mantine-color-yellow-filled-hover: var(--mantine-color-yellow-6);--mantine-color-yellow-light: rgba(255, 201, 102, 0.15);--mantine-color-yellow-light-hover: rgba(255, 201, 102, 0.2);--mantine-color-yellow-light-color: var(--mantine-color-yellow-0);--mantine-color-yellow-outline: var(--mantine-color-yellow-1);--mantine-color-yellow-outline-hover: rgba(255, 238, 205, 0.05);--mantine-color-orange-filled: var(--mantine-color-orange-5);--mantine-color-orange-filled-hover: var(--mantine-color-orange-6);--mantine-color-orange-light: rgba(255, 192, 120, 0.15);--mantine-color-orange-light-hover: rgba(255, 192, 120, 0.2);--mantine-color-orange-light-color: var(--mantine-color-orange-0);--mantine-color-orange-outline: var(--mantine-color-orange-1);--mantine-color-orange-outline-hover: rgba(255, 232, 204, 0.05);--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-9) 0%, var(--mantine-color-cyan-7) 100%);--app-color-surface: #2e2e2e;}
:root[data-mantine-color-scheme="light"], :host([data-mantine-color-scheme="light"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-red-light: rgba(224, 40, 41, 0.1);--mantine-color-red-light-hover: rgba(224, 40, 41, 0.12);--mantine-color-red-outline-hover: rgba(224, 40, 41, 0.05);--mantine-color-violet-light: rgba(176, 9, 255, 0.1);--mantine-color-violet-light-hover: rgba(176, 9, 255, 0.12);--mantine-color-violet-outline-hover: rgba(176, 9, 255, 0.05);--mantine-color-indigo-light: rgba(45, 42, 223, 0.1);--mantine-color-indigo-light-hover: rgba(45, 42, 223, 0.12);--mantine-color-indigo-outline-hover: rgba(45, 42, 223, 0.05);--mantine-color-cyan-light: rgba(0, 194, 255, 0.1);--mantine-color-cyan-light-hover: rgba(0, 194, 255, 0.12);--mantine-color-cyan-outline-hover: rgba(0, 194, 255, 0.05);--mantine-color-green-light: rgba(63, 204, 84, 0.1);--mantine-color-green-light-hover: rgba(63, 204, 84, 0.12);--mantine-color-green-outline-hover: rgba(63, 204, 84, 0.05);--mantine-color-yellow-light: rgba(255, 169, 15, 0.1);--mantine-color-yellow-light-hover: rgba(255, 169, 15, 0.12);--mantine-color-yellow-outline-hover: rgba(255, 169, 15, 0.05);--app-color-surface: #f1f3f5;--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-5) 100%);}</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","author":"Lada Golunova","name":"Теория демо-версий: Как дедлайны делают разработчиков несчастными","datePublished":"2022-02-07T12:50:39.238Z","headline":"Дедлайны могут подорвать работу даже самой сильной команды разработчиков. У работе по дедлайнам существует несколько альтернатив, одна из них — теория про демо-версии. Подробно рассказываем, что это такое и как внедрить эту практику в разработку.","image":"/vite/assets/blog_post-7eTyeLLt.webp","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":6}]}</script><div style="--container-size:var(--container-size-lg);margin-top:var(--mantine-spacing-xl);height:100%" class="m_7485cace mantine-Container-root" data-size="lg" data-strategy="block"><script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"position":1,"@type":"ListItem","item":{"@id":"/blog","name":"Блог Хекслета"}},{"position":2,"@type":"ListItem","item":{"@id":"/blog/categories/motivation","name":"Мотивация"}},{"position":3,"@type":"ListItem","item":{"@id":"/blog/posts/teoriya-demo-versiy-kak-dedlayny-delayut-razrabotchikov-neschastnymi","name":"Теория демо-версий: Как дедлайны делают разработчиков несчастными"}}]}</script><div style="margin-bottom:var(--mantine-spacing-xs)" class="m_8b3717df mantine-Breadcrumbs-root"><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/"><div style="color:inherit" class="m_4451eb3a mantine-Center-root"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-home-link "><path d="M20.085 11.085l-8.085 -8.085l-9 9h2v7a2 2 0 0 0 2 2h4.5"></path><path d="M9 21v-6a2 2 0 0 1 2 -2h2a2 2 0 0 1 1.807 1.143"></path><path d="M20 21a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M20 16a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M15 19a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M21 16l-5 3l5 2"></path></svg></div></a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/blog">Блог Хекслета</a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/blog/categories/motivation">Мотивация</a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><p style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:var(--mantine-color-dimmed)" class="mantine-focus-auto m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root" data-size="sm">Теория демо-версий: Как дедлайны делают разработчиков несчастными</p></div><style data-mantine-styles="inline">.__m__-_R_eub_{margin-bottom:var(--mantine-spacing-xs);}@media(min-width: 36em){.__m__-_R_eub_{margin-bottom:var(--mantine-spacing-xs);}}</style><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root __m__-_R_eub_"><style data-mantine-styles="inline">.__m__-_R_deub_{width:100%;}@media(min-width: 36em){.__m__-_R_deub_{width:70%;}}@media(min-width: 75em){.__m__-_R_deub_{width:75%;}}</style><div class="__m__-_R_deub_"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><h1 style="--title-fw:var(--mantine-h1-font-weight);--title-lh:var(--mantine-h1-line-height);--title-fz:var(--mantine-h1-font-size)" class="m_8a5d1357 mantine-Title-root" data-order="1">Теория демо-версий: Как дедлайны делают разработчиков несчастными</h1></div></div></div><div style="position:absolute;top:calc(18.75rem * var(--mantine-scale))" class=""></div><style data-mantine-styles="inline">.__m__-_R_2iub_{--grid-gutter:var(--mantine-spacing-xl);}</style><div class="m_410352e9 mantine-Grid-root __m__-_R_2iub_"><div class="m_dee7bd2f mantine-Grid-inner"><style data-mantine-styles="inline">.__m__-_R_dmiub_{--col-flex-grow:auto;--col-flex-basis:100%;--col-max-width:100%;}@media(min-width: 48em){.__m__-_R_dmiub_{--col-flex-grow:auto;--col-flex-basis:83.33333333333334%;--col-max-width:83.33333333333334%;}}@media(min-width: 62em){.__m__-_R_dmiub_{--col-flex-grow:auto;--col-flex-basis:66.66666666666667%;--col-max-width:66.66666666666667%;}}</style><div class="m_96bdd299 mantine-Grid-col __m__-_R_dmiub_"><div style="--stack-gap:var(--mantine-spacing-md);--stack-align:stretch;--stack-justify:flex-start;margin-bottom:var(--mantine-spacing-xl)" class="m_6d731127 mantine-Stack-root"><div class=""><div style="--group-gap:var(--mantine-spacing-xs);--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-bottom:var(--mantine-spacing-xl)" class="m_4081bf90 mantine-Group-root"><button style="--badge-height:var(--badge-height-sm);--badge-padding-x:var(--badge-padding-x-sm);--badge-fz:var(--badge-fz-sm);--badge-bg:var(--mantine-color-default);--badge-color:var(--mantine-color-default-color);--badge-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border);cursor:pointer;color:inherit" class="m_347db0ec mantine-Badge-root" data-variant="default" data-size="sm" type="button" aria-label="Без стека"><span class="m_5add502a mantine-Badge-label">Без стека</span></button></div><div style="--group-gap:calc(0.625rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-bottom:var(--mantine-spacing-sm);color:var(--mantine-color-gray-text)" class="m_4081bf90 mantine-Group-root"><div style="--group-gap:calc(0.1875rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-inline-end:var(--mantine-spacing-lg)" class="m_4081bf90 mantine-Group-root">7 февраля 2022 г.</div><div style="--group-gap:calc(0.1875rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-clock "><path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"></path><path d="M12 7v5l3 3"></path></svg></div>9 минут</div><div style="--group-gap:calc(0.1875rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-thumb-up "><path d="M7 11v8a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-7a1 1 0 0 1 1 -1h3a4 4 0 0 0 4 -4v-1a2 2 0 0 1 4 0v5h3a2 2 0 0 1 2 2l-1 5a2 3 0 0 1 -2 2h-7a3 3 0 0 1 -3 -3"></path></svg></div>6</div></div><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img style="--image-radius:var(--mantine-radius-md);--image-object-fit:cover;width:100%;height:100%" class="m_9e117634 mantine-Image-root" src="/vite/assets/blog_post-7eTyeLLt.webp" alt="Теория демо-версий: Как дедлайны делают разработчиков несчастными"/></div></div><div role="link" tabindex="0" style="cursor:pointer"><button style="display:block;width:100%" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Присоединяйтесь к нашему Telegram-сообществу"><div style="background-color:light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-6))" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><div style="--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:auto;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-brand-telegram "><path d="M15 10l-4 4l6 6l4 -16l-18 7l4 2l2 6l3 -4"></path></svg></div>Присоединяйтесь к нашему Telegram-сообществу</div></div></button></div><div style="margin-bottom:var(--mantine-spacing-xl)" class="m_d08caa0 mantine-Typography-root"><p><strong>Дедлайны могут подорвать работу даже самой сильной команды разработчиков. В работе по дедлайнам существует несколько альтернатив, одна из них — теория про демо-версии. Подробно рассказываем, что это такое и как внедрить эту практику в вашу разработку.</strong></p>
<p><em>Это адаптированный перевод статьи <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://medium.com/javascript-scene/demos-over-deadlines-8ed8dcdecb6" rel="noopener noreferrer" target="_blank">Demos Over Deadlines</a>, повествование ведется от лица автора — <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ericelliottjs.com/" rel="noopener noreferrer" target="_blank">Эрика Эллиотта</a>. Он сооснователь онлайн-школы программирования и опытный разработчик, который пишет на JavaScript. При этом он еще написал несколько книг и работал с BBC, Adobe, Wall Street Journal.</em></p>
<style data-mantine-styles="inline">.__m__-_R_5derddmiub_{--carousel-slide-gap:var(--mantine-spacing-xs);--carousel-slide-size:70%;}@media(min-width: 36em){.__m__-_R_5derddmiub_{--carousel-slide-gap:var(--mantine-spacing-xl);--carousel-slide-size:50%;}}</style><div style="--carousel-control-size:calc(2.5rem * var(--mantine-scale));--carousel-controls-offset:var(--mantine-spacing-sm);margin-bottom:var(--mantine-spacing-lg);padding-block:var(--mantine-spacing-sm);background:var(--app-color-surface)" class="m_17884d0f mantine-Carousel-root responsiveClassName" data-orientation="horizontal" data-include-gap-in-size="true"><div class="m_39bc3463 mantine-Carousel-controls" data-orientation="horizontal"><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="previous" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="next" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(-90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button></div><div class="m_a2dae653 mantine-Carousel-viewport" data-type="media"><div class="m_fcd81474 mantine-Carousel-container __m__-_R_5derddmiub_" data-orientation="horizontal"><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/js-domain-driven-design?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">2 месяца</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">DDD на Javascript</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите ООП и DDD для создания масштабируемого кода</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAwNywicHVyIjoiYmxvYl9pZCJ9fQ==--f0b38f0e25ed59255acec6eaeaeec0a99aec453f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Binary%20code-rafiki.png" alt="DDD на Javascript" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/js-oop?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">2 месяца</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">ООП на Javascript</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите архитектуру и принципы чистого кода на JS</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxOSwicHVyIjoiYmxvYl9pZCJ9fQ==--84efd2b6854b7000046e9ce06e6be85d38af5ab8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/JavaScript%20frameworks-cuate.png" alt="ООП на Javascript" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/frontend?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">10 месяцев</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">С нуля</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Фронтенд-разработчик</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите HTML, CSS, JavaScript и React</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzcyNywicHVyIjoiYmxvYl9pZCJ9fQ==--2d5cbbf5c3b4a73ae4b2c50632305d78f5872e4d/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programmer-rafiki.png" alt="Фронтенд-разработчик" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 6 792 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/fullstack-javascript?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">12 месяцев</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">С нуля</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Fullstack-разработчик на Node.js</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Освоите JavaScript, Node.js, Fastify и React для фронтенда и бэкенда.</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDA0MywicHVyIjoiYmxvYl9pZCJ9fQ==--e2c6c0775e2308e42fbc5dc592ba2db0470632ca/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programmer-rafiki.png" alt="Fullstack-разработчик на Node.js" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 7 934 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/js-react-developer?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">2 месяца</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">React</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Освоите React и создание быстрых интерфейсов</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDA0OSwicHVyIjoiYmxvYl9pZCJ9fQ==--a6531362dd1f3afb65f5b269e1a23113df7171b1/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Devices-amico.png" alt="React" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size);margin-bottom:var(--mantine-spacing-md);font-size:var(--mantine-font-size-h3)" class="m_8a5d1357 mantine-Title-root" data-order="2" data-responsive="true">Каталог</h2><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Полный список доступных курсов по разным направлениям</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="/vite/assets/development-BVihs_d5.png" alt="Orientation"/></div></div></div></a></div></div></div></div></div>
<p>За свою карьеру я видел всякие команды — эффективные, и не очень. По моим наблюдениям, только один фактор позволяет предсказать успех команды разработчиков — как она работает под внешним давлением. Если на разработчика слишком сильно давить — он начнет страдать от выгорания, и даже может уволиться.</p>
<p>Как опытный руководитель, я стараюсь держать баланс между двумя конфликтующими целями. Первая цель — как можно быстрее выпустить продукт. Вторая цель — не перенапрягать команду сроками. Чтобы добиться обеих целей, я обычно расставляю команде приоритеты, после чего отхожу в сторону и просто не мешаю людям делать свою работу.</p>
<p>Но это еще не все. Когда команда добавляет новую фичу, она обязана показать ее демо-версию. Привязки к срокам нет: если показывать нечего, разработчики ничего и не показывают. Получается, что мы фокусируемся не на сроках, а на том, чтобы добавить фичу и показать ее. Если бы мы фокусировались на сроках — а они, признаем честно, обычно совершенно нереалистичные — то все страдали бы от лишнего стресса. Но когда перед командой стоит задача показать демо, разработчики ощущают не стресс, а азарт.</p>
<p>По крайней мере так показывает мой опыт работы. Я вижу, что с фокусом на демо-версиях фичи команда чаще испытывает гордость за проделанную работу, а еще радуется тому, что ее труд замечают и ценят. Еще бы — ведь у нас в компании остальные сотрудники аплодируют ребятам каждый раз, когда те показывают новую фичу.</p>
<p>Но чтобы по-настоящему оценить пользу такого подхода, нам нужно глубже взглянуть на явление дедлайнов и их ключевую проблему: <strong>невозможно точно оценить сроки работы над программным обеспечением.</strong></p>
<h2 id="heading-2-1">Содержание</h2>
<ul>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-2">Сроки врут</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-3">Сложности в оценке сроков</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-4">Почему мы так часто ошибаемся с оценкой сроков. И иногда очень сильно</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-5">Так и зачем тогда это все?</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-6">Клиент подписал с вами контракт</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-7">Отчеты перед инвестором</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-8">Фиксированные сроки сдачи проекта</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-9">Закон Брукса</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-10">Решение для проблемы оценки сроков</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-11">Натыкаясь на подводные камни</a></li>
</ul>
<h2 id="heading-2-2">Сроки врут</h2>
<p>Чаще всего сроки и дедлайны врут. В 2012 году CNN проанализировал топ-50 проектов на Kickstarter и обнаружил, что <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://money.cnn.com/2012/12/18/technology/innovation/kickstarter-ship-delay/index.html" rel="noopener noreferrer" target="_blank">85% из них запустились позже назначенного срока</a>. Другое исследование под названием «Почему сроки срываются? Эмпирическое исследование причин задержки запуска программных продуктов» было опубликовано научным журналом <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://en.wikipedia.org/wiki/IEEE_Transactions_on_Software_Engineering" rel="noopener noreferrer" target="_blank">IEEE</a>. В нем <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://www.proquest.com/openview/6035cbc6ccae06dc0f692504eaf1226d/1?pq-origsite=gscholar&cbl=21418" rel="noopener noreferrer" target="_blank">исследователи обнаружили</a>, что в среднем реальные сроки сдачи проекта отличаются от прогнозируемых на 36% (данные на основании изучения дедлайнов в 72 проектах).</p>
<h2 id="heading-2-3">Сложности в оценке сроков</h2>
<p>Прежде, чем мы мы начнем, попробуйте ответить на вопрос — сколько пчел в обычном улье? Ответьте пожалуйста без использования гугла, и запишите свой ответ на бумажке.</p>
<h2 id="heading-2-4">Почему мы так часто ошибаемся с оценкой сроков. И иногда очень сильно</h2>
<ul>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://habr.com/ru/company/otus/blog/565688/" rel="noopener noreferrer" target="_blank"><strong>Фичеризм</strong></a>, также известный как <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://idioms.thefreedictionary.com/everything+but+the+kitchen+sink" rel="noopener noreferrer" target="_blank">синдром кухонной раковины</a> — когда в проект решают добавить незапланированные на старте продукты.</li>
<li><strong>Terra Incognita</strong>. Разработка программного обеспечения — всегда путешествие в неизвестное. Мы делаем то, что никто до нас не делал, и узнаем о новых API, новых протоколах, создаем новые компоненты с нуля, а иногда мимоходом решаем проблемы, которые никто до нас не решал. Процесс разработки — это кроличья нора, но почему-то это не мешает нам чересчур оптимистично оценивать сроки проекта.</li>
<li><strong>Не учитываем все задачи</strong>. Отладка, интеграция, написание тестов, написание новых тестов, сборка и пересборка. Все эти задачи требуют кучи времени, но мы не учитываем это при постановке дедлайна.</li>
<li><strong>Библиотеки</strong>. Когда возникает проблема с подключенной библиотекой (а она обязательно возникает), и тогда у команды остается два варианта — связаться с авторами библиотеки или с нуля разрабатывать альтернативу. То и другое занимает кучу времени.</li>
<li><strong>Жизнь</strong>. В жизни всякое бывает: больничные, отпуска, свадьбы, дети. Такое не запланируешь.</li>
</ul>
<p>Поэтому я говорю, что оценка сроков — это беззастенчивая ложь. Ведь мы пытаемся оценить новый программный продукт, то есть что-то совершенно новое, таящее в себе море нюансов и подводных камней.</p>
<p>Чтобы что-то оценить, нам нужны данные о том, какие задачи требуется выполнить и сколько времени занимает каждая из них в отдельности. Но если мы создаем что-то новое, то у нас таких данных нет.</p>
<p>Иногда работа ускоряется: например, когда мы выпускаем новую версию уже знакомого продукта. Но бывает и наоборот, проект задерживается — например из-за того, что мы вводим в проект нового разработчика и надо дать ему время на адаптацию.</p>
<p>Переменных слишком много. Даже если каждый сотрудник будет сам высчитывать свое среднее время работы над каждой задачей, нам это не поможет.</p>
<h2 id="heading-2-5">Так и зачем тогда это все?</h2>
<p>Силы, которые заставляют нас ставить дедлайны, кажутся непреодолимыми. Клиент хочет знать, во сколько ему обойдется проект. Инвестор в свою очередь должен убедиться, что его деньги не пустят на ветер. И вам тоже очень важно угодить инвестору, иначе работать будет не на что. И вот, вам нужно что-то показать к началу следующего года. Но это реальный дедлайн или плод нашего воображения? Давайте рассмотрим конкретный пример.</p>
<h2 id="heading-2-6">Клиент подписал с вами контракт</h2>
<p>Клиент хочет заказать клон TikTok и спрашивает, сколько времени займет работа. Честный ответ тут один:</p>
<blockquote>
<p>«Чтобы точно сказать, сколько времени займет работа, нам нужно узнать полный список функций, которые должны быть в приложении. И мы не узнаем точный список, пока не погрузимся в проект».</p>
</blockquote>
<p>Вместо того, чтобы соблазнять клиента нереалистичными сроками, покажите ему свое портфолио. Дайте почитать отзывы прошлых клиентов. А потом предложите такую сделку: за определенную сумму вы выделяете определенное количество ресурсов на работу над его проектом.</p>
<p>То есть не надо просить деньги за готовый продукт. Намного эффективнее просить оплату за время работы над проектом. А уже потом тщательно контролировать объем работы, чтобы не выйти за рамки бюджета. Для этого регулярно проводите встречи и обсуждайте приоритеты в работе над проектом. Показывайте демо-версию каждый раз, когда у приложения появилась новая функция.</p>
<p>Я люблю этот подход за то, что риск провала уменьшается для обеих сторон. Допустим, вы поработали месяц и понимаете, что недооценили сложность проекта — тогда обсудите это с клиентом. Определите, какие функции приложения действительно решают бизнес-задачи, а какие — нет. Откажитесь от всего лишнего.</p>
<h2 id="heading-2-7">Отчеты перед инвестором</h2>
<p>Одна из самых больших проблем в разработке программного обеспечения состоит в том, что люди делят шкуру неубитого медведя. В мире стартапов это нормально — просить деньги за несуществующий продукт. Чтобы убедить инвестора дать денег, стартап обещает использовать систему <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.wikipedia.org/wiki/%D0%92%D0%B5%D1%85%D0%B0_(%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0%D0%BC%D0%B8)" rel="noopener noreferrer" target="_blank">майлстоунов</a>: компания достигает цели за n месяцев, а инвестор дает новый мешок денег. Потом новая цель и новый мешок.</p>
<p>Я бы советовал отказаться от датированных майлстоунов. Амбициозные цели — это хорошо, но не привязывайте их выполнение к конкретным срокам. Никто из нас не умеет предсказывать будущее, наши ресурсы и приоритеты часто меняются. Когда вы планируете майлстоуны без конкретных дат, вы оставляете себе возможность проявлять гибкость, а гибкость — это хорошо и для разработчиков, и для бизнеса.</p>
<p>Хотя бы потому что весь проект не отменяют только потому, что вы неправильно оценили сроки. В стратегии, которую я предлагаю, от разработчиков требуется только хорошо работать и показывать результаты своей работы. Конечно, всегда есть риски: например, вы плохо расставили приоритеты и потратили все деньги. Однако в этом случае гнев инвестора хотя бы оправдан.</p>
<p>Но бывают и такие инвесторы, которые настаивают на том, чтобы у проекта были фиксированные сроки. Я бы советовал просто избегать таких партнеров. Я придумал универсальную формулировку на тот случай, если инвестор спросит, почему вы не хотите ставить дедлайны:</p>
<blockquote>
<p>«Мы предпочитаем показывать демо-версии продукта вместо того, чтобы строить работу вокруг дедлайнов. Так мы поступили с продуктом A и B, а недавно вот выпустили приложение C. Давайте я его вам покажу».</p>
</blockquote>
<p>Покажите демо-версию продукта и похвастайтесь тем, какую классную фичу вы добавили, вместо того, чтобы жаловаться, как вас достали нереалистичные сроки. Если вы избегаете <em>фичеризма</em>, то вероятно, что новые демо будут появляться каждые несколько недель. А это значит, что при каждой встрече с инвестором вы сможете показывать ему что-нибудь новенькое.</p>
<h2 id="heading-2-8">Фиксированные сроки сдачи проекта</h2>
<p>Компании часто анонсируют новые продукты задолго до их выпуска. Я придумал легкое, но не универсальное решение: просто не надо так делать. Не надо анонсировать продукты до того, как они будут готовы к запуску. Тогда у вас не будет аврала перед сдачей, и не придется срезать углы. Вообще, как правило, разработчики срезают углы только ради того, чтобы достичь воображаемого дедлайна. Но вред, который наносит такой подход, совсем не воображаемый, а вполне реальный.</p>
<p>Компании используют ранние анонсы для того, чтобы клиенты дождались их продукта, вместо того, чтобы купить аналог у конкурента уже сейчас.</p>
<p>Ранний анонс — очень опасная игра. В нее можно играть, только если</p>
<ul>
<li>У вас есть надежные партнеры, которые всегда и точно в срок выполняют свои обязательства</li>
<li>У вас есть хорошо отлаженный процесс производства и большой опыт в сфере, что на самом деле редкость, ведь программист редко создает что-то, что было уже создано до него</li>
<li>Продукт полностью или почти полностью готов, поэтому вы отдадите клиенту то, что обещали</li>
<li>У вас есть некоторая гибкость, а потому вы можете отказаться от нескольких фич, чтобы успеть к дедлайну. Даже если его перенесут на конец следующего месяца</li>
</ul>
<p>Если вы не успеете запустить продукт к анонсированной дате, то у PR-отдела будут крупные неприятности, и это не говоря уже о финансовых расходах. Так что в итоге да, компании с надежными партнерами и эффективным процессом производства могут позволить себе ранние анонсы. Но большинство IT-компаний не могут этим похвастаться и должны их избегать. Если вы устанавливаете дедлайн, убедитесь, что сможете поменять приоритеты на случай спешки. Занимайтесь задачами с низким приоритетом уже после запуска продукта.</p>
<h2 id="heading-2-9">Закон Брукса</h2>
<blockquote>
<p>«Добавление рабочей силы на поздних стадиях разработки продукта обычно затягивает его выпуск».</p>
</blockquote>
<p>Возможно, вы слышали об этом законе раньше. Если углубиться в этот вопрос, мы узнаем еще кое-что:</p>
<ol>
<li><strong>Новым разработчикам нужно время на то, чтобы включиться в проект.</strong> Это как минимум 2-3 месяца перед тем, как программист сможет стать полноценным членом команды. И помните о том, что все остальные разработчики будут работать над самим проектом меньше, ведь они будут отвлекаться на обучение новичка.</li>
<li><strong>Новички делают много ошибок.</strong> А эти ошибки еще кому-то переделывать, что тоже занимает время.</li>
<li><strong>С ростом количества сотрудников растут и затраты на коммуникацию</strong>. Чем больше разработчиков — тем больше каналов коммуникации: чатов, тредов, созвонов. А чем больше каналов, тем ниже прозрачность проекта и тем он становится сложнее. Да и в общем координировать работу большой команды довольно сложно.</li>
<li><strong>Написание кода — это не самая сложная часть разработки.</strong> Самое сложное — декомпозировать процесс создания продукта на маленькие задачки. Если команда слишком большая, задач на всех будет просто не хватать, разработчики начнут делить одну и ту же задачу и мешаться друг другу.</li>
</ol>
<p>Надо также помнить, что заключительные этапы проекта сжирают больше всего времени. Вот на этом графике из реального проекта заметно, какой прогресс мы делали в первые месяцы, и как замедлились в последующие:</p>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://imgur.com/iLOH91p.png" alt="" loading="lazy"/></p>
<h2 id="heading-2-10">Решение для проблемы оценки сроков</h2>
<p>Помните, я просил вас примерно прикинуть количество пчел в улье? Я понимаю, что вы не располагаете фактами, чтобы сделать точную оценку. Да и что именно мы пытаемся посчитать?</p>
<ul>
<li>Мы считаем число пчел, которые участвуют в жизни колонии на протяжении всего времени существования конкретной колонии?</li>
<li>Мы считаем количество пчел, которые живут в улье за год?</li>
<li>Мы считаем среднее количество пчел, которые находятся в улье прямо сейчас?</li>
<li>Меняется ли количество пчел в зависимости от географического положения улья и времени года?</li>
</ul>
<p>В вашем ответе был численный диапазон или конкретное число? Забавно, что разработчики называют конкретные числа при оценках, предпочитая конкретику точности, однако когда их просишь назвать сроки, их ответы очень размытые. Никто не согласится сделать фичу за один день или за две недели.</p>
<h2 id="heading-2-11">Натыкаясь на подводные камни</h2>
<p>Большинство разработчиков смогут назвать какие-то сроки, если надавить на них. Однако все понимают, что эти сроки взяты с потолка. Кто знает, сколько времени займет один тикет? А сколько тикетов надо, чтобы закончить проект? А кто-то знает вообще реальный список всех задач, которые надо выполнить для запуска проекта?</p>
<p>Правда в том, что процесс оценки сложности — это часть разработки программного обеспечения. То есть вы сможете точно оценить сложность, только с головой нырнув в разработку. Делайте оценку постепенно, в процессе разработки проекта, но не перед его началом.</p>
<p>В своей книге <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://leanpub.com/composingsoftware" rel="noopener noreferrer" target="_blank">«Построение приложений»</a> я пишу о том, что всё в программировании так или иначе связано с построением систем. Мы берем задачу и делим ее на части, как правило на независимые и удобные для работы — и это тоже является построением системы.</p>
<p>Реализовать части системы и собрать их вместе — это не самое сложное. Самое сложное — это создать интерфейс, который будет обеспечивать хорошую связь этих частей внутри системы. Как это сделать? Надо продумать, на какие именно части разделить систему.</p>
<p>Это нешуточный объем работы, и его необходимо сделать в самом начале разработки. Только после этого мы можем оценить сложность проекта, и в конечном итоге обозначить какие-то сроки.</p>
<p>Даже если вы измерили среднюю скорость работы над задачей, нельзя предполагать, что вы будете выполнять новые задачи с одинаковой скоростью. За любой задачей может скрываться несколько подзадач, что автоматически делает наши расчеты неверными.</p>
<p>Посмотрите на график ниже, он показывает количество открытых issues в конкретный момент времени. Если бы скорость работы было так просто рассчитать, то число задач просто бы снижалось со временем. Но нет, график ниже напоминает график цен на акции: он ломаный, непредсказуемый.</p>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://imgur.com/PDnN4Kk.png" alt="" loading="lazy"/></p>
<p>В самом начале число issues большое, потом это число стабилизируется в определенном диапазоне. Он может меняться, если меняется сложность задачи или количество разработчиков в команде. Примерно с середины проекта количество задач непредсказуемо колеблется и только в самом конце существенно снижается.</p>
<p>Кстати, в обычном улье от 10 тыс. до 80 тыс. пчел.</p>
<ul>
<li>Если вы назвали число, которое меньше 10 тыс. — вы проиграли. Будем считать, что вы сорвали сроки. Game over</li>
<li>Если вы назвали число больше 80 тыс., то управление сроками берет на себя ваш босс. Он считает, что вы себя недооцениваете, а потому объявляет анонс продукта на срок вдвое меньший, чем вы бы того хотели. А вы в ответ срываете новый срок сдачи. Вы снова проиграли</li>
<li>Если ваш ответ тоже был диапазоном, но наименьшее число меньше 10 тыс. — вы тоже проиграли</li>
<li>Если ваш ответ был конкретным числом и вы попали в диапазон, то сделайте следующее, чтобы вычислить свои баллы. Вычислите разницу между вашим числом и 45 тыс., а потом умножьте результат на -1. Вот ваши баллы, поздравляю! Вы как бы не проиграли, но и выигрышем это назвать сложно.</li>
<li>Если вы назвали точное количество пчел в улье, используя диапазон, поздравляю с победой.</li>
</ul>
<p><strong>Ну и какое же решение я предлагаю для проблемы оценки сроков? Просто не оценивайте точно сроки.</strong></p>
<style data-mantine-styles="inline">.__m__-_R_41derddmiub_{--carousel-slide-gap:var(--mantine-spacing-xs);--carousel-slide-size:80%;}@media(min-width: 36em){.__m__-_R_41derddmiub_{--carousel-slide-gap:var(--mantine-spacing-xl);--carousel-slide-size:50%;}}</style><div style="--carousel-control-size:calc(2.5rem * var(--mantine-scale));--carousel-controls-offset:var(--mantine-spacing-sm);margin-bottom:var(--mantine-spacing-lg);padding-block:var(--mantine-spacing-sm);background:var(--app-color-surface)" class="m_17884d0f mantine-Carousel-root responsiveClassName" data-orientation="horizontal" data-include-gap-in-size="true"><div class="m_39bc3463 mantine-Carousel-controls" data-orientation="horizontal"><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="previous" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="next" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(-90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button></div><div class="m_a2dae653 mantine-Carousel-viewport" data-type="media"><div class="m_fcd81474 mantine-Carousel-container __m__-_R_41derddmiub_" data-orientation="horizontal"><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/group-training"><div style="padding-top:0rem;height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="margin-bottom:var(--mantine-spacing-sm)" class="m_599a2148 mantine-Card-section" data-first-section="true"><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img class="m_9e117634 mantine-Image-root" src="/vite/assets/blog_post-7eTyeLLt.webp" loading="lazy" alt="Лайв-кодинг, совместное решение задач, поддержка друг друга: как устроено групповое обучение программированию на Хекслете"/></div></div><p style="margin-bottom:var(--mantine-spacing-xs);font-size:var(--mantine-font-size-lg);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Лайв-кодинг, совместное решение задач, поддержка друг друга: как устроено групповое обучение программированию на Хекслете</p><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">На Хекслете существует несколько форматов обучения, один из них — «Групповой», в котором студенты...</p><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-sm)" class="m_4081bf90 mantine-Group-root">9 марта 2023 г.<p style="font-size:inherit" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/filmoteka-dlya-programmistov-25-filmov-o-programmirovanii-tehnologiyah-i-iskusstvennom-intellekte"><div style="padding-top:0rem;height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="margin-bottom:var(--mantine-spacing-sm)" class="m_599a2148 mantine-Card-section" data-first-section="true"><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img class="m_9e117634 mantine-Image-root" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTY5OSwicHVyIjoiYmxvYl9pZCJ9fQ==--ecd38e914c68debadef03c88a60804b37146e5b5/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%D1%8B%20IT-01.png" loading="lazy" alt="50 лучших фильмов и сериалов о технологиях"/></div></div><p style="margin-bottom:var(--mantine-spacing-xs);font-size:var(--mantine-font-size-lg);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">50 лучших фильмов и сериалов о технологиях</p><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Сделали подборку фильмов о технологиях, программировании, искусственном интеллекте и роботах.</p><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-sm)" class="m_4081bf90 mantine-Group-root">30 декабря 2022 г.<p style="font-size:inherit" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/marketolog-heksleta-natalya-musina-8-knig-kotorye-pomogut-vam-v-zhizni-i-v-rabote"><div style="padding-top:0rem;height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="margin-bottom:var(--mantine-spacing-sm)" class="m_599a2148 mantine-Card-section" data-first-section="true"><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img class="m_9e117634 mantine-Image-root" src="/vite/assets/blog_post-7eTyeLLt.webp" loading="lazy" alt="8 книг, которые помогут вам в жизни и в работе: советует комьюнити-менеджер Хекслета Наталья Мусина"/></div></div><p style="margin-bottom:var(--mantine-spacing-xs);font-size:var(--mantine-font-size-lg);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">8 книг, которые помогут вам в жизни и в работе: советует комьюнити-менеджер Хекслета Наталья Мусина</p><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Комьюнити-менеджер Хекслета Наталья Мусина делится подборкой своих любимых книг, которые помогают...</p><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-sm)" class="m_4081bf90 mantine-Group-root">29 декабря 2022 г.<p style="font-size:inherit" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></a></div></div></div></div></div>
<p>Вот ключевые шаги для отказа от дедлайнов:</p>
<ul>
<li>Выпускайте демо-версии продукта</li>
<li>Избегайте фичеризма</li>
<li>Расставляйте приоритеты</li>
</ul>
<p>Если вам надо поставить дедлайн, или у вас ограниченный бюджет, то не пытайтесь добавить все фичи. Вместо этого стройте приложение из независимых компонентов, чтобы ничего не сломалось, если вдруг вы откажетесь от реализации каких-то функций. Это очень важно — построить приложение так, чтобы можно было безболезненно сократить круг задач. Чтобы этого добиться, требуется очень хороший уровень коммуникации как внутри продуктовой команды, так и со <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://habr.com/ru/post/127630/" rel="noopener noreferrer" target="_blank">стейкхолдерами</a>.</p>
<p>Я призываю вас использовать демо-версии вместо дедлайнов, потому что от этого ваша команда будет счастливее и продуктивнее. Ирония в том, что отказавшись от дедлайна, вы больше никогда не будете срывать сроки.</p></div><div class=""><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-bottom:var(--mantine-spacing-lg)" class="m_4081bf90 mantine-Group-root"><div class="m_4451eb3a mantine-Center-root" data-inline="true"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:var(--mantine-spacing-xs);color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-user "><path d="M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0"></path><path d="M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2"></path></svg></div><p style="margin-inline-end:var(--mantine-spacing-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Lada Golunova</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">4 года назад</p></div><div style="align-items:center" class="m_8bffd616 mantine-Flex-root __m__-_R_5dirddmiub_"><a style="display:inline-flex" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/teoriya-demo-versiy-kak-dedlayny-delayut-razrabotchikov-neschastnymi/votes"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:var(--mantine-spacing-xs);color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-thumb-up "><path d="M7 11v8a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-7a1 1 0 0 1 1 -1h3a4 4 0 0 0 4 -4v-1a2 2 0 0 1 4 0v5h3a2 2 0 0 1 2 2l-1 5a2 3 0 0 1 -2 2h-7a3 3 0 0 1 -3 -3"></path></svg></div></a><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">6</p></div></div></div><div style="background-color:var(--mantine-color-indigo-light);border:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding:var(--mantine-spacing-xl)" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h4)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Читайте также:</p><ul style="margin-inline-start:var(--mantine-spacing-lg)" class="m_abbac491 mantine-List-root"><li style="margin-bottom:var(--mantine-spacing-sm)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a style="color:inherit" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/group-training">Лайв-кодинг, совместное решение задач, поддержка друг друга: как устроено групповое обучение программированию на Хекслете</a></span></div></li><li style="margin-bottom:var(--mantine-spacing-sm)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a style="color:inherit" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/filmoteka-dlya-programmistov-25-filmov-o-programmirovanii-tehnologiyah-i-iskusstvennom-intellekte">50 лучших фильмов и сериалов о технологиях</a></span></div></li><li style="margin-bottom:var(--mantine-spacing-sm)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a style="color:inherit" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/marketolog-heksleta-natalya-musina-8-knig-kotorye-pomogut-vam-v-zhizni-i-v-rabote">8 книг, которые помогут вам в жизни и в работе: советует комьюнити-менеджер Хекслета Наталья Мусина</a></span></div></li></ul></div><div style="margin-block:var(--mantine-spacing-xl)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" role="separator"></div></div><div></div></div><style data-mantine-styles="inline">.__m__-_R_lmiub_{--col-flex-grow:auto;--col-flex-basis:100%;--col-max-width:100%;}@media(min-width: 48em){.__m__-_R_lmiub_{--col-flex-grow:auto;--col-flex-basis:16.666666666666668%;--col-max-width:16.666666666666668%;}}@media(min-width: 62em){.__m__-_R_lmiub_{--col-flex-grow:auto;--col-flex-basis:33.333333333333336%;--col-max-width:33.333333333333336%;}}</style><div class="m_96bdd299 mantine-Grid-col __m__-_R_lmiub_ mantine-visible-from-md"><div style="background-color:var(--mantine-color-indigo-light);border:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-bottom:var(--mantine-spacing-xl);padding:var(--mantine-spacing-xl);width:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><div style="margin-bottom:var(--mantine-spacing-md)" class="m_4451eb3a mantine-Center-root" data-inline="true"><p style="font-size:var(--mantine-font-size-h4)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Категории</p></div><ul class="m_abbac491 mantine-List-root"><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Мотивация">Мотивация</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Истории успеха">Истории успеха</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Дневник студента">Дневник студента</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Код">Код</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Карьера">Карьера</button></span></div></li></ul></div><div style="justify-content:end;margin-top:0rem;position:sticky;top:calc(5rem * var(--mantine-scale))" class="m_8bffd616 mantine-Flex-root __m__-_R_5dlmiub_"><div tabindex="0" style="cursor:pointer"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses_javascript?promo_name=program_category&promo_position=blog_post&promo_creative=card&promo_type=card"><div style="background-color:var(--mantine-color-default);border:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border);padding-inline:var(--mantine-spacing-xl);padding-top:var(--mantine-spacing-xl);padding-bottom:var(--mantine-spacing-xs);width:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><div class="m_4451eb3a mantine-Center-root" data-inline="true"><p style="font-size:var(--mantine-font-size-h4)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Курсы по JavaScript</p></div><img class="m_9e117634 mantine-Image-root" src="/vite/assets/development-BVihs_d5.png"/><p style="margin-bottom:var(--mantine-spacing-xs);text-align:right" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></a></div></div></div></div></div></div></div>
</main>
<footer class="bg-dark fw-light text-light px-3 py-5">
<div class="row small">
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 mb-3">Хекслет</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/about">О нас</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/testimonials">Отзывы</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://b2b.hexlet.io" role="button">Корпоративное обучение</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/blog">Блог</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/qna">Вопросы и ответы</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/glossary">Глоссарий</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://help.hexlet.io" data-target="_blank" role="button">Справка</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" target="_blank" rel="noopener noreferrer" href="/map">Карта сайта</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 fw-normal mb-3">Направления</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_devops">DevOps
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_data_analytics">Аналитика
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_backend_development">Бэкенд
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_programming">Программирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_testing">Тестирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_front_end_dev">Фронтенд
</a></li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Профессии</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/go">Go-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/java">Java-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python">Python-разработчик </a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/data-analytics">Аналитик данных</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/qa-engineer">Инженер по ручному тестированию</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php">РНР-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/frontend">Фронтенд-разработчик</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Навыки</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python-django-developer">Django</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/docker">Docker</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php-laravel-developer">Laravel</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/postman">Postman</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-react-developer">React</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-rest-api">REST API в Node.js</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/spring-boot">Spring Boot</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/typescript">Typescript</a>
</li>
</ul>
</div>
</div>
<hr>
<div class="row">
<div class="col-12 col-sm-4 col-md-2">
<div class="fs-4">
<ul class="list-unstyled d-flex">
<li class="me-3">
<a aria-label="Telegram" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://t.me/hexlet_ru"><span class="bi bi-telegram"></span>
</a></li>
<li>
<a aria-label="Youtube" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://www.youtube.com/user/HexletUniversity"><span class="bi bi-youtube"></span>
</a></li>
</ul>
</div>
<div class="mb-2 d-flex flex-column">
<a class="link-light text-decoration-none" rel="nofollow" href="mailto:support@hexlet.io">support@hexlet.io</a>
<a class="link-light text-decoration-none py-2" target="_blank" href="https://t.me/hexlet_help_bot">t.me/hexlet_help_bot</a>
</div>
<ul class="list-unstyled d-flex">
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://hexlet.io/locale/switch?new_locale=en" data-target="_self" role="button"><span class="my-auto">EN</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 opacity-100 external-link" rel="nofollow" data-href="https://ru.hexlet.io/locale/switch?new_locale=ru" data-target="_self" role="button"><span class="my-auto">RU</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://kz.hexlet.io/locale/switch?new_locale=kz" data-target="_self" role="button"><span class="my-auto">KZ</span>
</span></li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<ul class="list-unstyled fs-4">
<li class="mb-3">
<a class="link-light text-decoration-none" href="tel:8%20800%20100%2022%2047">8 800 100 22 47</a>
<span class="d-block opacity-50 small">бесплатно по РФ</span>
</li>
<li>
<a class="link-light text-decoration-none" href="tel:%2B7%20495%20085%2021%2062">+7 495 085 21 62</a>
<span class="d-block opacity-50 small">бесплатно по Москве</span>
</li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<div class="small mb-3">Образовательные услуги оказываются на основании Л035-01298-77/01989008 от 14.03.2025</div>
<ul class="list-unstyled small">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/legal">Правовая информация</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/offer">Оферта</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/license">Лицензия</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/contacts">Контакты</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-12 col-md-4 small">
<div class="mb-2">
<div>ООО «<a href="/" class="text-decoration-none link-light">Хекслет Рус</a>»</div>
<div>108813 г. Москва, вн.тер.г. поселение Московский,</div>
<div>г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3</div>
<div>ОГРН 1217300010476</div>
<div>ИНН 7325174845</div>
</div>
<hr>
<div>АНО ДПО «<a href="/" class="text-decoration-none link-light">Учебный центр «Хекслет</a>»</div>
<div>119331 г. Москва, вн. тер. г. муниципальный округ</div>
<div>Ломоносовский, пр-кт Вернадского, д. 29</div>
<div>ОГРН 1247700712390</div>
<div>ИНН 7736364948</div>
</div>
</div>
</footer>
<div id="root-assistant-offcanvas"></div>
<script src="/vite/assets/assistant-Bukl1lYy.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/MarkdownBlock-DbyKWoR_.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/shiki-V011pkdv.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-XR8Qr8kR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dist-GCHh59xr.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useIsomorphicEffect-HJ6VK0D3.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-KSp6QbZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/classnames-l6ipYlLR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/debounce-jMQ_Cf4f.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v67327c56f0bb4ef8b305cae61679db8f1769101564043" integrity="sha512-rdcWY47ByXd76cbCFzznIcEaCN71jqkWBBqlwhF1SY7KubdLKZiEGeP7AyieKZlGP9hbY/MhGrwXzJC/HulNyg==" data-cf-beacon='{"version":"2024.11.0","token":"d11015b65d11429ea6b4a2ef37dd7e0b","server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>