В моей молодости были лифтеры – люди, работа которых заключалась в том, чтобы весь день ездить на лифте вверх-вниз и останавливаться на нужных этажах для посадки и высадки пассажиров. Когда-то они крутили любопытную ручку, которую можно было поворачивать по часовой стрелке и против часовой стрелки, чтобы направлять лифт вверх или вниз, и им требовалась определенная сноровка, чтобы останавливать кабину на нужной высоте. При входе в лифт и при выходе из него людям часто приходилось подниматься или спускаться на небольшую ступеньку, и лифтеры всегда их об этом предупреждали. Существовал целый свод правил относительно того, что и когда говорить, на какие этажи подниматься в первую очередь, как открывать двери и так далее. На стажировке они заучивали эти правила и практиковались следовать им, пока это не входило у них в привычку. Сами правила разрабатывались годами, и в процессе в них постоянно вносились небольшие изменения и уточнения. Представим, что этот процесс остановился, когда был создан идеальный свод правил. Он чудесно работал. Любой, кто в точности следовал правилам, становился превосходным лифтером.
Теперь представим, что случилось, когда простая компьютерная программа сумела взять на себя все задачи лифтера. (На самом деле это происходило постепенно, по мере того как появлялись все новые автоматические механизмы, которые забирали у лифтеров все более сложные задачи, но мы представим, будто лифты перешли от человеческого контроля к полностью компьютерному одним махом.)
Допустим, производитель лифтов нанимает команду программистов и вручает им свод правил, которым руководствовались лифтеры: “
Как только план написан на псевдокоде и выполняет необходимые условия, псевдокод можно перевести в исходный код, который представляет собой гораздо более строгую и структурированную систему команд, включая определение терминов – переменных, подпрограмм и так далее. Человеку по-прежнему несложно расшифровать исходный код – в конце концов, его пишут люди, – а следовательно, правила и условия свода правил в нем достаточно очевидны, если знать, куда смотреть. Расшифровке исходного кода способствуют две его характеристики: во-первых, по названиям переменных и команд обычно можно понять, за что они отвечают (