Дистанционно-управляемый XY-манипулятор на базе кинематики H-bot

Картинка – Freepik: Maniacvector, Flaticon

Некоторое время назад, автору этой статьи пришла в голову своеобразная мысль: а что если сделать удалённо-управляемый манипулятор, который может перемещаться по XY и совершать некую полезную работу?

Сказано — сделано, и работа закипела… В качестве основы для подобного манипулятора было решено взять широко известный принцип кинематики H-bot.

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

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

Использование подобной кинематики для управления человеком автором ещё нигде не наблюдалось (что, тем не менее, не исключает её наличия где-либо :-)) )

В каком статусе находится подобная разработка в данный момент: практически реализована, однако, до момента окончательного запуска её, не будем о ней более подробно распространяться. Для чего она будет использована: для игры в настольный хоккей или футбол, в одной из школ. Для системы практически полностью напечатаны компоненты с использованием 3D принтера, а также она практически собрана (после ряда предварительных тестов).

Для чего ещё может быть применена подобная система: например, на той же стройке, для перемещения грузов в пределах строительной площадки и т.д.
Однако перейдём ближе к делу…

Существует целый ряд возможных кинематических решений, для перемещения целевой каретки в пределах координатной системы XY. Тем не менее автору приглянулась решение, носящее название H-bot:

Несмотря на ряд его недостатков, в числе которых возможность перекосов при движении, и ввиду этого, строгие требования к отсутствию люфтов, — автору подобное решение показалось достаточно простым и лаконичным, так как те же самые перекосы (при их возникновении), — вполне можно решать (программным или программно-аппаратным) путём.

А теперь попробуем прикинуть, каким образом можно было бы управлять подобным робототехническим приводом? Так как автор периодически возвращается в мыслях к идее стартапа, дающего возможность удалённого управления большими промышленными механизмами (например, экскаваторами, грейдерами и т.д. и т. п.), к примеру, чтобы сотрудники из одного региона, могли удалённо управлять устройствами, устроившись виртуально на работу в другом регионе («Скайнет» всё ближе, хе-хе), то, все технологии, которые могут облегчить реализации подобной затеи, вызывают повышенный интерес.

Здесь, конечно, возможно великое множество различных способов удалённого контроля, однако одним из наиболее простых и доступных (несмотря на то, что многие автора уверяли в том, что будет очень большой временной лаг и в реальном времени это будет невозможно, — эксперименты показали, что это не так) — является управление с использованием протокола MQTT.

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

Хотя одним из наиболее простых способов является управлением с помощью дискретных кнопок, автору захотелось реализовать более плавное управление, а здесь уже просится использование джойстика с отклоняемым стиком.

Долгий опыт работы со стиками, подобными показанному ниже, убедили автора в том, что чудес не бывает и любая механика рано или поздно изнашивается и начинает ощутимо «шуметь»:

Поэтому был выбран условно более надёжный способ, который заключается в использовании виртуального джойстика. Поверхностный анализ существующих решений выдал интересный вариант, который можно скачать с Google Play:

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

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

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

Если мы ещё раз обратимся к логике кинематики H-bot, то мы увидим, что в составе подобной схемы, из механики используются два двигателя. Так как человечество ещё ничего принципиально более нового и совершенного не изобрело для управления двигателями, кроме ШИМ-контроля (хотя, учитывая технический прогресс, автор уже ни в чём не уверен :-)) ), то и мы будем использовать этот же подход.

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

Теперь, с учётом всего вышеизложенного, а также после того как мы ознакомились с логикой H-bot, попробуем нанести на круговую схему, — как направления вращения двигателей, так и требуемые для этого углы.

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

Например, если мы обратимся к интервалу 0-45° (в финальной программе интервал 0-44° и т.д., то есть, на одно значение меньше в каждом интервале), то можно увидеть, например, что в этом интервале скорость правого двигателя плавно убавляется и, с 45° и вплоть до 89°- скорость правого двигателя плавно нарастает, инвертированная по направлению в другую сторону.

Цифры внутри круга показывают, какое цифровое значение ШИМ-управления вращения двигателя является максимальным, а какое минимальным. Не забываем, что при инвертировании направления вращения меняется также и диапазон чисел. Например, если мы обратимся к интервалу от 0 до 45° (на картинке выше), то там можно увидеть, что для правого двигателя минимальным значением является 0, а максимальным 255.

Однако, если мы обратимся опять же к правому двигателю, в интервале от 45 до 90°, мы заметим, что для него диапазон значений ШИМ инвертировался также в противоположную сторону, и для него теперь в этом положении максимальным значением становится 0, а минимальным 255 и т.д.

Теперь, когда у нас есть понимание работы всей системы в целом, мы можем реализовать изложенные идеи в программном коде. Одним из наиболее простых способов видится использование C++ и её функции map, которая позволяет пропорционально перенести значение из одного диапазона в другой, так как нам требуется перевести угол наклона и силу «газа» в конкретные значения ШИМ целевого двигателя.

Синтаксис функции выглядит следующим образом:

map(value, fromLow, fromHigh, toLow, toHigh) value: значение для переноса fromLow: нижняя граница текущего диапазона fromHigh: верхняя граница текущего диапазона toLow: нижняя граница нового диапазона, в который переносится значение toHigh: верхняя граница нового диапазона 

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

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

Код управления двигателями

 void Motors_Control (int ugol,int PWM) {    if (PWM != 0)   {     if (ugol != ugol_current)     {     //записали текущее значение угла     //для чего это надо: будем теперь менять скорость,     //только если пришла новая цифра значения угла - которая отличается     //от текущего(т.к. с брокера приходит непрерывная череда цифр,     //которые могут быть одинаковыми, если вы удерживаете джойстик в одном     //положении, нам надо реагировать только на отличающиеся):     ugol_current = ugol;        //       if ( (ugol>=0)&&(ugol<=44) )       {         //вычисляем скорость левого двигателя         int left_motor_PWM = map(PWM, 0, 100, PWM_min, PWM_max);                  //вычисляем скорость правого двигателя         //тут 0-мин.скорость, 255- макс.скорость         int right_motor_PWM = map(ugol, 0, 44, PWM_max, PWM_min) ;                  Left_Motor (false, left_motor_PWM);         Right_Motor (false, right_motor_PWM);       }       else if ( (ugol>=45)&&(ugol<=89) )       {         //вычисляем скорость левого двигателя         int left_motor_PWM = map(PWM, 0, 100, PWM_min, PWM_max);              //вычисляем скорость правого двигателя         //тут 255-мин.скорость, 0- макс.скорость         int right_motor_PWM = map(ugol, 45, 89, PWM_max, PWM_min);          Left_Motor (false, left_motor_PWM);         Right_Motor (true, right_motor_PWM);             }       else if ( (ugol>=90)&&(ugol<=134) )       {         //вычисляем скорость правого двигателя         int right_motor_PWM = map(PWM, 0, 100, PWM_max, PWM_min);                  //вычисляем скорость левого двигателя         //тут 0-мин.скорость, 255- макс.скорость           int left_motor_PWM = map(ugol, 90, 134, PWM_min, PWM_max);            Left_Motor (false, left_motor_PWM);         Right_Motor (true, right_motor_PWM);             }       else if ( (ugol>=135)&&(ugol<=179) )       {         //вычисляем скорость правого двигателя         int right_motor_PWM = map(PWM, 0, 100, PWM_max, PWM_min);              //вычисляем скорость левого двигателя         //тут 255-мин.скорость, 0- макс.скорость         int left_motor_PWM = map(ugol, 135, 179, PWM_max, PWM_min);             Left_Motor (true, left_motor_PWM);         Right_Motor (true, right_motor_PWM);               }       else if ( (ugol>=180)&&(ugol<=224) )       {         //вычисляем скорость левого двигателя         int left_motor_PWM = map(PWM, 0, 100, PWM_max, PWM_min);                  //вычисляем скорость правого двигателя         //тут 255-мин.скорость, 0- макс.скорость         int right_motor_PWM = map(ugol, 180, 224, PWM_max, PWM_min);                 Left_Motor (true, left_motor_PWM);         Right_Motor (true, right_motor_PWM);             }       else if ( (ugol>=225)&&(ugol<=269) )       {         //вычисляем скорость левого двигателя         int left_motor_PWM = map(PWM, 0, 100, PWM_max, PWM_min);              //вычисляем скорость правого двигателя         //тут 0-мин.скорость, 255- макс.скорость         int right_motor_PWM = map(ugol, 225, 269, PWM_min, PWM_max);                     Left_Motor (true, left_motor_PWM);         Right_Motor (false, right_motor_PWM);              }       else if ( (ugol>=270)&&(ugol<=314) )       {         //вычисляем скорость правого двигателя         int right_motor_PWM = map(PWM, 0, 100, PWM_min, PWM_max);              //вычисляем скорость левого двигателя         //тут 255-мин.скорость, 0- макс.скорость         int left_motor_PWM = map(ugol, 270, 314, PWM_max, PWM_min);                     Left_Motor (true, left_motor_PWM);         Right_Motor (false, right_motor_PWM);             }       else if ( (ugol>=315)&&(ugol<=359) )       {         //вычисляем скорость правого двигателя         int right_motor_PWM = map(PWM, 0, 100, PWM_min, PWM_max);              //вычисляем скорость левого двигателя         //тут 0-мин.скорость, 255- макс.скорость         int left_motor_PWM = map(ugol, 315, 359, PWM_min, PWM_max);                       Left_Motor (false, left_motor_PWM);         Right_Motor (false, right_motor_PWM);               }         }   }   else   {     Stop ();   }   }

В коде выше: PWM_min = 0; PWM_max = 255; true или false — передающиеся в подфункции, непосредственно связанные с двигателями — управляют прямым или обратным направлением вращения.

В свою очередь, эта функция будет вызываться внутри другой, которая будет осуществлять первичный парсинг сообщения, полученного в виде строки с брокера, и выдёргивать из неё две требующиеся цифры:

Парсер сообщения с брокера

  void Motors (char* topic, char ch [])     {               //строка, куда мы записали название топика,               //которое ниже будем анализировать               String s = topic;                //преобразовали массив символов - в строку               String s2 = String(ch); //            Serial.println (s2);                              //Выдернули из строки только её кусок - с первой цифрой,               //для этого - нашли, на какой позиции (т.е. номер) стоит пробел в этой строке               String s3 = s2.substring (0, s2.indexOf(" "));                 //Преобразовали выдернутый кусок строки - в число               //(т.к. компьютер понимает пока этот кусок как строку,               //он не знает что это число. Ему надо явно "пальцем показать")               int ugol = s3.toInt(); //              Serial.println (motor_direction);                 //Выдернули из строки только её кусок - со второй цифрой,               //для этого - нашли, на какой позиции (т.е. номер) стоит пробел в этой строке               String s4 = s2.substring (s2.indexOf(" "), s2.length());                //Преобразовали выдернутый кусок строки - в число               //(т.к. компьютер понимает пока этот кусок как строку,               //он не знает что это число. Ему надо явно "пальцем показать")               int motor_PWM = s4.toInt(); //              Serial.println (motor_PWM); //              Serial.println ( motor_direction );                               //теперь у нас есть 2 выдернутые цифры               //и теперь мы вызываем функцию, которая запустит двигатели нужным образом               //(и в эту функцию мы передаём полученные 2 цифры):               Motors_Control (ugol, motor_PWM);  } 

Таким образом, на выходе получится достаточно интересная вещь, позволяющая с джойстика управлять искомым манипулятором типа H-bot.

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

Если хорошо подумать, для подобного манипулятора может быть найдено множество полезных применений:

  • переноска тяжестей в пределах строительной площадки;
  • рисование картин на больших высотах, художником, стоящим на земле;
  • оштукатуривание и подкраска участков стен на больших высотах;
  • настольная игра (в данный момент реализуется автором);
  • и так далее.

По крайней мере, использование такого манипулятора подобным неожиданным образом, а не только в 3D-принтерах/ЧПУ-станках видится достаточно любопытным…

В версии автора статьи к каретке будет ещё прикреплён сервопривод, на конце которого будет находиться двигатель с крыльчаткой, наносящей удар по мячу:

Как альтернатива этому – установить бьющий соленоид, и сделать из всей этой истории – бильярд :-).

Соответственно, код будет тоже доработан под эти элементы в будущем.

Играй в нашу новую игру прямо в Telegram!


ссылка на оригинал статьи https://habr.com/ru/company/ruvds/blog/713492/

Каким стартапам и сколько денег дает венчурный фонд hh.ru

Саммари выпуска подкаста «Стартап-секреты» c руководителем hh ventures Евгением Вольновым, в котором обсудили: пять трендов HRtech у нас и за рубежом, свежие инвестиционные сделки и варианты получения денег от венчурного фонда hh.ru.

Если вы предпочитаете слушать, то сделать это можно на подкаст-площадках: 

Вам полезно дочитать до конца 

Если вы создаёте стартап в области HR-tech — статья поможет понять, что происходит на этом рынке и куда текут капиталы такого солидного стратегического инвестора, как венчурный фонд hh.ru. Если ваш стартап из другой сферы – будет полезно ознакомиться с тем, что инвесторы хотят видеть в стартапах, сколько денег крутится в смежных рынках, какие тренды сейчас интересны инвесторам России и мира. 

О госте 

Евгений Вольнов

В hh.ru отвечает за корпоративный венчурный фонд hh ventures. До этого развивал инновации и рекламные продукты в Sports.ru, Independent Media, Rambler. Автор телеграм-канала The Future Of Work.

Тренды HRtech мирового рынка 

Первая большая категория трендов – это payroll – все процессы связанные с выплатой зарплаты. Стартап Deel. является абсолютно уникальным кейсом в этой отрасли: в 2019 году ребята попали в YCombinator (американский венчурный фонд, работающий в формате бизнес-инкубатора) и получили 150 тысяч долларов. В 2021 году они получают инвестиции (уже при оценке что-то в районе миллиарда) – 300 миллионов, а в 2022 году получают 50 миллионов долларов при оценке компании в 12 миллиардов. 

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

Всё, что связано с медициной и well being, является второй категорией трендов, и это сфера приложения инвесторских интересов мирового масштаба. Сюда входят такие подкатегории, как ментальное здоровье, психотерапия и коучинг. Хороший пример в этой сфере – американский проект Better Up, который в 2021 году значительно вырос: в начале года компания получила инвестиции при оценке более миллиарда, а закончили этот год при оценке 5,5 млрд.

Карта глобального HR tech от фонда Greenfield Partners, сентябрь 2022 года 
Карта глобального HR tech от фонда Greenfield Partners, сентябрь 2022 года 

Третьей категорией является направление по переобучению и повышению квалификации (рескиллинг, апскиллинг). Сегодня людям необходимо быть более эффективными, для чего нужно быстро переобучаться и получать новые навыки. С этим связана большая тема, которая называется Skill Base: всё, что основано на навыках. И фокус внимания направлен не на университетские дипломы, а на то, какие конкретно операции умеет выполнять человек. 

Если первые три категории ещё более-менее знакомы широкой аудитории, то четвёртая – чистое веяние времени; тренд, сформированный роботами, фрилансерами и интернетом: Гиг-занятость.

Это все те сферы, в которых требуется почасовой труд: «синие воротнички» (клерки в офисе), рабочие на стройках, много в HoReCa (отельный бизнес, рестораны, пешеходная экономика, преимущественно малый розничный бизнес). Именно здесь нужно часто нанимать людей, которые поработают два часа кассирами, а потом пойдут учиться: это и есть Гиг-занятость, которая сегодня развивается в самых разных областях. 

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

Тренды HRtech в России 

1. Перед обзором российских трендов для инвестирования хорошо понимать, что у нас и за рубежом рынки развиваются по-разному. Поэтому в России в первую очередь нужно смотреть в сторону Well-being — это хорошая категория, которая растёт и будет расти. 

Пять лет назад онлайн-психотерапии в России особо не было. Можно было найти психотерапевта, договориться с ним о консультации в Скайпе, например. Но системных решений, удобных и недорогих, не было. А за последние три года появились такие решения, как «Ясно», YouTalk, «Зигмунд онлайн».

Карта HR tech в России от ed2.tech, июль 2022 года 
Карта HR tech в России от ed2.tech, июль 2022 года 

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

Чтобы вы понимали, топ-4 игроков в этой категории создают около 2 миллиардов годовой выручки. Да, это не бизнес на миллиарды долларов, но он очень хорошо растёт. Если бы они получили такие же инвестиции, как российские образовательные технологии, то может быть их выручка была бы больше раз в пять. 

Подсказка от гостя:

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

2. Вторая категория для стартапов – рескиллинг и апскиллинг: это хорошая история для России. Пока там не так много денег, нужно чтобы эта категория расширялась.

У нас профессиональное образование довольно низкого качества: люди приходят на заводы, на стройку, особенно на инфраструктурную стройку, метро, например. Это сопряжено с опасностью, и рабочие должны быть настоящими профессионалами. 

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

3. И стоит выделить также рекрутмент. Вы знаете, наверное, о недавней покупке компанией «Авито Работа» контрольного пакета в казахстанском сервисе чат-ботов HR Messenger. Таким приобретением компания Авито усилила присутствие в отрасли HR-tech. Эта сделка как некий индустриальный сигнал. 

  • HR Messenger — сервис для автоматизации подбора и найма сотрудников через чат-ботов в WhatsApp, Telegram и Viber. С его помощью можно автоматически протестировать кандидата, назначить дату и время собеседования. Работодатель связывается с соискателем только на финальном этапе отбора.

  • В 2022 году, по собственным данным компании, более 4 млн соискателей в России откликнулись и прошли отбор через HR Messenger.

  • С момента запуска в 2018 году, по данным Crunchbase, HR Messenger без учёта последних инвестиций привлёк $1,7 млн. Из них — $1,2 млн от «Авито» в 2021-м, размер купленной доли стороны тогда не раскрыли.

Куда не стоит идти стартапам в России 

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

В какие стартапы уже вложил деньги венчурный фонд HH 

HeadHunter не только рассуждает об инвестировании, но и вкладывается. Под крылом венчурного фонда существуют такие стартапы, как:

  • Skillaz, сервис по автоматизированному подбору персонала (инвестиции в виде приобретении 25% доли компании за 232 млн рублей);

  • YouDo, сервис по поиску исполнителей для решения бытовых и бизнес-задач (с инвестированием в размере 5 млн долларов и приобретением миноритарной доли в компании);

  • DreamJob, сервис достоверных отзывов о компаниях и руководстве;

  • HRLink, сервис автоматизации кадрового электронного документооборота (инвестиции в размере 100 миллионов рублей);

  • Edstein, платформа для оценки и обучения персонала, (размер инвестирования не разглашается, HH получил долю в 25% и опцион на выкуп контрольного пакета акций).

3 особенности стартапов, которые помогут получить инвестиции венчурного фонда HH 

  • Открытая информация об объёме ежегодной выручки (желательно 20-30 млн в год).

  • «Суперсила» — одна классная функция, которую стартап делает лучше всех.

  • Рост в полтора-два раза в год.

Главная цель венчурного фонда – не «купить-продать и снять сливки», а создать синергию в формате win-win в HR-технологиях. Для этого важна команда, опытный коллектив.

Частые ошибки молодых проектов 

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

3 совета для стартаперов в HR-проектах от Евгения Вольнова 

  • Дерзайте! Это индустрия, которая развивается в России прямо сейчас, поэтому нужны ваши свежие креативные решения.

  • Обязателен опыт, с наскока не получится.

  • Продуктивно выглядит сочетание EdTech и HRTech. Копайте здесь!


Если вам понравилась статья, поставьте ей лайк и поделитесь с коллегой или другом – вдруг им тоже будет полезно узнать.

Вопросы в комментариях приветствуются!

P.S. Развиваете свой стартап — добро пожаловать в чат читателей, где уже более 700 человек обсуждают сервисы, приложения и бизнес-модели — присоединиться.


ссылка на оригинал статьи https://habr.com/ru/post/713818/

Побег из песочницы и захват леса — реальный сценарий взлома корпоративной сети

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

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

Перед стартом проекта детально оговариваются условия: гарантии, ограничения, пределы и объем работ. В этот раз заказчик поручил проверить три домена и выдал учетную запись с типовыми, популярными и распространенными правами. Админы компании выбрали для доступа к инфраструктуре терминальную ферму от Citrix. Это довольно популярное решение для создания виртуальных рабочих мест — фактически Remote Desktop-сервис, работающий через браузер. Заходишь на адрес на корпоративном домене, вводишь логин и пароль, и открывается интерфейс для запуска неких заранее выбранных приложений.

Мне достался удаленный доступ к 1С, консоли Active Directory, паре CRM-систем и приложению ServiceDesk. Не все эти приложения работали одинаково быстро и стабильно, но это проблемы пользователей. Для хакера важно другое: три из них работали через Internet Explorer.

Виртуальный рабочий стол и доступные мне терминальные приложения
Виртуальный рабочий стол и доступные мне терминальные приложения

Браузер внутри браузера, сон во сне, матрешка — как ни назови, суть в том, что эти приложения представляют собой трансляцию окна Internet Explorer, открытого где-то внутри инфраструктуры компании. Это отличный шанс сбежать из песочницы Citrix в полноценную операционную систему.

Сделать это совсем несложно, но было время, когда подобные трюки срабатывали даже с банкоматами. Подошло бы любое из приложений на базе Internet Explorer, но я выбрал сеанс, создаваемый при запуске ServiceDesk. Он просто открывался быстрее других.

Если вызвать окно браузера «File->Save as…», появится стандартное окно сохранения, где отображается путь к внутренней директории. Думаю, вы уже догадались, что если вписать туда имя исполняемого файла, то он запустится. Таким образом я запустил powershell.exe и explorer.exe на терминальном сервере где-то в инфраструктуре компании. Теперь нужно было понять, куда я попал.

Изучаю инфраструктуру и считаю учетки

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

Что касается сетевой инфраструктуры, то она оказалась довольно обычной — три взаимосвязанных домена с практически 100% доверительными отношениями. Инвентаризация показала следующую картину: 

  • в первом домене — около 3000 активных учетных записей пользователей и 2500 активных учетных записей компьютеров, 

  • во втором — 2900 активных записей пользователей и 800 компьютеров, 

  • третий включал всего 60 пользовательских и 30 компьютерных записей.

Доверительные отношения между доменами
Доверительные отношения между доменами

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

Провожу разведку и ищу уязвимости

В пентестах мы, как правило, проверяем инфраструктуру на уязвимость к AS-REP Roasting и Kerberoasting. Учетные записи, уязвимые перед AS-REP Roasting, в сети отсутствовали, и с Kerberoasting тоже не повезло. Я получил N-ное число сервисных билетов Kerberos (TGS) для учетных записей, обладающих SPN, сумел восстановить десяток паролей при помощи брутфорса, но все взломанные учетки были непривилегированными.

Восстановление пароля от одной из учетных записей
Восстановление пароля от одной из учетных записей

Spraying-атака паролями от этих учетных записей позволила скомпрометировать еще несколько пользователей, но администраторов среди них не было.

Результат атаки Password-spraying
Результат атаки Password-spraying

Следующим шагом стала проверка хостов в сети на популярные уязвимости, типичные для служб, работающих на портах TCP/445 и TCP/3389: CVE-2009-3103, CVE-2019-0708 (Bluekeep), ms06-025, ms07-029 и тому подобным. Я не мог установить на терминальный сервер полноценный сканер уязвимостей, так что пришлось использовать NMAP с предустановленными скриптами проверок.

Сканирование хостов на предмет наличия уязвимости CVE-2019-0708 (Bluekeep)
Сканирование хостов на предмет наличия уязвимости CVE-2019-0708 (Bluekeep)

Уязвимостей не нашлось, но теперь у меня был список серверов с 445 портом и там стоило поискать общедоступные файлы.

Атакую первый домен

Через несколько дней в одной из сетевых папок нашлась резервная копия системы nw-dc01 в формате WindowsImageBackup.

Та самая шара с бекапом
Та самая шара с бекапом

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

Так в мои руки попала резервная копия контроллера домена. Понимаете, к чему идет? Это основной сервер аутентификации Active Directory, там хранятся учетные записи всех пользователей домена и выполняется их аутентификация. Нужно было только смонтировать образ как виртуальный диск и извлечь файлы NTDS.dit (хранилище учетных данных ActiveDirectory) и SYSTEM (этот файл необходим для расшифровки ntds.dit).

Расшифровка файла NTDS.dit
Расшифровка файла NTDS.dit

Резервная копия была сделана больше года назад, но кто вообще меняет пароли? Вот и администратор первого домена давно этого не делал, и хэш его пароля из хранилища оказался вполне рабочим. Чтобы воспользоваться этим, проще всего подключиться в режиме отладки к процессу LSASS и провести атаку Pass-the-hash, но, для этого требуются привилегии локального администратора на терминальном сервере, которых у меня до сих пор не было.

В то же время, зная хеш пароля учетной записи, любой пользователь может запросить для нее TGT-билет у контроллера домена и в дальнейшем использовать для авторизации не хеш, а билет. На этом строится другая атака — Over-pass-the-hash.

Для реализации этой техники используется утилита Rubeus, но просто взять и скопировать на терминал не получалось. Этот инструмент распознается большинством антивирусов, а на сервере был установлен клиент Касперского. С ним пришлось повозиться.

Rubeus написан на C# и имеет открытый исходный код, так что утилиту можно пересобирать раз за разом, до тех пор пока антивирус не перестанет ее узнавать. Потребовалось с десяток попыток, Rubeus пришлось урезать и облегчить, но с радаров он пропал и запустился на терминале, несмотря на активную защиту.

Успешная атака Over-pass-the-hash — импорт запрошенного TGT-битета для учетной записи администратора первого домена
Успешная атака Over-pass-the-hash — импорт запрошенного TGT-битета для учетной записи администратора первого домена

В результате я получил доступ к учетной записи администратора первого домена, выполнил атаку DCSync и получил актуальные доменные учетные данные (логин и хеш пароля) всех членов первого домена.

Реализация атаки DCSync в первом домене
Реализация атаки DCSync в первом домене

На части скомпрометированных компьютеров работал LAPS (Local Administrator Password Solution) — механизм управления локальными администраторами на уровне доменов.

Парольная политика первого домена
Парольная политика первого домена

Чтобы закрепить успех, я выполнил дамп значений атрибута ms-Mcs-AdmPwd, содержащий значение пароля встроенной локальной административной учетной записи хоста для всех компьютерных учетных записей первого домена. Так я получил пароли еще для 300 учеток.

Атакую второй домен

Среди захваченных машин был хост с активной сессией пользователя из группы Domain Admins второго домена. Чтобы скомпрометировать эту сессию, нужно было сделать дамп памяти системного процесса lsass.exe, но этому снова мешал антивирус.

Здесь стоит объяснить, что корпоративные инсталляции Касперского состоят из трех компонентов: выделенного центра управления, установленных на каждом компьютере клиентских приложений и спаренных с ними агентов администрирования. К каждому агенту прилагается служебная утилита klnagchk. Она нужна для проверки соединения с центром администрирования и без затей сообщает его адрес любому пользователю. С ее помощью я нашел хост, где располагался центр управления антивирусом. Пароль локального администратора от него хранился в LAPS и попал в дамп, сделанный на предыдущем этапе пентеста. Так что я авторизовался, создал локальную учетную запись pentest, добавил ее в локальную группу, члены которой имеют доступ к управлению антивирусной защитой.

Назначение прав локальной учетной записи pentest
Назначение прав локальной учетной записи pentest

Затем я подключился к центру администрирования и на время остановил антивирус на хосте, где залогинился админ второго домена.

Приостановка антивируса с помощью веб-интерфейса KSC
Приостановка антивируса с помощью веб-интерфейса KSC

Теперь у меня были развязаны руки, но попытка сделать дамп процесса lsass.exe с помощью инструмента mimikatz закончилась ошибкой.

Ошибка при попытке сделать дамп памяти защищенного процесса lsass.exe
Ошибка при попытке сделать дамп памяти защищенного процесса lsass.exe

При использовании этого эксплоита следует держать в голове одну тонкость. Начиная с Windows Server 2012 lsass.exe может работать в двух режимах: обычном и защищенном — Protected Process Light (PPL).

Проверка наличия защиты процесса lsass.exe. На ее наличие указывает значение 1 для параметра RunAsPPL
Проверка наличия защиты процесса lsass.exe. На ее наличие указывает значение 1 для параметра RunAsPPL

PPL активируется через реестр. Там же защита снимается, но, чтобы изменения вступили в силу, потребуется перезагрузка. В результате обнулятся открытые на сервере сессии, и кто-нибудь это заметит. Поэтому лучше задействовать через библиотеку mimilib, которая обходит защиту на уровне драйвера ядра.

Обход защиты процесса lsass.exe и получение содержимого его памяти
Обход защиты процесса lsass.exe и получение содержимого его памяти

Тогда это было еще непонятно, но в этот момент набрался критический объем информации и успешное завершение пентеста стало вопросом времени. Защита посыпалась, как домино. Получив NTLM-хеш доменной административной учетной записи, я повторил атаки Over-pass-the-hash и DCSync по аналогии с первым доменом. В результате были получены значения NTLM-хешей для всех учетных записей второго домена и полный контроль над ним.

Атакую третий домен

Третий домен был корневым доменом леса, и административные привилегии в нем имели члены групп Enterprise Admins и Domain admins. При этом, одна из учетных записей второго домена входила в состав группы Enterprise Admins третьего домена, и у меня уже был ее NTLM-хеш. Поэтому взлом третьего домена прошел по накатанной.

Реализация атаки Over-pass-the-hash в третьем домене
Реализация атаки Over-pass-the-hash в третьем домене

Повторение атак Over-pass-the-hash и DCSync в третьем домене обеспечило полный контроль над ним и всем лесом.

Реализация атаки DCSync в третьем домене
Реализация атаки DCSync в третьем домене

Разбор полетов

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

Неправильное назначение прав на общие файловые ресурсы позволило овладеть резервной копией одного из контроллеров домена. В ней нашелся старый, но все еще рабочий пароль от административной учетной записи. Членство в группах Domain и Enterprise Admins администраторов первого и второго доменов позволило развить атаку и выстроить вектор, который привел к полной компрометации корпоративной сети. Как это часто бывает, выводы по итогу очевидны. Админам компании следовало:

  • отключить делегирование для доменных административных учетных записей, если в этом нет необходимости;

  • настроить аудит изменения членства в административных группах;

  • отключать неактивные (неиспользуемые более 6 месяцев) учетные записи;

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

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


ссылка на оригинал статьи https://habr.com/ru/company/bastion/blog/713600/

Мониторинг аномальной активности в операционной системе «Нейтрино»

Активности в операционной системе могут быть самыми разнообразными. Это может быть и запуск нового процесса или потока, и обращение к файловой системе, и выделение памяти, и многое другое. Могут возникнуть ситуации, когда (вследствие действий злоумышленника и\или программной\аппаратной ошибки) эта активность становится аномальной, то есть поведение системы начинает отличаться от ожидаемого. Запуск неизвестного процесса на этапе эксплуатации изделия, потребление процессом необычно большого количества памяти, установка сетевых соединений, которых быть не должно в системе — всё это примеры аномальной активности, возможно требующие внимания со стороны пользователя или разработчика.

Потребители нашей операционной системы (ЗОСРВ “Нейтрино”), имеют доступ к достаточно большому арсеналу средств, обеспечивающих надежность и безопасность системы. Среди них системы контроля целостности компонентов, встроенные средства защиты информации, средство обнаружения потенциально опасных программ (антивирус) и средства обеспечения высокой готовности (отказоустойчивости). Однако, в контексте мониторинга аномальных активностей их становится недостаточно. Это подтолкнуло нас к разработке программного комплекса мониторинга аномальных процессов (ПК МАП). В его основу лежат механизмы сбора и анализа состояния системы, а также технологии машинного обучения.

Сбор информации об активности процессов

В ЗОСРВ “Нейтрино” имеется большое количество способов получения информации об активности процессов. Схематически они показаны на рисунке:

Трассировка событий

В составе ЗОСРВ “Нейтрино” имеется диагностическая версия микроядра (procnto-instr), которая обладает развитым механизмом трассировки и протоколирования событий. Он позволяет отслеживать взаимодействие между ядром ОС и любым активным потоком или процессом. Это могут быть, например, вызовы ядра, изменение состояний потоков, прерывания, и многое другое.

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

Использование диагностического ядра может повлиять на производительность системы. Хотя падение производительности может составлять всего несколько процентов, по сравнению с версией ядра без этого механизма, его использование на “боевом” железе часто применяется для накопления диагностической информации о работе системы.

Менеджер процессов и потоков

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

Таким образом, операционная система позволяет привилегированному процессу получать информацию об активности процессов и потоков в системе. Программный комплекс мониторинга аномальных процессов использует виртуальную файловую систему /proc и собирает следующую информацию:

  • запущенные процессы и потоки;

  • потребление памяти;

  • состояние стека;

  • открытые файловые дескрипторы;

  • открытые соединения (включая сетевые);

  • состояние каналов;

  • запущенные таймеры;

  • обработчики прерываний;

  • разделяемые библиотеки в памяти.

Помимо перечисленных источников информации об активности, ими также может выступать сетевой стек (анализ сетевого трафика), дисковая подсистема (операции чтения/записи), или, например, подсистема ввода (анализ действий пользователя). Вариантов действительно много.

Машинное обучение на встраиваемых системах

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

Критерии выбора

Классический подход к использованию нейронных сетей обычно основывается на нескольких этапах: сбор и подготовка данных, обучение нейросети, сбор данных на конечной системе в процессе эксплуатации и их анализ на сервере. Для решения поставленной задачи такой подход не годится, поскольку требуется, чтобы все процессы происходили на встраиваемой системе. Это обусловлено несколькими факторами. Во-первых, безопасностью, поскольку информация об активности не должна покидать пределы устройства. Во-вторых, возможностью принимать управляющие решения непосредственно на встраиваемой системе в случае необходимости. В-третьих, необходимостью корректировки поведения нейросети в процессе работы. Из этого следует ещё одно ограничение — в силу (зачастую) ограниченного количества ресурсов встраиваемых систем, выбираемое решение должно быть высокопроизводительным.

В настоящий момент ситуация с машинным обучением на встраиваемых системах в парадигме edge-computing (когда данные обрабатываются не на серверах, а непосредственно на встраиваемых устройствах) в целом весьма грустная. Чаще всего предлагаются закрытые решения для конкретного набора оборудования, что существенно ограничивает их применимость. Кроме того, речь идёт чаще всего только о применении обученной нейросети для анализа данных (инференс) на встраиваемых системах, но не про обучение нейронной сети (это всё равно выносится за пределы этих устройств).

Резюмируя вышесказанное, к фреймворку предъявлялись особые критерии.

Почему именно Interference

Одним из фреймворков, который мог бы функционировать целиком и полностью на встраиваемых системах, без необходимости задействовать дополнительные вычислительные мощности (edge-computing), является кроссплатформенная библиотека с открытым исходным кодом Interference. Библиотека реализует интерференционную модель нейронной сети, которая принципиально отличается от большинства классических моделей нейронных сетей. Структура нейронных сетей в этой модели максимально приближена к структуре биологических нейронных сетей в головном мозге человека. Нейрон в этой модели представляет собой самоорганизующийся объект, а его обучение происходит за счёт перемещения рецепторов под действием нейромедиатора, который выделяется синапсами (как в биологическом нейроне). Сигнал подаётся последовательно, распределённо по времени, при этом количество данных обучения получается значительно меньше по сравнению с классическими моделями (что позволяет экономить память) – необходимо хранить только координаты рецепторов в конечный момент времени и длины их траекторий. Для успешной классификации данных достаточно одного нейрона на один класс. Ещё одной важной особенностью является то, что нейронные сети этой модели можно легко дообучать, без необходимости начинать обучение с нуля.

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

Другим важным аспектом является то, что библиотека написана на чистом C++ без дополнительных зависимостей, что обуславливает скорость работы и простоту ее портирования. В библиотеке реализована система вычислительных бэкендов, которая позволяет переключаться между разными способами производить вычисления, а также реализовывать новые — под специфичные вычислители. К ним на уровне архитектуры могут относиться OpenGL [ES], OpenCL, специализированные DSP и др. Это позволяет переносить вычислительную нагрузку на GPU и другие специализированные устройства.

Что из себя представляет монитор активности

Структура ПК МАП

Программный комплекс состоит из основного сервиса, непосредственно осуществляющего сбор и анализ данных (amon) и утилиты управления (amoncfg). Структура amon представлена на следующей схеме:

На схеме представлены следующие компоненты:

  • модуль управления — осуществляет управление другими модулями и предоставляет интерфейс взаимодействия с сервисом;

  • модуль оповещения — хранит информацию об аномалиях и генерирует оповещения при их появлении;

  • модуль сбора информации — управляет процессом получения и анализа информации;

  • поставщик данных — предоставляет информацию об активности;

  • анализатор данных — выполняет анализ посредством нейронной сети.

Конфигурация

Для начала работы с программным комплексом необходимо наличие конфигурационного файла. Пример конфигурационного файла представлен ниже:

{     "name": "default",     "buffer_size": 1000,     "providers": [         {             "name": "kernel",             "processes": [                 "io-usb",                 "io-hid"             ],             "data": [                 "threads",                 "libs",                 "mem"             ],             "polling_time": 3000,             "structure": "structures/kernel/structure.json",             "anomaly_action": "scripts/action.sh"         }     ] }

     Здесь:

  • buffer_size — размер кольцевого буфера для сообщений об аномалиях.

  • providers — список источников данных активности.

  • name — имя поставщика данных.

  • processes — список процессов, которые необходимо анализировать.

  • data — список типов активности, которые необходимо анализировать.

  • polling_time — интервал опроса.

  • structure — путь к файлу, хранящему структуру нейронной сети. Этот же файл структуры используется для хранения всех данных обучения.

  • anomaly_action — путь к скрипту, который будет автоматически запущен при выявлении аномальной активности.

Сценарий использования

Основой программного комплекса является сервис amon, который осуществляет непосредственно сбор и анализ данных, выявление аномалий, а также уведомление и опциональное автоматическое выполнение действий, заданных пользователем. После успешного запуска сервис создаёт устройство /dev/amon, через который можно осуществлять взаимодействие с ним.

Схематически сценарий использования представлен на картинке:

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

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

Поддерживается большое количество способов  взаимодействия с сервисом amon (через менеджер ресурсов /dev/amon).  Основное взаимодействие осуществляется через утилиту amoncfg. С помощью утилиты cat можно вывести журнал обнаруженных аномалий. Также существует открытое API, которое позволяет разработать собственное клиентское приложение, взаимодействующее с сервисом amon.

Практическое применение

Некоторые примеры использования

Запуск сервиса amon с указанием файла конфигурации:

amon -c /usr/local/conf &

Переход в режим обучения:

amoncfg -L

Переход в режим анализа активности:

amoncfg -R

Вывод статистики по анализу активности:

amoncfg -l

Пример вывода представлен на рисунке:

Здесь отображается список запомненных процессов, текущий режим (обучение или анализ) и количество детектированных аномалий в их работе.

Просмотр сведений об аномалиях:

amoncfg -a

ДатаIDПроцесс    Элемент  Доп. информация 20.01.202312test-iomem  Чрезмерное потребление памяти

Вывод показывает, что некий процесс test-io начал потреблять нестандартно много памяти, о чём amon и сообщил.

Замеры производительности

Тестирование производительности программного комплекса проводилось на разных стендах, здесь опишем результаты со стенда на Intel NUC6i3SYB (архитектура Skylake, 2 ядра, 2.3 ГГц), интервал опроса — 3 секунды.

На рисунке ниже представлена зависимость использования ЦП от количества анализируемых процессов.

Из рисунка видно, что при анализе активности 50 процессов нагрузка на ЦП составляет менее 4% (использовался однопоточный режим).

Спасибо за уделённое время и внимание!

Подробнее узнать о научной составляющей нейросетевой тематики можно здесь:


ссылка на оригинал статьи https://habr.com/ru/company/swd_es/blog/713690/

Подрядчик или сотрудник в штат: что выгоднее для снижения бэклога и TTM?

Меня зовут Кристина Кондакова, я руководитель центра компетенций QlikView компании Fix Price, и в этой статье расскажу, как мы в Fix Price снизили TTM и количество текущих задач за счет привлечения подрядчиков, а затем оценили экономический эффект.

Объем бэклога и TTM (Time To Market) — ключевые показатели для любой крупной компании. Аналитика очереди задач и роста бэклога внедрена у нас давно во всех отделах разработки. Еженедельно аналитическое подразделение формирует объемную рассылку-отчет для руководства. В отчете отражена динамика роста бэклога по отделам/проектам, средние ТТМ задач в очереди и ряд других показателей.

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

Для анализа возьмем достаточно большой период с середины 2020 года по конец 2022. В данный период наблюдался всплеск количества задач, в период динамичных изменений во внешней среде это естественное явление. В результате ответственным подразделениям пришлось ставить больше задач на создание BI-отчетности с целью детального анализа показателей, чтобы помочь компании преодолеть экономическую турбулентность с минимальными потерями. В связи с этим бэклог достиг критических значений, и было принято решение подключить подрядчиков. До этого мы неплохо справлялись собственными силами.

Теперь давайте рассмотрим всё это более наглядно и для начала взглянем на этот график:

График по количеству задач (факт)
График по количеству задач (факт)

Согласно данным, после увольнения ряда сотрудников и увеличения количества задач команда перестала справляться с растущим объемом работы. Мы открыли вакансии и привлекли 2 подрядчиков. Для стабилизации ситуации показателей бэклога потребовался год работ.

Для оценки эффективности мы спрогнозировали рост бэклога без привлечения подрядных организаций. Задачи, закрытые подрядчиками, в этом случае легли бы на плечи команды Fix Price. Давайте взглянем на то, что получилось бы, если бы вся работа велась только силами штатных сотрудников:

График по количеству задач (без подряда)
График по количеству задач (без подряда)

Бэклог бы продолжил расти медленно, но уверенно, приблизившись к концу 2022 года к отметке в 100 текущих задач. Дополнительно стоит взглянуть на показатель TTM. Поэтому посмотрим на ту же картину, но в разрезе TTM:

Заметно, что после привлечения уже первого подрядчика количество задач с серьезной задержкой (отмечены оранжевым и красным) существенно сократилось. А после начала работы со вторым подрядчиком задержки и вовсе были сведены к нулю, то есть все задачи стали выполняться строго по плану.

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

Некоторые допущения:

  1. Ставку наших специалистов мы брали среднюю за последние 9 месяцев по всем специалистам с учетом всех налогов.

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

Вот что у нас получилось:

Анализ показал, что при стоимости подрядчика на 33% выше бэклог снизился на 67%, а средний TTM удалось ускорить на 55%.

С радостью отвечу на вопросы по теме!


ссылка на оригинал статьи https://habr.com/ru/company/fix_price/blog/713856/