Как сэкономить заказчикам денег на 1,5 миллиона и избавить от тоски разработчика

Мы компания CodeInside вот уже 10 лет занимаемся аутсортингом по разработке ПО. За это время мы успешно завершили более 100 проектов для МТС, БАРС Груп, The DevExperts, Lineate, Haulmont, AT Consulting, Джет-Мани и многих других.

В закладки

Только на протяжении нескольких лет это была постоянная гонка, чтобы осчастливить заказчика. Соблюдать сроки разработки, уложиться в бюджет, и… вовремя предоставить отчет о проделанной за месяц (неделю) работе. Если вы хоть немного связаны с IT, то можете себе представить взгляд и выражение лица программиста, когда менеджер спрашивает: “Где списанные часы, Дима?”. Такую тоску не смог бы описать даже великий Чехов.

В CodeInside ситуация усугублялась тем, что многие заказчики использовали для работы разные таск-менеджеры: Redmine, Jira, Assembla, GitLab, YouTrack. Разработчикам и менеджерам проектов приходилось вручную перетаскивать все данные из одной системы в другую. Ручками! Дикость, верно? Клиенты ждут отчет, разработчики бесятся, менеджеры пьют успокоительное.

В этой статье мы расскажем о том, как простое решение помогло все исправить.

Подобную историю можно терпеть, когда число клиентов небольшое, а команда разработчиков человек десять. Но…

5 лет назад. В день на отчет у каждого разработчика уходило от 5 до 10 минут, которые казались им вечностью. Менеджерам проектов приходилось угрозами (нет) призывать сотрудников списывать часы и делать короткие отчеты по задачам: заказчики хотели получить данные вовремя. А руководители CodeInside – оплату по счету. Получался трехсторонний конфликт, который влиял на настроение команды и клиентов не лучшим образом. Разработчики просто ненавидели эти 10 минут в день, менеджеры теряли драгоценное время на уговоры, а компания – деньги.

Кроме того, ручная работа по переносу порождала ошибки, и, как следствие – снова потерянное время и конфликты. Случай привел к тому, что один из топов (“Максим, спасибо!”) сделал легкий внутренний инструмент: TimeCrawler. Поначалу это был скрипт, который выгружал трудозатраты, задачи и фиксировал этапы их выполнения: что сделано, не сделано, сколько затрачено времени. Но главное: агрегировал данные в виде общей выгрузки из всех таск-менеджеров клиентов, с которыми мы работаем.

​Рис. 1 Скриншот рабочего стола TimeCrawler
​Рис. 2 Скриншот раздела подключения к внешним таск-менеджерам
​Рис. 3 Скриншот раздела настройки уведомлений TimeCrawler

Зачем мы это пишем? Проект за 5 лет сильно повзрослел. А за последние два года мы собрали объективную статистику потерь времени и денег, которой хотим поделиться. Во многих компаниях такого учета нет.

За 2018-2019 мы зафиксировали в системе более 80 000 человеко-часов трудозатрат. И по факту сэкономили 800 для себя и заказчиков. Кому-то эта цифра может показаться незначительной, но на больших проектах экономия существенная: 800 часов это более 1,5 миллионов рублей при средней стоимости часа разработки 2 000 рублей.

Но дело не только в деньгах.

Что изменилось в CodeInside с появлением TimeCrawler:

  • Сейчас у нас 18 разработчиков, 2 тестировщика, 3 менеджера, 2 руководителя и бухгалтер - регулярно используют TimeCrawler.
  • Менеджеры проектов в полуавтоматическом режиме сводят нужные отчеты для заказчиков. Освобождается около 4 часов в неделю (акты, счета, отчеты, подтверждения), которые можно использовать для новых проектов.
  • Мы быстрее вводим в строй новых сотрудников, т.к. все процессы задокументированы и есть пошаговые руководства к действию. Даже при уходе ключевых фигур весь опыт остается в компании в виде регламентов и инструкций.
  • Отличная внутренняя дисциплина и хорошее настроение сотрудников. Нет тоски - нет протеста.
  • Выполнение финансового плана. Мы вовремя сдаем работу и отчеты, а заказчик охотно оплачивает.
  • Клиент получает фактическую стоимость часа разработки дешевле, чем два года назад. Получается заметная экономия на больших проектах.
  • Заказчик всегда получает четкое обоснование стоимости часа. Это особенно важно в госпроектах, когда бюджет фиксирован.

Что нужно было сделать по-другому

Изначально мы реализовали уведомления по почте. Разработчики быстро настроили почтовые фильтры и не читали назойливые напоминания, о том что время не списано. Тогда мы попробовали реализовать данный функционал через чат бота, который не вызывает такого отторжения, потому что он выполняет полезную функцию (его можно спросить, сколько я времени не зарепортил в любой момент), плюс чат-боты, как более модный способ коммуникации.

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

Вместо итога

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

Кстати, выгода, которую дает наш инструмент, была дополнительным аргументом на переговорах с клиентами в сфере Финтех, госуслуг или IoT и Hardware.

Поделитесь в комментариях, сталкиваетесь ли вы с описанной ситуацией в своей работе.

Материал опубликован пользователем.
Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Maxim Semenkin", "author_type": "self", "tags": [], "comments": 2, "likes": 4, "favorites": 7, "is_advertisement": false, "subsite_label": "life", "id": 92565, "is_wide": false, "is_ugc": true, "date": "Thu, 14 Nov 2019 08:45:43 +0300", "is_special": false }
0
{ "id": 92565, "author_id": 393987, "diff_limit": 1000, "urls": {"diff":"\/comments\/92565\/get","add":"\/comments\/92565\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/92565"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199123, "last_count_and_date": null }
2 комментария
Популярные
По порядку
1

Большинство дублируют вручную в основной треккер либо в таблички и их это устраивает. Видимо не задумывались, сколько на этом теряют

Ответить
0

Другим разработчикам предлагали ваше решение?

Ответить
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovx", "p2": "glug" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Баннер в ленте на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "disable": true, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } }, { "id": 20, "label": "Кнопка в сайдбаре", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cgxmr", "p2": "gnwc" } } } ] { "page_type": "default" }