Фредерик П. Брукс

Вид материалаДокументы
Бич блок-схем
Самодокументирующиеся программы
Некоторые приемы.
Подобный материал:
1   ...   27   28   29   30   31   32   33   34   ...   48

Бич блок-схем


Блок-схема чаще всего является лишней частью программной документации.Для многих программ блок-схемы вообще не нужны. Редкие программы требуютблок- схемы более чем на одну страничку.

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

Одностраничная блок-схема для значительной по размеру программыстановится, в сущности, диаграммой структуры программы и этапов или шагов. Вэтом качестве она очень удобна. Рисунок 15.1 показывает такой графподпрограммной структуры.



Рис. 15.1 Граф структуры программы (пример W. V. Wright)

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

Подробная пошаговая блок-схема является досадным анахронизмом,пригодным только для новичков в алгоритмическом мышлении. ВведенныеГолдштайном и фон Нейманом1 прямоугольники вместе со своим содержимымслужили языком высокого уровня, объединяя непостижимые операторы машинногоязыка в осмысленные группы. Как давно понял Иверсон,2 в систематическомязыке высокого уровня группировка уже проведена, и каждый прямоугольниксодержит оператор (рис. 15.2). Поэтому сами прямоугольники являютсяутомительным и отнимающим место упражнением в черчении и вполне могут бытьудалены. Тогда остаются только стрелки. Стрелки, связывающие один оператор сдругим, расположенным в следующей строке, излишни, и их можно удалить. Тогдаостаются только GO TO, и если придерживаться хорошей практикипрограммирования и использовать блочные структуры для минимизации числа GOTO, таких стрелок окажется немного, но они очень способствуют пониманию.Вполне можно нарисовать их на листинге и вовсе избавиться от блок-схемы.

В действительности о блок-схемах больше говорят, чем пользуются ими. Яникогда не видел опытного программиста, который в повседневной деятельностирисовал бы подробные блок-схемы, прежде чем начать писать программу. Там,где блок-схемы требуются правилами организации, они почти всегда создаютсязадним числом. Многие гордятся использованием специальных программ длягенерации этого "незаменимого инструмента разработки" на основе ужезаконченной программы. Думаю, что этот всеобщий опыт не является постыдным ипредосудительным отходом от хорошей практики программирования, признаватьсяв котором можно лишь с нервным смешком. Напротив, это результат здравогорассуждения, дающий нам урок относительно полезности блок-схем.

Апостол Петр сказал о новообращенных язычниках и законе Моисея: "Что жевы [желаете] возложить на выи учеников иго, которого не могли понести ниотцы наши, ни мы?" (Деяния апостолов 15:10). То же сказал бы я опрограммистах-новичках и устаревшей практике блок-схем.

Самодокументирующиеся программы


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

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

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

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

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

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

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

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



Рис. 15.2 Сравнение блок-схемы и соответствующей программы на PL/I фрагмент)

Второе предложение - в максимальной мере использовать пространство иформат, чтобы улучшить читаемость и показать отношения подчиненности ивложенности.

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

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

Некоторые приемы. На рисунке 15.3 показана самодокументирующаясяпрограмма на языке PL/I.3 Числа в кружочках не являются ее частью, а служатметадокументацией для ссылок при обсуждении.

1. Используйте для каждого запуска свое имя задания и ведите журнал, вкотором учитывайте предмет проверки, время и полученные результаты. Если имясостоит из мнемоники (здесь QLT) и числового суффикса (здесь 4), то суффиксможно использовать в качестве номера запуска, связывающего запись в журналеи листинг. При этом для разных прогонов требуются свои карты задания, но ихможно делать колодами с дублированием постоянных данных.

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

3. Включите текстовое описание в качестве комментариев к PROCEDURE.

4. Для документирования алгоритмов ссылайтесь, где можно, налитературу. Это экономит место, адресует к более полному освещению, чемможно дать в программе, и дает возможность знающему читателю пропуститьссылку, оставляя уверенность, что он вас поймет.

5. Покажите связь с алгоритмом, описанным в книге: а) изменения; б)особенности использования; в) представление данных.

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

7. Поставьте метку в начале инициализации.

8. Поставьте метки перед группами операторов, соответствующиеоператорам алгоритма, описанного в книге.

9. Используйте отступы для показа структуры и группирования.

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

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

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

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



Рис. 15.3 Самодокументирующаяся программа

Самым серьезным возражением является увеличение размера исходноготекста, который нужно хранить. Поскольку практика все более тяготеет кхранению исходного кода в активных устройствах, это вызывает растущеебеспокойство. Лично я пишу более краткие комментарии в программах на APL,которые хранятся на диске, чем в программах на PL/I, которые хранятся наперфокартах.

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

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

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

В какой мере описанные выше приемы применимы для программ на языкеассемблера? Я думаю, что базовый подход документирования применим всюду.Свободным пространством и форматами можно пользоваться с меньшей степеньюсвободы, и поэтому они используются не так гибко. Имена и объявленияструктур, несомненно, можно использовать. Очень могут помочь макросы.Интенсивное использование параграфов комментарием является хорошей практикойв любом языке.

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