- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF131:TaskJuggler
Материал из Linuxformat.
- TaskJuggler Не нанимайте менеджера проекта – инсталлируйте его!
Содержание |
TaskJuggler: Рулим проектами
- Управление вещами гениальными и красивыми, проектами большими и маленькими упрощает TaskJuggler. Шашанк Шарма все разъяснит. А для заинтересовавшихся напоминаем: мы уже писали о TaskJuggler в LXF125.
Остановитесь на минутку и обратите внимание на движущихся вокруг вас людей. Одни куда-то собираются, другие откуда-то приезжают. И все это время они работают над проектом. Осознаете вы это или нет, но многое из того, что вы делаете каждый день, можно классифицировать именно так. И поскольку основную часть любого проекта составляют люди, вам не обойтись без эффективного средства управления проектами, которое помогало бы отслеживать людей и отдельные задачи, составляющие проект.
TaskJuggler – комплексное решение по управлению проектами, и вы можете использовать его от этапа планирования до завершения проекта. TaskJuggler умеет создавать всесторонние отчеты и упрощает управление задачами, затратами и ресурсами. Вы можете отслеживать достижения каждой из групп, работающих над проектом, и тут же определять, куда нужно направить побольше сотрудников, чтобы уложиться в плановые сроки.
Случайное свидание
TaskJuggler содержится в репозиториях большинства дистрибутивов, и вы, скорее всего, получите его командой
sudo apt-get install taskjuggler/
или
su -c yum install taskjuggler
Но тут есть подвох. Во-первых, TaskJuggler – это приложение KDE, а во-вторых, он разработан и испытан в первую очередь для OpenSUSE. Впрочем, особо не беспокойтесь: он работает безупречно и на других дистрибутивах.
Кроме того, версия 2.4.1, предлагаемая через репозитории для Jaunty, имеет большой недостаток. Она не работает, если вы находитесь в часовом поясе .30. Уязвимость касается TaskJuggler в целом, а не какой-то его конкретной функции, так что вы не можете использовать TaskJuggler 2.4.1 на .30 часовом поясе. Итак, если вы находитесь в часовом поясе +2,30 или +5,30, или аналогичном, лучше взять версию 2.4.2 или 2.4.3, последнюю.
TaskJuggler запускается из командной строки, но мы сфокусируемся на графической оболочке. Плюс, в терминале не видны графика и все красивые HTML-отчеты, требуемые каждому инструменту управления проектами, так что интерфейс вам в помощь.
TaskJuggler предлагает множество встроенных ключевых слов (называемых свойствами – properties), которые можно применять для определения различных элементов вашего проекта. Например, свойством currency можно определить, будут ли расходы, описанные в проекте, указаны в долларах США, евро, или другой валюте, а свойством project — имя и ID вашего проекта; ну, и прочее.
Основная часть окна TaskJuggler, используемая для ввода всех сведений о проекте, называется редактором. На левой панели много объектов, таких как задачи (tasks), ресурсы (resources) и счета (accounts). Это удобно, если вам нужен быстрый доступ к конкретному разделу файла проекта.
Мы начнем эту статью с объяснения, как определить в TaskJuggler проект и все его тонкости, а затем покажем, как создавать графики, отчеты и т. д. и отслеживать выполнение вашего проекта.
Проект: начало
Обратитесь к руководству TaskJuggler и ознакомьтесь со всеми доступными свойствами.
Чтобы начать новый проект, запустите TaskJuggler из меню Office [Офис] и выберите File > New [Файл > Создать]. Вам предоставят возможность начать пустой, простой или крупный проект. Если вы решите остановиться на пустом, придется вводить все вручную, а выбрав простой или большой, вы получите для своего проекта шаблон. Первым шагом является определение вашего проекта, подобное этому:
project carpimp “Pimping Cars” “1.0” 2009-08-20 2009-09-20 { timeformat “%Y-%m-%d” currency “EUR”
Это задает TaskJuggler имя вашего проекта, его ID, номер версии и даты начала и окончания. Свойства currency и timeformat говорят сами за себя. Вы можете использовать различные значения для различных проектов согласно вашим потребностям.
Еще одно полезное свойство – /scenario. Обычно определяется два сценария: план пошаговой декомпозиции проекта и план компенсации задержек.
scenario plan “Plan” { scenario delayed “Delayed”
Здесь сценарий Delayed наследует все значения из сценария Plan, благодаря вложенной структуре. Это помогает отслеживать задержки в реализации проекта, если некоторые задачи не завершились за отведенное время. По мере развития нашего проекта все станет понятнее.
В качестве примера, на протяжении остальной части этой статьи, нашим учебным проектом будет тюнинг автомобиля. Да-с!
Определим ресурсы
Мы вернемся к задачам, которые составляют наш проект, через какое-то время, но сначала определим наши ресурсы. Все задачи используют их для достижения своих целей. Нашими ресурсами являются рабочие, потому что самим вам накладки на диски не смонтировать, если, конечно, вы не любитель крутить гайки.
resource elec “Electronics” { resource elec1 “Mac Jordan Jr.” resource elec2 “Mac Jordan” { rate 500.0 } } resource body “Body Work” { resource body1 “Jeff Hoorah” { vacation 2009-09-05 - 2009-09-07 workinghours { wed 11:00 - 16:00 } }
Мы только что определили две группы ресурсов, Electronics [Электроника] и Body Work [Кузовные работы]. При использовании любого из встроенных свойств необходимо указать для него имя и уникальный идентификатор. Для каждой команды мы определили рабочих и все их параметры. Например, свойство ‘rate’ [тариф] определяет расценки Maка Джордана, который поднаторел в электронике и, стало быть, вправе претендовать на более высокую заработную плату, чем другие люди, работающие над проектом. Каждый из ресурсов может иметь собственные исключения из различных определенных на глобальном уровне свойств. Скажем, в примере выше, Body 1 (Джефф Ура) работает только в течение пяти часов, с 11:00–16:00, независимо от глобально определенного рабочего дня.
Использование макросов
Макросы используются в TaskJuggler, когда нужно повторить определенный текст много раз за проект. Например, если требуется распределить рабочих на разные задачи, вместо того, чтобы прописывать их на каждую, можно создать глобальный макрос и ссылаться в задачах на него.
В общем, если вы создадите макрос EXPAND, и затем сошлетесь на него через ${EXPAND}, он раскроется в текст. Таким образом, при распределении ресурсов на разные задания можно создать следую щий макрос:
macro allocate_elec [ allocate elec1 { rate 500.0 } allocate elec2 ]
и сделать на него ссылку в задаче ${allocate_elec}.
Расходы и доходы
Немного математики, ребята. Ваш доход складывается из выплат вам, надеюсь, довольными вами клиентами, за вычетом расходов.
Употребление только что определенных нами ресурсов стоит денег. Добавим к ним стоимость всех примочек для оснастки автомобиля. Все это представляет собой расходы.
account eqp “Equipment” cost account inc “Income” revenue
Свойство ‘account’ включает три значения: ID, имя и тип. Тип может быть тратой (cost) или доходом (revenue). Для анализа затрат, TaskJuggler вычитает сумму всех расходов из суммы всех доходов.
Таким образом, если у вас есть другой счет, «Pics», на который поступают доходы от продажи фотографий ваших тюнингованных автомобилей, прибыль будет рассчитываться как (Income + Pics) – (Equipment).
Итак, мы определили наши два счета. Главным шагом является назначение на них задач, с тем чтобы TaskJuggler отличал доходы от расходов. Мы остановимся на этом чуть ниже.
Ваш проект, несомненно, включает множество задач. Смена покрышек, кузовные работы, покраска, установка супер-крутой музыкальной системы и т. д. – только некоторые задачи, входящие в тюнинг автомобиля.
task carp “Pimping Cars” { task pj “Paint Job” { depends !bb } task wire “Electrical Wires” { length 1d } task music “Music System” { depends !wire } task bb “Bumper & Body work” { task roof “Sun Roof” { } } }
Для завершения этого проекта, мы должны предпринять несколько действий, каждое из которых описывается как задача. Некоторые из таких задач не могут начаться, пока не завершатся другие: например, Paint Job [Покраска] выполняется после кузовных работ. Здесь пригодится свойство depends.
Свойство length [продолжительность] определяет количество времени, отведенного на выполнение каждой задачи. Будучи определено в днях, length означает рабочие, а не календарные дни. То есть 1d означает 1 рабочий день, а не полные 24 часа. Вы можете определить продолжительность рабочего дня в вашем проекте как
Если вы не задали оплату на глобальном уровне, придется устанавливать ставки для каждого работника.
dailyworkinghours 8 weekstartsmonday workinghours mon -fri 8:00 – 12:00, 13:00 – 17:00 workinghours sat, sun off
Как видно из этого фрагмента, задачи могут быть вложенными. Это важно: не зная правильной структуры, сослаться на задачу нельзя. В нашем случае мы используем !bb как синоним для «Bumper & Body work» [«Бампер и кузовные работы»]. ! означает переход к родительской задаче. Так, !bb при использовании в задаче «Paint Job» сперва поднимается к «Pimping Cars» (родительская задача – «Тачка на прокачку»), где мы находим «Bumper & Body work». Без ! мы не можем сослаться на задачи вне текущей.
Для ясности представьте себе холодильник в кухне вашей квартиры. Если вы сидите в спальне и вдруг захотели выпить стакан сока, до холодильника вам не дотянуться. Вы сначала выйдете на кухню, а затем получите доступ к холодильнику.
Символ . аналогично используется для ссылки на подзадачи. Таким образом, чтобы вызвать задачу ‘Sun Roof’ [«Откидная крыша»], вам придется использовать bb.roof. Если вы когда-либо писали объектно-ориентированный код (скажем, на C++), смысл должен быть вам понятен.
Однако вы не сможете рассчитывать, что работа будет выполнена, если к ней не приставлен рабочий. Чтобы назначить работников, или ресурсы, как их называет TaskJugger, воспользуемся свойством allocate.
task wire “Electrical Wires” { allocate elec length 1d }
Разделенный запятыми список работников может быть использован со свойством allocate для назначения на задачу нескольких ресурсов.
Тщательность в деталях
TaskJuggler ожидает, что прежде чем компилировать проект, вы введете всевозможные детали для каждой из ранее определенных задач.
Одно из наиболее важных свойств для каждой задачи – start, оно используется для указания даты TaskJuggler, на которую задача должна быть начата. Но, несмотря на самые продуманные планы, некоторые вещи начинаются с опозданием. Например, если задача Music System фактически начинается 2 сентября, а не 1 сентября, вы можете сообщить об этом TaskJuggler вот так:
task music “Music System” { depends !wire start 2009-09-01 delayed:start 2009-09-02 length 2d }
Помните, как мы в начале создали сценарии plan и delayed? Мы здесь используем delayed, чтобы указать фактическую дату начала задачи. Можно также использовать delayed для других припозднившихся задач.
По умолчанию, TaskJuggler считает все задачи идущими по графику и выполняемыми в срок. Если это не так, можно указать TaskJuggler статус каждой задачи.
task music “Music System” { depends !wire start 2009-09-01 delayed:start 2009-09-02 length 2d delayed:length 5d complete 45
Свойство complete сообщает TaskJuggler, что задача Music System завершена только на 45 %. Также обратите внимание, что мы использовали выше два свойства delayed, для определения задержки с началом и продолжительностью.
Помимо простого выделения ресурсов для задач, можно также указать количество часов, в течение которых они будут затребованы. Мы используем свойство limits:
task wire “Electrical Wires” { allocate elec2 { limits { dailymax 3h } } length 4d }
В этом фрагменте мы сообщили TaskJuggler, что наш ресурс elect2 (Мак Джордан) за каждый из четырех дней выполнения своей задачи будет работать с электропроводкой только по три часа.
Покажи мне деньги
Последнее, что нужно сделать – это назначить свои задачи на надлежащие счета. Так как мы создали счет eqp, куда списываются затраты на оборудование, используемое под каждую задачу, давайте использовать его глобально, чтобы все задачи могли к нему обращаться:
task carp “Pimping Cars” { account eqp task pj “Paint Job” { } task wire “Electrical Wires” { } task music “Music System” { } task bb “Bumper & Body work” { } }
Далее, мы должны показать все наши доходы. Чаще всего по проекту выдается начальный аванс, потом на различных этапах развития продукта принимаются платежи, а уж потом, по завершении, выполняется окончательный расчет.
Разумеется, вам придется вписывать все эти платежи. Для этого надо определить в TaskJuggler отдельные этапы, на которых демонстрируется продукт:
task demo “Demonstrations” { account inc task down “Downpayment” { # Представ лены детальный план тюнинга и раскладка по времени credit 2009-08-25 “Initial downpayment” 5000.0 } task fd “First Demonstration { # Заказчик оценивает результаты ку зовных работ depends !!carp.bb startcredit 15000.0 } task finish “Finished” { # Проект завершен, тачка заказчика прокачана по самое не балуй depends carp.pj startcredit 20000.0 } }
Вместо указания кредита по ходу проекта наряду с другими выплатами, вы можете сделать это в самом начале, где впервые определяются разные счета:
account eqp “Equipment” cost account inc “Income” revenue { credit 2009-08-25 “Initial downpayment” 5000.0 }
Если цифры кажутся вам завышенными, мы тут ни при чем. На тюнинге автомобилей и правда делаются большие деньги. Но если вы не уверены, начните с малого. Скажем, с тюнинга мотоциклов.
Есть три свойства, которые можно использовать при определении сумм, заплаченных вам вашими клиентами: credit, startcredit и endcredit. Startcredit и endcredit, как следует из названия, используются для определения выплат, сделанных вам в начале и по окончании задачи. Свойство credit используется для задания первоначальных выплат вам.
Отчетность
К счастью, после титанических усилий для подгонки TaskJuggler ко всем сложностям вашего проекта, для создания отчета ничего специального делать не придется.
Если при старте проекта вы выбрали простой или большой шаблон, у вас уже есть все, чтобы просмотреть отчеты по вашему проекту. Просто нажмите F9 для компиляции проекта и выберите вкладку Reports [Отчеты] на левой панели. Теперь нажмите на любом варианте из перечисленных – и вуаля, вот ваш отчет.
Поскольку без диаграммы Ганта ни один отчет не полон, можно создать и ее, с помощью такого кода:
taskreport “Gantt Chart” { headline “Project Gantt Chart” columns hierarchindex, name, start, end, effort, duration, chart # В этом отчете мы хотим видеть перед датой сокращенное название дня недели. За это отвечает %a. timeformat “%a %Y-%m-%d” loadunit days hideresource 1 }
Теперь, скомпилировав проект, вы увидите ссылку Gantt Chart [Диаграмма Ганта] в интерактивных отчетах в меню Отчеты. Щелчок по ней вызовет отчет с указанием всех заданных нами полей. Диаграмма Ганта отображается на панели в правой части окна TaskJuggler.
Помимо taskreport, можно также заставить TaskJuggler создать отчет по использованию ресурсов, прибегнув к помощи resourcereport. Аналогично можно применить htmlaccountreport для контроля счетов:
htmlaccountreport “Accounts.html” { columns no, name, scenario, total, monthly headline “Income and Expenses” caption “Income and Expenses at a glance. But, also in detail at the same time. You’ll see from the screenshot.” scenarios plan, delayed }
Cтрока scenarios plan, delayedstatement поможет быстро заметить разницу в расходах в случае задержки.