May 23rd, 2010

Про оптимальность программ

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

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

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

Количество ошибок по отношению к длине кода возрастает нелинейно (за счёт роста количества взаимосвязей между логическими блоками). Таким образом, если исправление ошибок в коде из десяти строк потребует, скажем, десяти минут, то для тысячи строк это будет уже не тысяча минут, а, скажем, десять тысяч. Даже при архи-грамотном проектировании и написании кода мега-квалифицированным программистом, число ошибок в отношении к длине кода всё равно будет расти. Равно будет расти и время на их исправление. Это — первый аспект проблемы.

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

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

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

Collapse )