инструменты


Предыдущая статья про Ruby on Rails, как всегда, выродилась в грандиозный флейм вокруг PHP. Кто-то говорит, что Rails в самое ближайшее время вытеснит PHP на свалку истории, кто-то говорит, что Rails будет портирован на PHP и на свалку истории отправится как раз Ruby. Все остальные мнения — где-то посередине между этими крайностями.

Я считаю, что Rails займет нишу элитарного инструмента, а PHP продолжит доминировать в категории языков, совместимых с лоботомией. Но это тема для другой статьи…

Сегодня же давайте рассмотрим следующую по популярности тему религиозных войн Rails vs. Django vs. PHP — движки HTML-шаблонов. На самом деле, спор чаще всего идет о синтаксисе шаблонов. Такие особенности конкретных движков, как скорость рендеринга, способ обработки ошибок и т.д. с точки зрения религиозных войн не так интересны.

О важности качественного языка шаблонов

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

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

Краткая классификация

Шаблонизатор — это библиотека, позволяющая с помощью специализированного синтаксиса описывать разметку динамических HTML-страниц. Разметка описывается в виде так называемых шаблонов. На основе шаблонов и данных, как правило, предоставленных кодом бизнес-логики (клинические случаи с включением бизнес-логики в шаблоны рассматривать не будем) генерируется результирующий HTML.

Большинство языков шаблонов относится к одной из следующих категорий:

Категория 1. Винегрет из кода и HTML

Шаблонизаторы данной категории позволяют с помощью специального синтаксиса вставлять в HTML блоки исполняемого кода, написанного на языке общего назначения (Java, PHP, Ruby и т.д.).

Примеры шаблонов этой категории: PHP, ASP, JSP, ERb (стандартный шаблонизатор в Ruby on Rails).

Пример синтаксиса:

<% for recipe in @recipes %>
  <tr>
    <td><%= link_to %Q{#{recipe.title}}, :action => 'show', :id => recipe %>
        <%= link_to '(delete)', { :action => 'destroy', :id => recipe },                             
                    :confirm => 'Are you sure?', :post => true %></td>
    <td><%= link_to %Q{#{recipe.category.name}},
                    {:action => 'list', :category_id => recipe.category.id} %></td>
    <td><%=h recipe.date %></td>
  </tr>
<% end %>
</table>

Категория 2. Специализированный синтаксис + HTML

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

Примеры шаблонов этой категории: движок шаблонов Django, Smarty

Пример синтаксиса (Django):

{% extends "base_generic.html" %}

{% block title %}{{ section.title }}{% endblock %}

{% block content %}
<h1>{{ section.title }}</h1>

{% for story in story_list %}
<h2>
  <a href="{{ story.get_absolute_url }}">
    {{ story.headline|upper }}
  </a>
</h2>
<p>{{ story.tease|truncatewords:"100" }}</p>
{% endfor %}
{% endblock %}

Категория 3. Основанные на XML

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

Примеры шаблонов этой категории: Velocity, ASP.NET

Пример синтаксиса:

<form runat="server">
  Enter a number from 1 to 100:
  <asp:TextBox id="tbox1" runat="server" />
  <br /><br />
  <asp:Button Text="Submit" runat="server" />
  <br />
  <asp:RangeValidator
    ControlToValidate="tbox1"
    MinimumValue="1"
    MaximumValue="100"
    Type="Integer"
    EnableClientScript="false"
    Text="The value must be from 1 to 100!"
    runat="server" />
</form>

Категория 4. Специализированный язык разметки

Шаблоны данной категории целиком написаны на DSL (Domain-Specific Language), отвечающем за генерацию как динамического содержимого, так и, собственно, HTML-разметки.

Примеры шаблонов этой категории: HAML, Markaby

Пример синтаксиса (HAML):

!!!
%html
  %head
    %title= controller.controller_name
    = stylesheet_link_tag 'main'
  %body
    #header
    %h1 BoBlog
  #content= yield
  #footer
    %p All content copyright © Bob

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

Сейчас попробую объяснить, почему.


Feel the pain

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

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

Ничего подобного.

Главная проблема большинства шаблонизаторов в том, что уродлив сам синтаксис HTML.

Этот кривой HTML

HTML избыточен и некрасив. Разметка содержит множество элементов, без которых можно было бы обойтись. Сами элементы тоже нельзя назвать образцом изящества. Подробности далее…

Немного истории

Давным-давно, в 60-х годах прошлого века был создан SGML, абстрактный язык разметки для представления максимально разнообразной информации в виде структурированных, пригодных для машинного чтения, данных. За универсальность SGML пришлось платить сложностью и громоздкостью синтаксиса. Этот недостаток SGML в полной мере распространяется на его потомков, HTML и XML.

HTML сложно читать.

Простота чтения языка программирования зависит, в первую очередь, от двух параметров:

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

Пара примеров:

Java. Все плохо как с количеством строк, так и с их размером:

void cancelAll(Collection<TimerTask> c) {
    for (Iterator<TimerTask> i = c.iterator(); i.hasNext(); ) {
        i.next().cancel();
    }
}

Python. Практически образец лаконичности:

def cancel_all(tasks):
    for task in tasks:
        task.cancel()  

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

Именно из-за проблем с понятностью синтаксис Perl’а, часто называемого write-only языком, нельзя считать удовлетворительным. Вот здесь, например, Steve Yeggie пишет как оператор .. в Perl может, в зависимости от контекста, иметь два абсолютно разных значения. Само собой, такие фокусы способствуют читабельности кода не лучше, чем выражение goto.

Можно предположить, простота чтения языка разметки зависит от тех же ключевых параметров: лаконичности и понятности.

С понятностью у HTML все в порядке: принцип построения документа из тегов способен без особого труда понять даже ребенок. А вот с лаконичностью…

HTML — ну очень многословный язык. Многие часто используемые теги имеют весьма длинные имена. Многие типичные конструкции (например, label и legend) приходится делать с помощью отдельного тега, хотя в большинстве случаев достаточно было бы атрибута. Нет универсального обозначения конца блока, аналогичного end в Ruby или закрывающей фигурной скобке в C-подобных языках — каждый блок HTML закрывается по-своему, в соответствии с именем открывающего тега, следовательно, читателю сложнее распознавать строки, не несущие полезной информации.

Буков много (c)

HTML сложно писать.

Пример из жизни.

В WordPress для написания постов можно использовать WYSIWG-редактор (What You See Is Shat You Get, можно перевести как “что видишь в редакторе, то и получишь в результате”), а можно писать чистый HTML. В моей версии WordPress WYSIWG кривой и то что я вижу в редакторе совсем не соответствует тому, что я получаю на выходе. Причиной проблем является большое количество паразитной разметки, генерируемой упомянутым редактором: пустые теги <p>, пустые теги <b> и <i>, время от времени появляющийся в конце текста незакрытый тег <a>… В результате, для того чтобы написанный пост выглядел хорошо, приходилось руками вычищать HTML.

Через некоторое время я убедился, что вручную писать правильный HTML быстрее, чем вручную же вычищать автоматически созданный. И я стал писать посты в чистом HTML. Жизнь стала легче, но это все же нельзя было считать удовлетворительным решением. Скорость написания форматированного текста в HTML не сравнится со скоростью создания форматированного текста в том же MS Word.

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

Небольшое сравнение HTML и Markdown для иллюстрации.

HTML:

<p>Small example of Markdown syntax</p>

<ol>
<li>Red</li>
<li>Green</li>
<li>Blue</li>
</ol>

<p>If you want your page to validate under XHTML 1.0 Strict,
you've got to put paragraph tags in your blockquotes:</p>

<pre><code><blockquote>
    <p>For example.</p>
</blockquote>
</code></pre>

Markdown:

Small example of Markdown syntax

1.  Red
2.  Green
3.  Blue

If you want your page to validate under XHTML 1.0 Strict,
you've got to put paragraph tags in your blockquotes:

    <blockquote>
        <p>For example.</p>
    </blockquote>

Подводя итог, можно сказать, что использование HTML в качестве основы языка шаблонов заставляет платить читабельностью и лаконичностью синтаксиса. Появление таких платформ веб-разработки как Django и Ruby on Rails делает эту цену слишком высокой. Чтобы не путаться под ногами, язык шаблонов должен быть проще.

HAML как альфа-версия шаблонизатора будущего

Показанный выше Markdown очень эффективно решает задачу безболезненного написания HTML, но в относительно узкой нише — написание текстов. Того же самого для несколько более широкого спектра задач добиваются разнообразные wiki-разметки.

Шаблонизатор HAML пытается с использованием тех же принципов создать читабельный и лаконичный синтаксис HTML-шаблонов общего назначения. Дело, как говорится, благородное.

Посмотрим, как у него это получается?

Преимущества

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

Рассмотрим основные преимущества подробнее:

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

    • Какие два атрибута тегов используются чаще всего? Class и id. В HAML <tr class="odd" id="first_row"> превращается в %tr#first_row.odd. Используются те же обозначения что и в CSS, что заметно упрощает обучение.
    • Большинство ключевых слов состоят из одного символа: %, =, -, ., #. Думаю, не нужно говорить, насколько это сокращает получающийся в итоге код.
    • Любители верстки divами (а это заметная часть прогрессивного человечества) могут наслаждаться тем, что div является тегом по умолчанию. #header и %div#header — одно и то же.

    Это только самое основные сокращения. Полный список можно посмотреть в HAML Reference

  • Способ обозначения блоков. Блоки в HAML обозначаются с помощью отступов, аналогично Python. Вот такой код: %one %two %three Hey there преобразуется в: Hey there

    Можно по-разному относиться к Python’овскому стилю обозначения блоков (лично я — его большой поклонник), но нельзя не признать что этот способ гораздо удачнее, чем закрывающие теги, используемые в HTML (я уже писал про связанные с ними проблемы).

  • Возможность сочетать HAML и ERb в одном приложении. Допустим, нужно найти шаблон с именем ‘xyz’ (или partial, не суть важно). Плагин HAML переписывает стандартный загрузчик шаблонов так, чтобы сначала пытаться загрузить xyz.haml, а в случае неудачи — xyz.rhtml. Соответственно, можно не переписывать все ERb-шаблоны в проекте на HAML, а заменять их по одному и только там, где это наиболее оправдано.

Проблемы

HAML пока используется относительно небольшим количеством людей. Версия 1.0 была выпущена только два месяца назад, 15 января 2007 года. В результате, общая стабильность не может, разумеется, сравниться с ERb, а ваши шансы столкнуться в своем проекте с неизвестными багами гораздо выше.

Но это только абстрактные размышления.

Из конкретных проблем я встречался только со сложностью отладки. HAML реализован таким образом, что шаблоны компилируются в ERb, который затем рендерится с помощью ERb-библиотеки. В результате, в случае ошибки Stack Trace ссылается на фрагмент ERb-шаблона, который вы никогда не увидите целиком. Диагностика проблем в таких условиях может быть очень нетривиальной.

Грядущее упрощение языков разметки?

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

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

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

  • Шаблонизаторы категории “Винегрет” продолжают использоваться в большинстве PHP-разработок. Разработчики, обладающие достаточной квалификацией для использования продвинутых шаблонизаторов типа Smarty (и, что важнее, достаточной квалификацией, для того чтобы понять, зачем это нужно) будут постепенно откочевывать в сторону Rails, Django и других подобных фреймворков, которые наверняка появятся в ближайшем будущем.

    Шаблонизатором по умолчанию в Ruby on Rails 2.0 становится HAML, тем самым выводя Rails из группы платформ, использующих “Винегрет”.

  • Шаблонизаторы на основе специализированного синтаксиса + HTML также теряют часть своей аудитории в пользу HAML сотоварищи. Тем не менее, данная категория остается достаточно популярной благодаря простоте синтаксиса и возможности четкой диагностики ошибок. Именно такими шаблонизаторами, в большинстве своем. пользуются дизайнеры и HTML-верстальщики, не желающие/не способные переучиваться на без-HTML’ный DSL.

  • XML постепенно отступает в нишу машинной сериализации данных. С этой точки зрения громоздкость его синтаксиса не является большим недостатком (хотя и увеличивает объем трафика при передаче данных по сети). Гораздо важнее простота парсинга и возможность формальной валидации. Ruby, Python и другие динамические языки активно переходят к использованию вместо XML «облегченных» форматов, в частности YAML.

    Шаблонизаторы на основе XML, вероятно, сохранят популярность в C# и Javа. Хотя замена таких шаблонизаторов на более «легкие» решения и предоставляет значительные возможности экономии времени разработчиков, сознательный выбор языка со статической типизацией говорит о том, что скорость разработки, скорее всего, не является первым приоритетом при выборе технологий в данном проекте. В таких условиях использование XML вполне адекватно.

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

  • Столица, разумеется, переносится в Нью-Васюки :)

Материалы по теме

  • Серия статей Ивана Сагалаева с критикой использования XHML вместо HTML. Отлично изложены аргументы, доказывающие ущербность оптимизации парсинга разметки за счет увеличения трудоемкости ее создания.

Спасибо Артему Скорецкому и Анатолию Иванову, читавшим черновики этой статьи и внесшим немало ценных идей.

Разработчик Вася Пушкин недавно начал новый проект. Ему надоело раскладывать стандартный пасьянс, идущий в комплекте с Windows и он решил написать свой. Работа потихоньку движется, Вася пишет функции одну за другой, и программа начинает обретать форму. Когда он заканчивает какую-то функцию, откуда он узнает что делать дальше? Из головы. Он просто знает, что нужно сделать, чтобы закончить проект.

Через два года Вася стал владельцем основателем Pushkin Soft, ltd. и занимается продажей пасьянсов. Доходы позволяют нанять второго программиста, Петю, и с удвоенной энергией взяться за следующую версию продукта. Сначала Вася с Петей просто обсуждали планы работ устно. Но через некоторое время задач стало больше, возросшее количество клиентов заставило больше отвлекаться на техподдержку и друзьям стало ясно, что держать список работ в голове больше нельзя – постоянно что-то забываешь. Последней каплей стало то, что Вася забыл закрыть период бесплатной раздачи продуктов на сайте компании (по замыслу трехдневный) и две недели счастливые пользователи могли скачать бесплатную версию. Для решения проблемы была закуплена и повешена на стену огромная доска, на которую теперь записывались все планируемые работы. Выполненные работы стирались и места на доске вполне хватало.

Через год в компании работало уже 5 человек, и все стены были завешаны досками. Место на доске начало быть дефицитом. Кроме того, никто не мог вспомнить, какие работы были выполнены всего месяц назад. Вася понял, что так больше продолжаться не может и надо искать новое решение для записи задач.

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

Многие первым делом обращаются к Microsoft Project. Мне хотелось бы предостеречь вас от совершения этой ошибки.

Project не поддерживает нужную вам модель данных

Основные объекты предметной области: задачи и исполнители в Project’е совсем не похожи на действительность разработки программного обеспечения. Значит, вам придется изворачиваться и придумывать, как запихнуть в это прокрустово ложе нужные вам данные. Это вполне реально и даже немного весело, но заставляет вас делать не очень нужную работу. В этом разделе я попробую описать основные недостатки модели данных Microsoft Project применительно к планированию процесса разработки. Со всеми этими проблемами я сталкивался лично и лично придумывал обходное решение.

  1. Project рассчитан на меньшее количество задач, чем вам нужно. Средний документ, вероятно, содержит меньше ста задач. Для управления проектом это смешная цифра. Для сравнения: в базе задач Apache Foundation более 40,000 записей, в базе Mozilla Foundation – более 360,000. В моем последнем проекте, очень небольшом, общее количество задач за 4 месяца достигло 200. В двухлетнем проекте, в котором участвуют 10-15 человек, количество задач может легко перевалить за 10,000. Я видел, как ведет себя MS Word на несвойственных для него объемах (сотни страниц технической документации со схемами) - падения, мистические глюки, тормоза. Лично не проверял, но могу предположить, что с Project’ом ситуация будет похожей.

  2. Project позволит вам случайно поменять ID задачи. Более того, есть целый ряд операций, которые при своем наиболее естественном исполнении ведут к смене ID задач. Будете вводить собственную систему ID/кодов? Будете использовать название и время от времени путать задачи с похожими названиями?

  3. Надо что-то делать с жизненным циклом задачи. Даже в самом простом случае вам придется иметь дело с циклом “выполнение -> проверка -> доработка -> проверка”. Заметьте, что за разные этапы отвечают разные люди. Как представить это в Project?

    • Можно разбивать каждую задачу на X подзадач - по одной на этап жизненного цикла. Получается громоздко и неудобно, зато относительно точно.
    • Можно назначать задачу сразу всем задействованным исполнителям - разработчику, тестировщику, аналитику, админу и т.д., и добавить к задаче поле “статус”, чтобы понять на каком этапе жизненного цикла эта задача находится. Хорошо, а как тогда отслеживать историю изменения статуса (она же не обязательно линейная)? Как понять, что функция возвращается на доработку четвертый раз, а не первый? Не знаю. В результате и так плохо и эдак нехорошо.

Итого: половину информации о проекте удастся внести в Project, вторую половину придется держать в голове.


Лирическое отступление номер 1. Опасные иллюзии или в чем отличие строительства дома от создания программного продукта

В рамках нашего школьного курса по MS Project учебным проектом, который нужно было описать, служила постройка дома. Мы описывали задачи, устанавливали зависимости, находили критический путь, переставляли задачи, оптимизируя общую длительность проекта, считали нагрузку на ресурсы и общую стоимость, снижали ущерб от срыва сроков… В общем, делали в воображаемом проекте все то, для чего предназначен Porject. Все тот же учебный проект, с небольшими вариациями, использовался в университетском курсе. Похожие примеры - в половине учебных материалов, лежащих в Сети. Эти примеры выбраны не случайно. MS Project затачивался на определенный тип проектов, и именно такие проекты и стараются использовать при обучении.

Я хочу рассказать вам о нескольких предположениях, заложенных в Project, которые полностью противоречат с действительностью проектов по разработке ПО. Нужно не забывать, что в жизни все совсем не так, как подразумевает интерфейс Project, особенно если вы все же решитесь использовать его в проекте по разработке софта.

Итак, самые опасные иллюзии, заложенные в MS Project:

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

  • Для частично выполненной задачи можно правдоподобно оценить процент выполнения. Например, идет отделка комнат, выполнено 60%, осталось 40; мы опережаем план на два дня. Благодать… Жаль, что такие рассуждения применимы только к отделочным работам. В разработке софта задача, выполненная на 80% - не выполнена! Выполненная на 99.9% - тоже не выполнена. Сколько времени займет оставшаяся десятая процента можно узнать только после того, как работа будет закончена и сдана. Часто окажется, что 99,9% в действительности означало только 33,3%. Так уж сложилось, что получить правдоподобную оценку степени готовности можно только для некоторых работ, да и то от очень немногих людей. Поэтому здравомыслящий менеджер использует бинарную систему оценки готовности: готово - не готово. Всякие проценты - это, как правило, мишура, отвлекающая от более важных вещей.

  • Зная оценочную длительность всех работ, можно достаточно точно предсказать длительность всего проекта. Это подвид предыдущей иллюзии. Даже если вы можете безошибочно оценить длительность задачи (уже сомнительно), то у вас нет ни малейшего представления о том, сколько времени займет проект целиком. ДеМарко пишет, что в абсолютном большинстве случаев срыв сроков вызван непредусмотренными в плане задачами, а не ошибками в оценке длительности предусмотренных. С ним сложно не согласиться. Кроме того, в большинстве коммерческих проектов сроки определяются бизнес-соображениями, а не оценочной длительностью. И ваша задача - не оптимизировать длительность полной реализации плана, а поставить разумный набор функций, который удалось реализовать в срок. Кстати, выбором самых приоритетных задач Project тоже не позволит вам управлять. Как, например, исключить задачу из плана, не удаляя ее? В issue-tracking’е вы можете использовать wontfix. А в Project?


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


Project не поддерживает совместную работу

Хорошо, допустим, у вас получается вести актуальный список работ в MS Project. Вероятно, участники проекта слабо владеют телепатией. Значит надо как-то сообщать им о появляющихся задачах, а они, в свою очередь, должны как-то сообщать о сделанных работах. Как?

  1. Можно рассылать задачи в письмах, копируя описания из MS Project. Трудоемко и совсем не изящно. Теоретически, можно попытаться автоматизировать эту операцию с помощью VBA-скриптов в MS Project. И да поможет вам бог, если вы на это решились…

  2. Можно сообщать устно. Мало кто способен запомнить все несколько десятков задач, висящих на нем - это просто за пределами человеческих возможностей. Поэтому, когда пройдет изначальный период хаоса, работать устная раздача заданий будет следующим образом: вы записываете задачу в project, связываетесь с программистом и рассказываете на словах, что ему нужно сделать, он, находясь в середины выполнения другой задачи, чертыхается, уточняет формулировку, записывает новую задачу себе на листочек или в Outlook, потом пытается мучительно вспомнить, на каком месте текущей задачи он остановился. Через три дня (три недели, три месяца и т.д.), когда дело дойдет до новой задачи, программист отыщет свои записи, и попытается вспомнить, что же имелось в виду. В половине случаев он позвонит вам и спросит еще раз. В половине оставшихся - не позвонит, но его интерпретация задачи будет заметно отличаться от вашей. Каждый раз, когда вы прервете человека в середине задачи и бросите на какую-нибудь авральную работу, сцена с менеджером, листочком и телефоном повторяется. Примерно через две недели кто-нибудь потеряет свой листочек с заданиями, и они с менеджером будут мучительно пытаться понять, какие же задачи потеряны, а какие - нет. А через некоторое время у одного из участников накроется жесткий диск, унося с собой в могилу все его данные, после чего операция с диктовкой 40 актуальных задач повторяется.

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

Итого: главным инструментом вашей совместной работы над планами станет телефон. Оно вам надо?


Лирическое отступление номер 2. MS Project Server

Да, у Microsoft есть интранет-продукт Project Server, который вроде бы решает задачи совместной работы. Это своего рода веб-интерфейс к проекту. Исполнители могут в любой момент видеть все дерево проекта в актуальном состоянии и сообщать статус своих задач. Все изменения синхронизируются с главным документом Project, находящимся у менеджера. Все довольны, все танцуют.

Типа.

В одном проекте мы, наткнувшись на сложности совместной работы на базе документа, честно пытались пользоваться Project Server’ом. Не получилось. Продукт оставляет ощущение недоделки, скорость работы в локальной сети заметно медленнее, чем большинство хороших issue tracking систем в Интернете (с сервером на другом континенте). Все остальные проблемы, которые уже забылась, но они были, и весьма неприятные.

Так что рекомендую пользоваться Project Server только в качестве эксперимента.


Что-то хорошее

Чем Project хорош - так тем, что, пользуясь им, нельзя не увидеть “С начала проекта прошло уже два месяца. Осталось полтора, а мы еще ничего толком не сделали… Вот дерьмо!”. Если ваш инструмент позволяет, заведите себе такой индикатор прошедшего времени и повесьте его туда, где он будет бросаться на глаза.

Резюме

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

Если не Project, то что?

Если у вас нет опыта использования Issue Tracking, в небольшом проекте я бы рекомендовал начать с использования Excel. Затраты на установку и обучение минимальны, поэтому вы сможете сосредоточиться на содержательной стороне Issue Tracking’а и понять какие задачи он должен решать для вас. Через некоторое время вы сможете гораздо более осознанно выбрать Issue Tracking систему, чем выбрали бы с самого начала.

Во всех остальных случаях просто найдите нормальную Issue Tracking систему и пользуйтесь ей.

Интересно, а пользуются ли в Microsoft своим Project’ом для планирования процесса разработки?

Update: из чего выбирать свою первую issue tracking систему

Приведу небольшой перечень хороший вариантов для выбора в качестве первой issue tracking системы:

  • Trac - очень удобен в использовании, помимо issue tracking’а включает тесно интегрированную с ним wiki. Существует множество плагинов, расширяющих функциональность. Базовая функциональность в области issue tracking не очень богата, в больших проектах с сильно формализованным процессом разработки ее может не хватить. Open Source.

    В настоящее время я использую Trac, очень доволен.

  • Jira - многофункциональная issue tracking система. Продуманная поддержка как bugtracking так и project management функциональности. Весьма удобна в использовании, хотя и не дотягивает в этом показателе до Trac. Коммерческая, цены начинаются от $1200/сервер.

    Мы использовали JIRA около 4 месяцев, довольны всем, кроме цены.

  • Bugzilla - проверенная временем система с достаточной функциональностью, но без особых изысков. Отличная надежность, масштабируемость и производительность. Open Source.

  • Mantis - еще одна неплохая система. Open Source.

Более подробные обзоры и сравнения систем можно найти на сайте software-testing.ru(они часто концентрируются в своих обзорах на багтреккинговой части функциональности) или на википедии.

Материалы по теме

« Previous PageNext Page »