четверг, января 17, 2008

Software Testing – Cost or Investment? Часть 2.

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

Как весьма справедливо заметил в комментариях Евгений Пророк, значительную часть моих сентенций можно суммировать одним предложением -- обоим сторонам выгоднее заключить Service Level Agreement (SLA), чем заниматься "работорговлей". Да, это верно, но этого недостаточно. Заключение SLA вместо продажи FTE не превращает автоматически расходы в инвестиции. Потому что, по определению, инвестиции -- это долгосрочные вложения, целью которых является получение прибыли или увеличение активов в будущем. Заключение SLA в долгосрочном проекте можно интерпретировать как одну из форм инвестиций. Но ведь и в краткосрочном проекте тоже можно заключить SLA. Однако это было бы неправильно считать инвестированием, потому что никаких долгосрочных вложений в этом случае не делается.

Так что же, краткосрочные проекты -- это всегда чистый расход? Нет, нет, и ещё раз нет! Так может показаться только в том случае, если принимать в расчёт только финансовые активы. Однако современная экономическая наука трактует активы более широко. Например, в соответствии с концепцией сбалансированной системы показателей (balances score-card) следует рассматривать компанию с четырёх перспектив (групп показателей):

  1. "традиционная" финансовая,
  2. клиентская (лояльность клиентов, "популярность" и т.п.),
  3. внутренние процессы (зрелость, гибкость, инновационность и т.п.),
  4. персонал (развитие и рост).

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

суббота, января 05, 2008

Жизненный цикл разработки программного обеспечения -- что бы это значило?

Каждый год я рассказываю студентам, что такое ЖЦПС (жизненный цикл программной системы), что такое ЦРПС (цикл разработки программной системы), и в чём разница между ними. И всё было хорошо, пока в этом году один из студентов не пришёл ко мне и не сказал, что он дескать прочитал сделанное Сергеем Орликом переложение SWEBOK на русский язык, и там вводится другой термин (со ссылкой на Скотта Амблера) -- жизненный цикл разработки программного обеспечения. Пытливый студент хотел понять, как этот самый "ЖЦРПО" соотносится с теми двумя понятиями, про которые я рассказывал на лекциях.

Студента пришлось разочаровать, объяснив ему, что термин "жизненный цикл разработки программного обеспечения" вообще не имеет права на существование, потому что он внутренне противоречив. И что там скорее всего имелся в виду термин "цикл разработки программного обеспечения", а слово "жизненный" затесалось туда по недоразумению. Именно это объяснение я и собираюсь здесь привести.

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

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

Таким образом, противоречие в термине ЖЦРПО возникает из-за того, что неясно, какой процесс имеется в виду -- процесс существования (жизни) программной системы или процесс её разработки.

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

Говоря о жизненном цикле некоторого объекта или явления, мы можем иметь в виду один из двух смысловых вариантов.

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

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

Бывают ситуации, когда применимы оба варианта одновременно, то есть и процессы существования различных однотипных объектов схожи, и в процессе существования единичного объекта можно выделить некоторые циклы. Например, процесс жизни многолетнего растения можно интерпретировать как по второму варианту (зарождение, рост, размножение, гибель), так и по первому варианту, рассматривая циклические сезонные изменения.

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

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

Напоследок хочется отметить, что поиск в русскоязычном Интернете показывает достаточно широкое распространение термина ЖЦРПО, причём в большинстве случаев подразумевается как раз второй вариант уточнения (ЦРПС), а слово "жизненный" просто выступает в роли слова-паразита.

Но в англоязычном Интернете ситуация гораздо хуже -- я вообще не понимаю, как они сами разбираются, что означает термин Software Development Life Cycle (SDLC). Скажем, Википедия при открытии страницы http://en.wikipedia.org/wiki/Software_development_life_cycle перебрасывает на страницу "Software development process", то есть эти понятия трактуются как полностью идентичные, а кроме того, указывается, что синонимом являются также термины "software lifecycle" и "software process", всё смешано в одну кучу. Имеется также страничка "Systems Development Life Cycle", на которой опять таки объявляется, что синонимом этого термина является "Systems Life Cycle". А наряду с этим существуют (видимо, специально для индусов) разъяснения, согласно которым SDLC вообще является синонимом линейной (водопадной) модели процесса разработки ПО. Такие дела.