А вы знаете на что уходит ваше рабочее время?
Не знаешь что сказать на ежегодном перфоманс ревью?
Нужно подготовиться к ежемесячному one to one, но не помнишь чем занимался?
Нужно провести ретроспективу по задаче?
Не знаешь почему задача заняла так много времени?
Забыл что делал вчера, 1 день назад, 2,3?
Интересуешься самоорганизацией?
Возможно этот инструмент для тебя.

Привет! Меня зовут Игорь, я занимаюсь разработкой на Unity c 2018 года.
В статье рассказываю о личном подходе к самоанализу, инструменте для оценки распределения трудозатрат и поиске точек роста. В конце статьи бонус: как выглядит 1 рабочий день из жизни техлида.
Что в статье:
Вступление
Дисклеймер.
Я не я, хата не моя.
Это моё личное мнение и подход к работе, он может отличаться от вашего.
Я не говорю о том что это истина и так нужно делать всем.
Делюсь своим опытом и видением.
Мой рабочий день может состоять из различных типов задач: краткосрочное и долгосрочное планирование, синки, консультации, менторство, one to one, ревью кода и написание кода, мониторинг продовской инфраструктуры, релизы и др. Даже с учётом распланированного дня возникают вопросы и задачи, которые необходимо решать по мере поступления.
В определённый момент времени я решил оценить на что расходуется рабочее время, определить много это или мало. Хотелось понять что в работе я делаю лишнего, от чего мог бы избавиться (например, больше делегировать, чем выполнять самому). Ну и с такими вопросами на ощущениях далеко не уедешь, нужны данные и цифры. Так появились мысли о ведении журнала выполняемых задач, а точнее журнала выполняемых действий.
Какие вопросы интересовали:
какая активность совершалась (название)
описание активности (заметки что выполнялось, обсуждалось, о чём договорились)
количество затраченного времени
люди, которые участвовали в активности.
Для сбора данных выбор пал на обычные гугл таблицы. Для анализа структура таблицы была определена следующей:
Data - дата выполнения активности
Time - время начала выполнения активности
Duration - длительность активности
Type - тип активности (ревью, написание кода, перерывы, релиз менеджмент и др.)
Participants - участники активности (с кем контактировал в этот момент)
Action - название активности (название задачи, тема разговора и т.д.)
Description - описание активности (чем конкретно занимался)
Позднее добавились фильтры и ещё несколько полей, которые будут описаны подробнее в разделе "Как начать использовать". Вот что получилось:

Инструмент оказался удобным и позднее начал использоваться не только для анализа личных затрат времени, но и для проведения ретроспектив, анализа задач и поиска точек роста. К выше перечисленным полям добавились фильтры, формулы автоматизации расчёта, группировки по версиям.
Техническая часть. Как использовать.
Раздел про детали работы с конкретным шаблон составленной таблицы и рекомендациями по использованию. Можно пропустить и перейти к следующему разделу, если интересует только общая информация.
Ссылка на шаблонный Google Sheets документ (Тык).
P.S. Документ доступен как шаблон в режиме только для чтения. Копируйте себе на google drive, чтобы поэкспериментировать (
Файл→Создать копию).
В шаблоне приведены 3 страницы таблиц.
Journal - основная страница с журналом активностей
Diagrams - несколько примеров диаграмм
People - массив участников для выпадающего списка страницы Journal
Для эффективной работы используйте преимущества гугл таблиц: фильтры, шорткаты, формулы. Без этого заполнение превратиться в рутину и будет занимать очень много времени.
Шорткаты: Ctrl+Shift+; - вставить текущее время, Ctrl+; - вставить текущую дату, Shift+Alt - сгруппировать/разгруппировать строку/столбец и др.
Формулы заполнения: Колонка Duration заполняется автоматически за счёт ARRAYFORMULA вверху столбца. Продолжительность рассчитывается как разница времени начала следующего события и текущего события. Для расчёта вручную заполняется только колонка Time (помним про шорткаты).
Фильтры: Фильтры по ключевым столбцам позволят выбирать один конкретный Action, тип задач, человека, дату, версию и т.д. Ниже будет описано как с помощью фильтров можно фильтровать данные на диаграммах.
Подсветка ячеек по условию: Например, для колонки Date включается красная подсветка, если введён не тип Дата.
Группировка: сворачивайте старые строки в группы, например, по дням/неделям/версиям. Это будет экономить визуальное пространство. Для удобства можно располагать текущий день в самом верху таблицы, чтобы все старые дни съезжали вниз.
Выпадающие списки: Используйте простые списки и списки из диапазона (Например список людей для колонки Input Participants берётся с листа People).
Скрипты расширений (Расширения→Apps Scripts): Чтобы выбирать несколько участников добавлен скрипт использующий колонку Input Participants как источник ввода для колонки Participants.
В колонку
Input Participantsвводиться участник, скрипт переносит значение в колонку Х. Повторный ввод участника в колонкуInput Participantsудаляет его из колонки Х.Дефолтная реализация множественного выбора не удовлетворяла желаниям.
P.S. Внутри скрипта используются константы на имена страниц, номера колонок (изменение или сдвиги потребуют внести изменения в классы
ColumnsиSettings).
P.S. Скрипт клонируется автоматически при копировании GoogleSheet документа.
Исходный код скрипта
class Columns { static get InputParticipants() { return 6; } static get Participants() { return 7; } } class Settings { static get LimitRow(){ return 4; } static get TargetSheetNames(){ return ["Journal", "<Other sheet list name>"]; } } function onEdit(e) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var activeSheet = ss.getActiveSheet(); var activeSheetName = activeSheet.getName(); var isTargetSheet = Settings.TargetSheetNames.indexOf(activeSheetName) != -1; if (!isTargetSheet) { return; } var activeCell = ss.getActiveCell(); var activeCellRow = activeCell.getRow(); if (activeCellRow < Settings.LimitRow) { return; } var activeCellColumn = activeCell.getColumn(); if (activeCellColumn != Columns.InputParticipants) { return; } var separator = '\n'; var targetSetValueCell = activeSheet.getRange(activeCellRow, Columns.Participants); applyMultiplyDropDownList(e.value, targetSetValueCell, separator); activeCell.setValue(""); } function applyMultiplyDropDownList(newValue, targetSetValueCell, separator) { var oldValue = targetSetValueCell.getValue(); if (newValue) { var toApplyValue = ""; if (!oldValue) { toApplyValue = newValue; } else { var oldDropDownElements = oldValue.split(separator); var existsingNewValueElementIndex = oldDropDownElements.indexOf(newValue); var isNewValueExist = existsingNewValueElementIndex != -1; if (isNewValueExist) { oldDropDownElements.splice(existsingNewValueElementIndex, 1); } else { oldDropDownElements.push(newValue); } toApplyValue = oldDropDownElements.join(separator); } targetSetValueCell.setValue(toApplyValue); } }
Визуализация данных: Используйте диаграммы для анализа данных (см. лист Diagrams).
С помощью фильтров и группировки можно отображать на диаграмме только интересующие события. Для этого переключайте опцию "Включить скрытые или отфильтрованные данные" в настройках диаграммы.

Зачем это всё?
Этот инструмент позволяет ответить на различные вопросы, главное уметь их правильно задавать. Например:
В команду приходит новый человек, ты занимаешься его онбордингом.
Сколько времени это занимает?
Это время откуда-то отрезается, откуда(если возможно определить)?
Много или мало занимает времени, страдают ли от этого долгосрочные планы?
Сколько таких новых сотрудников ты можешь позволить себе одновременно?
В спринте получил распределение затраченного времени по категориям: ревью кода - 35%, помощь консультация - 30%, холивар - 20%. Итого получаем 85% времени. Остаётся 15% времени на другую свою работу.
Не малова-то ли?
Не пора ли делегировать часть задач?
В спринте получил распределение затраченного личного времени по людям: Петя - 20%, Вася - 13%, Коля - 43%, Алёша - 10%.
Что-то у Коли многовато времени, почему?
Он делал сложную задачу?
Ему требовалась постоянное сопровождение по задачам?
Не нужно ли помочь ему развивать качество автономности/самостоятельности?
Прикручиваем к анализу нормативы рабочего времени.
Перерабатываешь?
Почему?
Из-за каких задач?
В какой момент что-то пошло не так?
Что нужно было сделать, чтобы предотвратить?
Провалили сроки по фиче (нужно провести ретроспективу).
Что пошло не так?
Что было готово в контрольных точках?
Это ошибка планирования или форс-мажор?
Почему вовремя не приняли меры?
В какой момент нужно было забить тревогу?
Из минусов: начинаешь отслеживать сколько времени занимает отслеживание всего времени.

Один рабочий день из жизни техлида

Вот пример как выглядит один реальный рабочий день с фиксированием действий в журнале активностей.
Частое переключение контекста.
Отсюда возникают ситуации, когда лиды резервируют себе слоты времени и просят, чтобы их никто не беспокоил.
Отсюда возникают просьбы "пишете в чат, если ваша проблема не требует срочного ответа, не нужно просто так отвлекать".
Отсюда возникают проблемы, если лиды на себя берут спринтовые задачи. Правило "Тренеры не играют".
Отсюда возникает ожидание к начинающим разработчикам "Сначала подумай, погугли, найди варианты решений, а уже потом приходи с вопросами к опытным разработчикам".
Шутки про "сделаю за 4 часа в течение недели" (не шутки).
Ну и так далее...
Вывод
Инструмент свою задачу выполняет хорошо, но требует серьёзной дисциплины в заполнении. При использовании не стоит уходить в крайности и фиксировать мельчайшие события. Инструмент должен приносить пользу, а не создавать головную боль.
Помним, что Activity Journal это не про планирование. Планирование осуществляется до начала выполнения задач. Activity Journal - это события, которые завершились, используемые только для анализа и дальнейших корректировок действий.
Журнал очень помог вначале карьеры техлида, особенно в управлении людьми. Рекомендую.
Потенциально интересные заметки
В общей сумме заполнение журнала занимает 8-15 минут в день, всё зависит от степени детализации (помним что не нужно уходить в крайности).
Много ли это? Ну звучит как дофига. 15 минут в день - 1,25 часа в неделю - 5.5 часа в месяц, почти рабочий день... Но задумайтесь, а дадут ли вам эти 15 минут в день (несколько секунд между задачами) какой-то пользы? Сомневаюсь... Вместо этого вы получаете ценный инструмент самоанализа (если конечно же потом делать этот анализ). А если посмотреть сколько в день тратиться времени на перекуры, чай/кофе, болтовня с коллегами по нерабочим задачам, то эти 15 минут становятся не такой уж большой тратой.Знаю некоторые команды, которые интегрировали похожий инструмент как обязательный в работе команды.
В таких командах налажен процесс ежемесячных one to one. Инструмент используют для подготовки и обсуждения успехов, ошибок, достижений на one to one. С помощью инструмента анализируют рост сотрудника как специалиста, принимают решения о достижении следующего грейда.
Но помним, что если такой инструмент используется для отчётности, то люди начинают "приписывать" себе.Спустя время стал использовать инструмент не только как личный журнал, но и для отметок положительных/негативных фактах о команде.
Пример фактов: "Забыл заказать локализацию, пришлось двигать релиз", "Ответственный. Несколько дней подряд заде��живался допоздна", "Вводил инновацию Х".
Сильно бустануло предоставление обратной связи по работе человека. Даёшь обратную связь без воды, на конкретных примерах.
Занимаюсь ведением подобного журнала около 2 лет. Даже спустя большое кол-во времени получается восстановить контекст чем занимался тогда, какие задачи решал и какие проблемы были.
Редко приходится так далеко заглядывать, но бывает. Вот некоторые примеры:
-- Посмотреть достижения за год.
-- Сравнить распределение рабочего времени по категориям между месяцами.
-- Подготовиться к предоставлению обратной связи для человека.В одно время я написал код, который преобразует записи в диаграмму в виде дерева. Но она получилась настолько объёмной, что читать или анализировать было весьма затруднительно.
Изначально хотел использовать инструмент пару спринтовых версий, максимум пару месяцев. Но втянулся :-)
Если вы тоже анализируете своё рабочее время, то делитесь в комментариях, как и с помощью чего. Интересно почитать.
