Архив за Ноябрь, 2015

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

Воскресенье, Ноябрь 8th, 2015

Use Case (вариант использования, ВИ, Прецедент, юскейс) это один из вариантов записи требований к системе. Дополнительную информацию о них можно узнать из статей:
•    Что такое Use Case и зачем они нужны?
•    Пример требований к системе
•    Байка для оруженосца-5. Использование вариантов использования.
•    Примеры вариантов использования (Usecase)
В отличие от многих других способов записи требований юскейсы обладают двумя приятными особенностями:

•    Существует множество формальных способов проверки реестра юскейсов на полноту.
•    Описан способ, как выделить уровни юскейсов.

Эти особенности позволяют легко создать достаточно полный реестр атомарных задач. Термин «Уровень» был предложен Алистером Коберном. Если очень грубо, то:

  • Юскейс «уровня моря» - это юскейс, при котором время взаимодействия с системой не превышает 20 минут и который, будучи выполнен многократно, приносит пользу. Часто юскейсы этого уровня составляют основу спецификации требований.
  • Юскейс «выше уровня моря» (змей, облако) - более высокоуровневый. Содержит несколько юскейсов уровнем ниже. Часто служит основой для переговоров с заказчиками.
  • «Ниже уровня моря» (рыба, моллюск) - составная часть «уровня моря». Часто используется для описания взаимодействия между системами в рамках одного юскейса уровня моря.

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

Рассмотрим несколько разных проектов.

Проект А.
Маленький проект. Несколько недель (месяцев) для одного программиста.
Спецификация требований на основе ВИ на него можно найти по ссылке: «Пример требований к системе»
Примечание. Сегодня я бы написал документ по-другому, но и такой вариант довольно сильно облегчит жизнь программисту.

Это несколько недель для одного программиста. Сколько именно, зависит от платформы.
1.    Java / C# + MSSQL – 6-12 недель
2.    Дельфи + SQLite – раза в два меньше
3.    FileMaker / MS Access / FoxPro / Clipper / Paradox – 3-10 дней

Если мы выбираем в качестве платформы C# + MSSQL, то для этого проекта удобно использовать юскейсы «уровня моря» в качестве уровня атомарной задачи. Реестр задач по этому проекту мог бы выглядеть следующим образом:

  • Работа с «Партнерами» - (юскейс над уровнем моря)
    • Создание необходимых структур в БД - (не юскейс)
    • Просмотр списка партнеров - (юскейс уровня моря)
    • Создание «Партнера» - (юскейс уровня моря)
    • Просмотр «Партнера» - (юскейс уровня моря)
    • Изменение «Партнера» - (юскейс уровня моря)
    • Удаление «Партнера» - (юскейс уровня моря)

Программисты на платформе C# + MSSQL, с которыми мы общались, утверждали, что делают в неделю 2-10 юскейсов вида «Просмотр, создание, изменение». То, что надо. Проводить дальнейшую декомпозицию нужно в очень редких случаях.

Примечание. При программировании на Paradox «Уровень моря» становится слишком мелок. Впрочем, с Paradox весь проект становится совсем крошечным, и для него формальный реестр задач необязателен.

Проект Б. Проект среднего размера. Несколько человеколет (десятков человеколет).
Создание интернет-магазина для крупной розничной сети.
Руководство уделяет пристальное внимание дизайну страниц, и поэтому создание макета, дизайн, верстку и программирование выполняют разные люди. Кроме того, в ходе выполнения одного единственного юскейса уровня моря может понадобиться несколько страниц. Нужен уровень помельче.
Реестр задач:

  • Работа с Заказом
    • Просмотр заказа
      • Макет
      • Дизайн
      • Верстка
      • Программирование
    • Оформление заказа для авторизованного покупателя
    • Оформление заказа для неавторизованного покупателя
      • Страница «Вход»
        • Макет (не менее 6)
        • Дизайн макета 2
        • Дизайн макета 4
        • Дизайн макета 5
        • Верстка утвержденного макета
        • Программирование
      • Страница 2
      • Страница 3
      • Последняя страница
        • Макет
        • Передача заказа в программу логистики (юскейс)
        • Расчет бонусов (юскейс)

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

Измерение трудоемкости атомарной задачи

Суббота, Ноябрь 7th, 2015

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

aiciaay-ooa-ioaiee-odhoaiaieinoe.png
Как ее разбить?

А зачем нам оценивать трудоемкость, если мы можем ее измерить на основании исторических данных? Возьмем для примера работу верстальщика за предыдущие периоды, сгруппированнуе по 4 недели. Предположим, мы получили следующую статистику:

  • 1-й период - 37 страниц
  • 2-й - 46
  • 3-й - 42
  • 4-й - 30
  • 5-й - 51

Это означает, что:

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

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

Несколько тонких моментов.

  1. Трудоемкость надо считать как N задач в M дней (800 задач в 400 дней), а не одна задача в среднем 2 часа. Ваш сотрудник ходит на совещания, читает почту, вынужден писать вам отчеты и т.д. Но это совершенно не важно. Заказчика волнует «Когда закончится проект?».
  2. Список сделанных атомарных задач является отличным отчетом. Другой отчет для контроля за работой сотрудника не нужен. Бонус: «Хотите поднять производительность сотрудника на 5-10%? Отмените таймшиты. Используйте реестр задач как отчет.»
  3. Обязательно возникнет вопрос: «Да, но есть страницы, которые верстались по неделе и более. Их надо разбить!». Нет, не надо. Пока отклонение в трехсигмовом пределе, не надо насиловать процесс. Будет только хуже. Смотри главы 4, 5, 6 книги «Пространство доктора Деминга».
  4. Пожалуй, самое главное. Вычисление уровня и создание реестра атомарных задач обязательно – обязательно! – должны предшествовать попыткам управлять задачами по «приоритетам», «дедлайнам» и т.д. Практически все пытаются сделать наоборот, что приводит к дичайшему хаосу в управлении. Вернее, к отсутствию управления.

Оценка трудоемкости атомарной задачи

Суббота, Ноябрь 7th, 2015

Дисклеймер

Для понимания статьи крайне желательно знание современных теорий управления. В первую очередь теории ограничений Голдратта.

Я могу быть не прав. Если эксперименты покажут, что я не прав, я это приму.
Проблематика

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

Требования:

  • Оценка трудоемкости должна приносить пользу. Т.е. улучшать производственный поток.
  • Оценка трудоемкости не должна приносить вреда. Или вред должен быть меньше, чем польза.
  • Оценка трудоемкости должна быть возможной. Если погрешность оценки более 100%, то, может быть, не стоит и давать оценку?

Если вы с этим не согласны, то далее статью можно не читать.

Рисуем фон

Как можно использовать оценку трудоемкости? Или «Какую пользу это принесет?» Будем исходить из того, что наш заказчик умеет считать деньги.

Оценка трудоемкости должна приносить пользу

Для внешнего заказчика важны сроки и цена. Трудоемкость не имеет значения. Нормальный заказчик, заказывая в интернет-магазине стиральную машинку, не спрашивает, сколько часов было потрачено на ее изготовление. Его интересует «когда привезете?» и «сколько стоит?». Но при разработке софта на заказчиков иногда находит помутнение. Рассмотрим два варианта:

  1. срок поставки – неделя, трудоемкость один час, выставленная цена - $10000
  2. срок поставки – две недели, трудоемкость пятьсот часов, выставленная цена - $50000

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

Для внешнего заказчика польза от оценки трудоемкости нулевая.

Для внутреннего заказчика ценность также нулевая. В разработке ПО (как и в любом другом бизнесе) есть только два варианта с размещением ограничения системы. Ограничение системы может быть или внутри производства, или вне. Если вне, то бизнес не беспокоит, какова трудоемкость атомарной задачи - полчаса или два дня. Но может беспокоить, будет ли выведен хотфикс через час или через неделю. Сроки важнее. Для фичи иногда ситуация другая. Там может быть расчет по ROI . Если же ограничение внутри производства, срок выхода задачи в релиз определяется исключительно местом в очереди задач. Совершенно не важно, какая трудоемкость: полчаса или день. Если впереди сотня других задач, то срок выпуска – ориентировочно полгода. По имеющимся у меня статистическим данным, снятым с нескольких фирм: «Эффективность жизненного цикла атомарной задачи, при условии нахождения ограничения внутри разработки ПО, составляет порядка 1%. Это означает, что атомарная задача трудоемкостью в один день будет сделана в среднем через 100 рабочих дней. Но календарное время выпуска можно менять, изменяя очередность в очереди задач». Смотри «Историю одной доски» от Макса Дорофеева.

Польза от оценки трудоемкости нулевая.

Оценка трудоемкости не должна приносить вреда

Сам факт наличия оценки трудоемкости приводит к уменьшению производительности программиста. Исследования Лоуренса и Джеффи от 1985 года (Jeffry, D.R. and M) показали, что производительность падает в полтора – два раза. Смотри книгу «Peopleware». Теоретические выкладки Голдратта в книге «Критическая цепь» это подтверждают. Теоретический расчет Голдратта соответствует  полученным экспериментальным результатам.

Оценка трудоемкости приносит вред.
Оценка трудоемкости должна быть возможной

Несколько лет назад я проводил эксперимент по разбросу трудоемкости типовой атомарной задачи сам. Не «rocket science». Обычной стандартной задачи. Такие задачи программисты решают сотнями. И да, я не предупреждал участников, что я измеряю. Смотри «двойная слепая выборка».

Результат удивил даже меня. Фактический результат показал, что в зависимости от того:

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

фактическая трудоемкость отличается. Примерно в пятнадцать раз. На одну и ту же стандартную задачу программист может потратить 15 минут. А может полдня. А может час. Фактической трудоемкости. Без учета перекуров и прерываний. Фактической трудоемкости! С прерываниями разница может быть и большей. Т.е. общая причина вариации (термин Шухарта) делает невозможной оценку трудоемкости атомарной задачи.

Примечание. Справедливости ради надо упомянуть еще об особой причине вариаций оценки трудоемкости. Смотри исследование «Ошибка планирования» от 1994 года. Но особую ошибку хотя бы компенсировать можно. А вот попытка компенсации общей причины приводит только к ухудшению ситуации. Смотри пятую главу книги «Пространство доктора Деминга» Генри Нива.

Итог
Оценка трудоемкости атомарной задачи:

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

Вы можете поставить под сомнение результаты экспериментов. Это нормально. Поставьте свои.

И что делать?

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

Понятие атомарной задачи, часть 2

Понедельник, Ноябрь 2nd, 2015

Рекомендуемые правила для атомарной задачи

1. У атомарной задачи не может быть более одного исполнителя.

2. Атомарная задача должна вносить изменения не более чем в одну программную систему.

3. Длительность атомарной задачи – не более двух дней.

Одна задача – один исполнитель.

Нам нужно реализовать страницу «один клик» в рамках разрабатываемого сайта. Задача разбивается на подзадачи:

а) Концепт (дизайн, прототип) интерфейса. Исполнитель - проектировщик интерфейса.
б) Отрисовка интерфейса. Исполнитель – дизайнер (художник/оформитель).
в) Верстка. Исполнитель - верстальщик.
г) Программирование - программист.

Зачем это надо? Предположим, фиксируются только “фичи”. Напрмер, “Один клик”. Руководитель проекта уехал в отпуск в Гималаи, где нет сотовой связи. Верстальщик живет в Минске и заболел ангиной. Кто из отдела в 30 человек программистов отвечает за программирование конкретно этой страницы, в реестре не указано, а отдел программирования частью расположен в Москве, частью в Твери и частью еще в 6 городах. И интернет-магазин - не единственная задача, которой они занимаются. А оформитель ушла в декрет и из 70 висевших на ней задач передала не все. И передала их четырем другим оформителям. Внимание, вопрос. Как заказчику оперативно узнать, выйдет ли «один клик» в двенадцатом релизе? Поэтому: одна атомарная задача - не более одного исполнителя. Именно так она должна быть внесена в реестр задач. “Один клик” декомпозировать и декомпозировать.

Одна задача – одна система

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

Приведу конкретный пример. Пусть внешний заказчик заказал нам три фичи «А», «Б», «В». Заказчик умный и платит не за трудоемкость, а за свой профит. Цены:

•    «А» - $100k,
•    «Б» - $20k,
•    «В» - $10k.

Трудоемкость у них примерно одинаковая, и в нашем продукте «К» мы делаем по одной фиче в релиз. С точки зрения ROI выгодно запустить сначала вичу «А». Но для фичи «А» нужно еще в другом продукте «Л», который разрабатывает другая команда, кое-что подкрутить. Обе команды выпускают релиз раз в месяц.

Мы сейчас планируем сентябрьский релиз, а команда продукта «Л» запланировала работы по фиче «А» на ноябрьский релиз.
Оптимальным при этом будет сделать в сентябре фичу «Б», а «А» запланировать на ноябрь.

Но, не выполнив декомпозицию до «одна задача – не более одной системы», будет сложно «на лету» делать такое планирование. И на моей практике отсутствие такой декомпозиции  достаточно серьезно выбивало проект из сроков.
Атомарная задача – не более двух дней.

Эту идею я изначально нашел в статье Джоэла Спольски «Планирование программного обеспечения малой кровью», и впоследствии находил ей множество подтверждений. Человеку проще оперировать задачами, размер которых измеряется в часах. Проще держать в голове ее целиком. При оценке 2 – 16 часов ошибка оценки предположительно минимальна. Статья-гипотеза «Реальная оценка, или почему наступают дедлайны?» Кроме того, если атомарные задачи по факту окажутся в среднем четырехдневными, то вы успеете оперативно скорректировать планы. Таким образом, очень удобно отслеживать прогресс работ по фиче. При условии, что в среднем в один день верстается одна-две страницы, то после того, как вы составили реестр всех страниц – вы получили управляемый процесс верстки. Одна страница и будет для верстальщика одной атомарной задачей.

Через фичи удобно вести управление требованиями. Без реестра атомарных задач невозможно нормальное управление разработкой ПО. Впрочем, вы можете не захотеть управлять.

«Меняться необязательно. Выживание – дело добровольное» © Э. Деминг

Понятие атомарной задачи, часть 1

Понедельник, Ноябрь 2nd, 2015

Дисклеймер

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

Я не могу дать все определения в одной статье. Голдратт для определения понятия «Критическая цепь» написал книгу. Генри Нив для определения понятия «Операционные определения» и для описания их важности написал главу книги.

Также я не уверен, что одних статей достаточно. Возможно, нужны тренинги.

В любом случае ждите другие статьи.

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

Аудитория статьи – в первую очередь операционный менеджмент.

Проблематика

От менеджеров часто приходится слышать:

  • А почему так дорого?
  • А почему так долго?
  • А почему, если фактическая трудоемкость всего 60 часов, выпустили только через три месяца? Другая команда в другом продукте должна была внести изменения и внесла только сейчас? Почему я узнаю об этом только сейчас?

И, конечно же, одно из самых популярных: «У нас ни один проект не завершается в расчетный срок. Планировать не умеете?»

Некоторые операционные определения и ограничения статьи

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

На текущий момент практически стандартом де-факто стали следующие положения:

  • Есть два типа задач. Разработка новой функциональности и исправление ошибок.
  • Обобщающий термин - запрос на изменение (ЗНИ).

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

1.    Найти товар.
2.    Просмотреть свойства товара.
3.    Купить.

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

Фичи это то, по поводу чего удобно договариваться с заказчиком. В одном случае вы услышите: «Какая корзина? У нас розничная торговля холодильниками. Не покупают люди пять холодильников сразу. Сначала делайте один клик. Через полгода, может быть, вернемся к идее корзины». Может быть и обратная картина: «Мы книгами торгуем. Не будет человек одну книгу за 200 рублей заказывать при стоимости доставки заказа в 300 рублей. Сначала корзина».

Декомпозиция и суперпозиция фич отдельная большая тема, а пока вернемся к атомарной задаче. Возьмем фичу «купить в один клик». В среднем и большом бизнесе (оборот сети магазинов - сотни миллионов долларов и выше) этот самый бизнес обслуживают десятки и сотни систем, взаимодействующих друг с другом. Если брать «М-Видео», то у них очень значимый сегмент (более 10%) - торговля через интернет. Но такие фичи интернет-магазина, как, например, программа «постоянный покупатель» (накопление и трата бонусов) должна быть общей и для онлайна и для оффлайна. Скорее всего, это не часть интернет-магазина и не часть оффлайн -магазина, а отдельный программный продукт. Фича «один клик» может потребовать внесения в несколько систем, работы множества программистов (в том числе из разных команд, а иногда и из разных фирм), а также верстальщика, оформителя и т.д. И трудозатраты на нее получаются немалые. Заказчика интересует прогресс и прогнозируемая дата выпуска. И одной большой задачи для координации множества людей, тем более из разных отделов и/или фирм, оказывается недостаточно.

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

  • Оценить трудоемкость исполнения фичи и проекта в целом. Главное – проекта в целом.
  • Оценить календарное время исполнения фичи и проекта в целом.
  • Перевести разработку ПО в статистически управляемое состояние.
  • Сократить время проекта за счет работы по «Критической цепи».

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

В моей практике есть примеры:

  • Введение реестра атомарных задач позволяло рассчитать время проекта с точностью до 5-10%. Неплохо?
  • Введение реестра атомарных задач позволяло сократить время проекта.
  • Введение реестра атомарных задач позволяло уменьшить напряженность в отношениях заказчик – исполнитель.