Почему разваливаются крупные проекты
Команды которые понимают принципы работы над большими проектами через пару месяцев оставляют далеко позади своих конкурентов. Те кто не понимает и осознает - учатся. Те кто думает, что все знает, но мало что понимают в работе над крупными проектами, расстраиваются из-за очередной неудачи и списывают все на руководство и плохую методологию разработки. Рецепт удачи между тем достаточно прост.
Часто можно видеть что первые 3-4 месяца работа продвигается по плану, а потом вдруг проект начинает разваливаться на глазах. Проблемы с руководством, методологией, ресурсами, планированием и финансированием могут быть, а могут и не быть. Но те вещи о которых сегодня пойдет речь есть всегда. Они очевидны и банальны, но почему то многие программисты и целые компании их игнорируют.
Есть две базовые причины неудачи:
1.Низкая квалификация программистов и отсутствие обучения
2.Отсутствует контроль за сложностью кода
Низкую квалификацию можно устранить только за счет обучения или увольнения и найма других сотрудников. Другого пути нет, что бы не говорили сами такие программисты. По аналогии со строительством - если у каменщика руки кривые, то никакой прораб не сможет "мотивировать" его возвести ровную стену. Думаю не трудно догадаться, кто попадет под сокращение в первую очередь в условиях кризиса. Все предельно просто и думаю, что комментарии излишни.
С контролем сложности кода все не так очевидно. Например, опытный программист глядя на код может сказать красивое решение или нет. Это интуитивное понимание и мало кто сможет объяснить в чем заключаться "красота". Ответ прост. Чем меньше сложность кода, тем он "красивее". Впервые мне попалось формализованное описание сложности в книге "Совершенный код: практическое руководство по разработке программного обеспечения", Макконнелл С.
Я настоятельно рекомендую прочитать эту книгу всем. На сложность влияют множество факторов. Например, это количество связей между разными модулями, атомарность операций и т.п. Пожалуй сложность кода это основной фактор, которые приводит к развалу проекта, даже если все остальные аспекты работы отлично налажены. Фактически вся разработка это борьба со сложностью. По мере разработки программы, сложность кода постоянно растет. В итоге она может превысить некий предел и программист будет просто не в состоянии добавлять новые функции без внесения ошибок. Причем количество ошибок начинает расти лавинообразно. Т.е. исправление одной ошибки может порождать еще две.
В команде из 3-6 человек проблемы со сложностью начинают вылазить на 3-4 месяце разработки. Как правило на этом этапе затраты на переработку программы и уменьшение сложности могут составлять до 30% от бюджета предыдущих месяцев.
Поэтому на каждом этапе разработки надо выбирать те решения, которые уменьшают сложность системы. Или по крайней мере не увеличивают ее. Самым простым и эффективным способом является деление программы на модули (классы для ООП). Каждый модуль разрабатывается так, чтобы он был слабо связан с другими. Кроме того он должен выполнять как можно более простые операции.
Вот пример функции на 10 страниц... шучу. Я дам просто пример в псевдокоде. Программа ищет в неком списке кадр, а затем выполняет его масштабирование и фильтрацию.
{
int iStride = w * h * sizeof(RGB);
for(int f = 0; f < nFrames; f++)
{
for(it = s.begin(); it != s.end(); it++)
{
if(it->frame_n == f && it->name = "left")
{
frame = it;
break;
}
}
pixel = frame->pixels;
for(int y = 0; y < h; y++)
{
for(int i = 0; i < iStride; i++)
{
//масштабирование и фильтрация кадра.
for(.........) for(......)
pixel[y][i] = expression;
}
}
}
}
Я выкинул все нужные детали, которые будут в настоящей реализации. И тем не менее код выглядит корявым. С первого взгляда трудно понять, что он делает. Давайте разобьем его на атомарные операции.
{
int iStride = GetStride();
for(int f = 0; f < nFrames; f++)
{
frame = FindFrame(s, f "left");
pixel = frame->pixels;
pixel = ScaleAndFilterImage(pixel, iStride)
}
}
Этот вариант выглядит более элегантно и понятно. Все "кирпичики" хорошо отлажены и программисту нет нужны задумываться о их реализации, когда он пишет высокоуровневый код. Сложность кода это главное о чем стоит заботится в больших проектах. За сложность в первую очередь отвечают программисты.
Есть очень хорошее практическое руководство по уменьшению сложности кода: "Refactoring: Improving the Design of Existing Code" by Martin Fowler.
Эта книга переведена на русский язык. Несмотря на то, что она написана для Java, все техники могут успешно использоваться и в других языках программирования.
Коментарии к статье|
| Хорошая и краткая статья... думаю поможет начинающим |
|