Стили и методы программирования

         

Почему нет универсальных методов?


К сожалению, из курсов наших университетов (как это обычно бывало во времена кризиса России) практически исчезла исключительно важная для мировоззрения и просто общей культуры наука: логика. Этот факт особенно прискорбен потому, что за XX век логика заставила научное мировоззрение перейти на качественно новый уровень1). Она впервые заставила науку задуматься над границами собственных возможностей.

Здесь стоит сослаться хотя бы на теорему Гёделя о неполноте (см., напр., [20]), которая утверждает, что нет ни одной полной теории, описывающей хотя бы натуральные числа. Далее, теорема о неполноте тесно взаимосвязана с теоремой об универсальном алгоритме, и обойти ее невозможно (любая попытка обойти ее сама себя опровергает). Теорема об универсальном алгоритме влечет как следствие принципиальную непополнимость универсального алгоритма (это чисто функциональный факт, он никак не зависит от конкретного построения универсального алгоритма и даже от конкретного понятия вычислимости, положенного в основу). Вся архитектура и идеология современных вычислительных систем построена на базе понятия универсального алгоритма (например, само существование транслятора с "универсального" языка типа C++ является ее практической реализацией). Таким образом, понятие ошибки в программе не устранимо даже в принципе.

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

Вы говорите, что люди же решают задачи. Но посмотрите: каждый специалист имеет свои излюбленные задачи, которые он хорошо решает. А для Вашего профессионального роста и трезвой самооценки очень полезно побывать в такой ситуации, когда Ваши излюбленные методы отказывают. Если Вы сумели проанализировать свою неудачу, Вы достойны звания специалиста, если же нет, Вы находитесь на пути к догматизму либо шарлатанству2).

Часто теоретические рассмотрения первого уровня приводят к наукообразным выводам, которые рассыпаются, при углубленном исследовании.
Но в данном случае повышение глубины лишь усиливает эффекты неуниверсальности.

Рассмотрим пример типичной ошибки, которую неоднократно делают при теоретическом обосновании с помощью простейших моделей вычислимости.

Все, что может быть вычислено, может быть вычислено на машине Тьюринга. Машину Тьюринга можно промоделировать на языке С++. Поэтому ничего, кроме языка С++, знать не нужно.

Но тогда не нужно было бы изобретать и сам язык С++, поскольку машины конструируются таким способом, что любую машину Тьюринга можно промоделировать и в системе машинных команд3).

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

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

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


Содержание раздела