Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Как проектировать программы. Введение в программирование и компьютерные вычисления

Покупка
Артикул: 817279.01.99
Эта книга повествует о методах «хорошего программирования» — то есть о таком подходе к созданию программного обеспечения, который опирается на системное мышление, планирование и понимание задач разработчика на каждом этапе. В числе рассматриваемых тем — фундаментальные понятия систематического проектирования, типы данных, способы записи объемных данных, создание и использование абстракций, тестирование программ и функций и др. Издание адресовано профессионалам и энтузиастам программирования, не имеющим прежнего опыта систематического проектирования программ, а также преподавателям технических вузов, которые могут использовать представленный материал в рамках учебного курса.
Как проектировать программы. Введение в программирование и компьютерные вычисления : практическое руководство / М. Фелляйзен, Р. Б. Финдлер, М. Флэтт, Ш. Кришнамурти ; пер. с англ. А. Н. Киселева ; под ред. П. Б. Иванова, А. Д. Чичигина, Ю. А. Сыровецкого, С. В. Бронникова. - Москва : ДМК Пресс, 2022. - 724 с. - ISBN 978-5-97060-926-2. - Текст : электронный. - URL: https://znanium.com/catalog/product/2109580 (дата обращения: 27.04.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Маттиас Фелляйзен
Роберт Брюс Финдлер
Мэтью Флэтт
Шрирам Кришнамурти

Как проектировать 
программы 
Matthias Felleisen
Robert Bruce Findler
Matthew Flatt
Shriram Krishnamurthi

The MIT Press
Cambridge, Massachusetts
London, England

How to Design Programs

An Introduction to Programming and 
Computing

Second Edition
Маттиас Фелляйзен
Роберт Брюс Финдлер
Мэтью Флэтт
Шрирам Кришнамурти

Как проектировать программы

Введение в программирование  
и компьютерные вычисления

Москва, 2022
УДК 004.2
ББК 32.97
Ф37

Фелляйзен М., Финдлер Р. Б., Флэтт М., Кришнамурти Ш.
Ф37 Как проектировать программы / пер. с англ. А. Н. Киселева; под ред. 
П. Б. Иванова, А. Д. Чичигина, Ю. А. Сыровецкого, С. В. Бронникова. – М.: 
ДМК Пресс, 2022. – 724 с.: ил. 

ISBN 978-5-97060-926-2

Эта книга повествует о методах «хорошего программирования» – то есть о таком 
подходе к созданию программного обеспечения, который опирается на системное 
мышление, планирование и понимание задач разработчика на каждом этапе. 
В числе рассматриваемых тем – фундаментальные понятия систематического 
проектирования, типы данных, способы записи объемных данных, создание 
и использование абстракций, тестирование программ и функций и др.
Издание адресовано профессионалам и энтузиастам программирования, не 
имеющим прежнего опыта систематического проектирования программ, а также 
преподавателям технических вузов, которые могут использовать представленный 
материал в рамках учебного курса.

УДК 004.2
ББК 32.97

The rights to the russian launguage edition obtained thougth Alxander Korgzhenevski Agency 
(Moscow). All rights reserved. 

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

ISBN 978-0-26253-480-2 (англ.) 
© Massachusetts Institute of Technology, 2018
 
Illustrations © Torrey Butzer, 2000
ISBN 978-5-97060-926-2 (рус.) 
©  Перевод, оформление, издание, ДМК Пресс, 2022
Содержание

От редакторов .................................................................................................................... 10

От издательства ................................................................................................................. 11

Вступление ......................................................................................................................... 12

Пролог: как писать программы ....................................................................................... 29

I 
ДАННЫЕ ФИКСИРОВАННОГО РАЗМЕРА ........................................55

1 
Арифметика ................................................................................................................ 56
1.1. Арифметика чисел ............................................................................................... 57
1.2. Арифметика строк................................................................................................ 59
1.3. А теперь все смешаем .......................................................................................... 61
1.4. Арифметика изображений .................................................................................. 63
1.5. Арифметика логических значений ..................................................................... 66
1.6. Смешанные операции с логическими значениями .......................................... 67
1.7. Предикаты: знай свои данные ............................................................................. 69

2 
Функции и программы .............................................................................................. 72
2.1. Функции ................................................................................................................ 72
2.2. Вычисления .......................................................................................................... 76
2.3. Композиция функций .......................................................................................... 80
2.4. Глобальные константы ......................................................................................... 83
2.5. Программы ........................................................................................................... 85

3 
Как проектировать программы ............................................................................... 98
3.1. Проектирование функций ................................................................................... 99
3.2. Практические упражнения: функции ................................................................106
3.3. Знание предметной области ..............................................................................106
3.4. От функций к программам .................................................................................107
3.5. О тестировании ...................................................................................................108
3.6. Проектирование интерактивных программ .....................................................110
3.7. Миры виртуальных питомцев ............................................................................120

4 
Интервалы, перечисления и детализация ............................................................122
4.1. Программирование с условиями .......................................................................122
4.2. Условные вычисления .........................................................................................124
4.3. Перечисления ......................................................................................................127
4.4. Интервалы ...........................................................................................................131
4.5. Детализация ........................................................................................................135
4.6. Проектирование с использованием детализации ............................................143
4.7. Миры с конечными состояниями .......................................................................146

5 
Добавляем структуру ...............................................................................................154
5.1. От позиций к структурам posn ...........................................................................154
5.2. Вычисления со структурами posn ......................................................................155
5.3. Программирование с posn ..................................................................................156
5.4. Определение структурных типов .......................................................................158
5.5. Вычисления со структурами ...............................................................................163
5.6. Программирование со структурами ..................................................................167
5.7. Вселенная данных ...............................................................................................174
Содержание

5.8. Проектирование с использованием структур ...................................................178
5.9. Структура в мире .................................................................................................181
5.10. Графический редактор ......................................................................................182
5.11. Больше виртуальных питомцев .......................................................................184

6 
Структуры и детализация ........................................................................................187
6.1. Проектирование с использованием детализации, снова .................................187
6.2. Смешивание миров .............................................................................................200
6.3. Ошибки ввода ......................................................................................................203
6.4. Проверка состояния мира...................................................................................207
6.5. Предикаты равенства ..........................................................................................209

7 
Итоги ...........................................................................................................................211

Интермеццо 1. Язык для начинающих студентов .......................................................212
Словарь BSL ................................................................................................................212
Грамматика BSL .........................................................................................................213
Значение в языке BSL ................................................................................................217
Значения и вычисления ............................................................................................220
Ошибки в BSL .............................................................................................................220
Логические выражения .............................................................................................223
Определения констант ..............................................................................................224
Определения структур ...............................................................................................226
Тесты в BSL .................................................................................................................228
Сообщения об ошибках в BSL ...................................................................................229

II ДАННЫЕ ПРОИЗВОЛЬНОГО РАЗМЕРА ...........................................237

8 
Списки ........................................................................................................................238
8.1. Создание списков ................................................................................................238
8.2. Что такое '(), что такое cons ................................................................................243
8.3. Программирование со списками .......................................................................245
8.4. Вычисления со списками ....................................................................................249

9 
Проектирование с определениями данных, ссылающимися  
на самих себя ............................................................................................................251
9.1. Практические упражнения: списки ...................................................................258
9.2. Непустые списки .................................................................................................260
9.3. Натуральные числа .............................................................................................266
9.4. Русская матрешка ................................................................................................270
9.5. Списки в интерактивных программах ..............................................................274
9.6. Замечания о списках и множествах ...................................................................279

10 Еще о списках............................................................................................................284
10.1. Функции, создающие списки ...........................................................................284
10.2. Структуры в списках .........................................................................................287
10.3. Списки в списках, файлы ..................................................................................291
10.4. И снова о графическом редакторе ...................................................................300

11 Проектирование методом композиции ................................................................312
11.1. Функция list .......................................................................................................312
11.2. Композиция функций .......................................................................................314
Содержание

11.3. Повторяющиеся вспомогательные функции ..................................................316
11.4. Обобщающие вспомогательные функции.......................................................323

12 Проекты: списки .......................................................................................................333
12.1. Реальные данные: словари ...............................................................................333
12.2. Реальные данные: iTunes ..................................................................................335
12.3. Игры со словами, иллюстрация приема композиции ....................................340
12.4. Игры со словами, суть проблемы .....................................................................345
12.5. «Питон» ..............................................................................................................347
12.6. Простой «Тетрис» ..............................................................................................350
12.7. Полная игра «Космические захватчики» .........................................................353
12.8. Конечные автоматы ..........................................................................................354

13 Итоги ...........................................................................................................................362

Интермеццо 2. Quote, unquote .......................................................................................364
Цитирование ..............................................................................................................364
Квазицитирование и антицитирование ..................................................................365
Объединение с антицитированием ..........................................................................370

III АБСТРАКЦИИ ....................................................................................................375

14 Сходства повсюду.....................................................................................................376
14.1. Сходства в функциях .........................................................................................376
14.2. Отличающиеся сходства ...................................................................................378
14.3. Сходства в определениях данных ....................................................................381
14.4. Функции – это значения ...................................................................................384
14.5. Вычисления с функциями ................................................................................385

15 Проектирование абстракций ..................................................................................389
15.1. Абстрагирование примеров .............................................................................389
15.2. Сходства в сигнатурах .......................................................................................394
15.3. Единая точка управления  ................................................................................399
15.4. Абстрагирование макетов ................................................................................400

16 Использование абстракций .....................................................................................402
16.1. Имеющиеся абстракции ...................................................................................403
16.2. Локальные определения ...................................................................................405
16.3. Локальные определения добавляют выразительности ..................................409
16.4. Вычисления с локальными определениями ....................................................411
16.5. Использование абстракций на примерах ........................................................415
16.6. Проектирование с использованием абстракций ............................................420
16.7. Практические упражнения: абстракция ..........................................................422
16.8. Проекты: абстракция ........................................................................................423

17 Безымянные функции ..............................................................................................426
17.1. Определение функций с по мощью лямбда-выражений.................................427
17.2. Вычисления с лямбда-выражениями ...............................................................429
17.3. Абстрагирование с по мощью лямбда-выражений ..........................................432
17.4. Определение спецификаций с по мощью лямбда-выражений ......................435
17.5. Представление с по мощью лямбда-выражений .............................................442

18 Итоги ...........................................................................................................................447
Содержание

Интермеццо 3. Область видимости и абстракции .......................................................448
Область видимости ....................................................................................................448
Циклы в языке ISL ......................................................................................................453
Сопоставление с образцом ........................................................................................461

IV ПЕРЕПЛЕТАЮЩИЕСЯ ДАННЫЕ ........................................................... 468

19 Поэзия S-выражений ...............................................................................................469
19.1. Деревья ...............................................................................................................469
19.2. Леса .....................................................................................................................477
19.3. S-выражения ......................................................................................................479
19.4. Проектирование с использованием взаимосвязанных данных ....................485
19.5. Проект: BST ........................................................................................................487
19.6. Упрощение функций .........................................................................................491

20 Итеративное уточнение ...........................................................................................494
20.1. Анализ данных ..................................................................................................494
20.2. Уточнение определений данных ......................................................................496
20.3. Уточнение функций ..........................................................................................498

21 Уточнение интерпретатора .....................................................................................501
21.1. Интерпретация выражений ..............................................................................501
21.2. Интерпретация переменных ............................................................................504
21.3. Интерпретация функций ..................................................................................507
21.4. Интерпретация всего и вся ...............................................................................509

22 Проект: обработка XML ...........................................................................................512
22.1. XML как S-выражения .......................................................................................512
22.2. Отображение XML-перечислений ....................................................................518
22.3. Предметно-ориентированные языки ..............................................................523
22.4. Чтение XML ........................................................................................................528

23 Одновременная обработка .....................................................................................533
23.1. Одновременная обработка двух списков: случай 1 ........................................533
23.2. Одновременная обработка двух списков: случай 2 ........................................534
23.3. Одновременная обработка двух списков: случай 3 ........................................537
23.4. Упрощение функций .........................................................................................541
23.5. Проектирование функций с двумя сложными аргументами .........................542
23.6. Практические упражнения: два аргумента .....................................................544
23.7. Проект: база данных ..........................................................................................548

24 Итоги ...........................................................................................................................560

Интермеццо 4. Природа чисел .......................................................................................561
Арифметика с числами фиксированного размера ..................................................561
Переполнение ............................................................................................................567
Потеря значимости ....................................................................................................567
Числа в *SL ..................................................................................................................568

V ГЕНЕРАТИВНАЯ РЕКУРСИЯ ....................................................................574

25 Нестандартная рекурсия .........................................................................................575
25.1. Рекурсия без структуры ....................................................................................575
Содержание

25.2. Рекурсия, игнорирующая структуру ................................................................579

26 Проектирование алгоритмов ..................................................................................585
26.1. Адаптация рецепта проектирования ...............................................................585
26.2. Завершимость рекурсии ...................................................................................587
26.3. Структурная и генеративная рекурсии ............................................................590
26.4. Выбор .................................................................................................................591

27 Вариации на тему .....................................................................................................597
27.1. Фракталы, первое знакомство ..........................................................................597
27.2. Бинарный поиск ................................................................................................600
27.3. Синтаксический анализ ....................................................................................606

28 Математические примеры ......................................................................................610
28.1. Метод Ньютона ..................................................................................................610
28.2. Интегрирование ................................................................................................614
28.3. Проект: гауссово исключение...........................................................................621

29 Алгоритмы с возвратами .........................................................................................627
29.1. Обход графов .....................................................................................................627
29.2. Проект: возврат .................................................................................................636

30 Итоги ...........................................................................................................................643

Интермеццо 5. Стоимость вычислений..........................................................................644
Конкретное время, абстрактное время ....................................................................645
Определение термина «порядка» .............................................................................651
Почему программы используют предикаты и селекторы? .....................................654

VI АККУМУЛЯТОРЫ ............................................................................................658

31 Потеря знаний ...........................................................................................................659
31.1. Проблема структурной обработки ...................................................................659
31.2. Проблема генеративной рекурсии ...................................................................663

32 Проектирование функций с аккумулятором ........................................................668
32.1. Условия применения аккумулятора .................................................................668
32.2. Добавление аккумуляторов ..............................................................................670
32.3. Преобразование простых функций в функции с аккумуляторами ...............672
32.4. Графический редактор с поддержкой мыши ..................................................684

33 Дополнительные примеры использования аккумуляторов ...............................687
33.1. Аккумуляторы и деревья ..................................................................................687
33.2. Представления данных с аккумуляторами......................................................693
33.3. Аккумуляторы как результаты .........................................................................699

34 Итоги ...........................................................................................................................706

Эпилог: что дальше ..........................................................................................................708

Предметный указатель ....................................................................................................714
От редакторов

Добрый день! Спасибо, что вы открыли эту книгу, даже если взяли 
с полки магазина просто посмотреть. Нам приятно в любом случае. 
Для нас удача и честь принять участие в переводе такой легендарной 
книги, чтобы вы могли прочесть ее на родном языке.
Что же делает ее легендарной? Вы наверняка заметили, что это 
перевод второго издания, которое вышло уже почти 5 лет назад, 
а первое – более 20 лет назад. Оставаться востребованным столько 
лет в стремительно меняющемся мире информационных технологий 
и языков программирования – достижение само по себе.
Авторы книги – легенды мира компьютерных наук и информатики, 
авторы фундаментальных работ на протяжении последних 30 лет. 
Они же являются одними из пионеров систематического, научного 
подхода к преподаванию программирования и информатики. Как результат, 
данная книга является отражением глубокого понимания как 
самого предмета, так и методики его преподавания, сформировавшегося 
у авторов за десятилетия практики.
Другой фактор долголетия этого учебника – то, что он живой. Книга 
продолжает развиваться даже после публикации: в неё постоянно вносят 
правки и уточнения, исправляют ошибки, она используется в ка-
чест ве основы для курсов в университетах и на онлайн-площадках.
В результате получился один из лучших в мире учебников по программированию 
для новичков, который увлекательно читать, который 
никогда не перегружает лишними деталями, всегда ясно указывает 
направление развития и ненавязчиво прививает правила «хорошего 
тона».
Авторы справедливо отмечают, что это учебник по чему-то большему, 
чем просто программирование. В первую очередь он учит тому, 
что в последнее время принято называть «computational thinking», 
«алгоритмическим (или вычислительным) мышлением». Этим стилем 
мышления пользуются не только программисты, но и повара, 
учителя, спортсмены, врачи и многие, многие другие.
Авторы книги скромничают, когда говорят, что книга ориентирована 
на начинающих. Профессионалы встретят в ней как отсылки 
к фундаментальным понятиям и методам компьютерных наук, так 
и эффективные методы анализа повседневных задач. Поэтому от 
всего сердца советуем вам купить эту книгу! Мы от этого богаче не 
станем, но верим, что вас она способна обогатить интеллектуально, 
творчески и профессионально, даже если разработка программного 
обеспечения – не ваша основная деятельность.

С уважением от редакторов,
Павел Борисович Иванов,
Александр Дмитриевич Чичигин,
Юрий Алексеевич Сыровецкий,
Сергей Викторович Бронников
От издательства

Отзывы и пожелания

Мы всегда рады отзывам наших читателей. Расскажите нам, что вы 
ду маете об этой книге, – что понравилось или, может быть, не понравилось. 
Отзывы важны для нас, чтобы выпускать книги, которые 
будут для вас максимально полезны.
Вы можете написать отзыв на нашем сайте www.dmkpress.com, 
зайдя на страницу книги и оставив комментарий в разделе «Отзывы 
и рецензии». Также можно послать письмо главному редактору по 
адресу dmkpress@gmail.com; при этом укажите название книги в теме 
письма. 
Если вы являетесь экспертом в какой-либо области и заинтересованы 
в написании новой книги, заполните форму на нашем сайте по 
адресу http://dmkpress.com/authors/publish_book/ или напишите в издательство 
по адресу dmkpress@gmail.com.

Список опечаток

Хотя мы приняли все возможные меры для того, чтобы обеспечить 
высокое качество наших текстов, ошибки все равно случаются. Если 
вы найдете ошибку в одной из наших книг, мы будем очень благодарны, 
если вы сообщите о ней главному редактору по адресу dmkpress@
gmail.com. Сделав это, вы избавите других читателей от недопонимания 
и поможете нам улучшить последующие издания этой книги. 

Нарушение авторских прав

Пиратство в интернете по-прежнему остается насущной проблемой. 
Издательства «ДМК Пресс» и The MIT Press очень серьезно относятся 
к вопросам защиты авторских прав и лицензирования. Если вы столкнетесь 
в интернете с незаконной публикацией какой-либо из наших 
книг, пожалуйста, пришлите нам ссылку на интернет-ресурс, чтобы 
мы могли применить санкции.
Ссылку на подозрительные материалы можно прислать по адресу 
элект ронной почты dmkpress@gmail.com.
Мы высоко ценим любую помощь по защите наших авторов, благодаря 
которой мы можем предоставлять вам качественные мате риалы. 
Вступление

Многие современные профессии требуют умения программировать 
в той или иной форме. Бухгалтеры программируют электронные таблицы; 
музыканты программируют синтезаторы; писатели программируют 
текстовые процессоры; а веб-дизайнеры программируют 
таб лицы стилей. Когда мы писали эти слова для первого издания книги (
1995–2000), читатели могли счесть их футуристическими, однако 
к настоящему времени умение программировать стало обязательным, 
и появились многочисленные книги, онлайн-курсы и предметы 
в общеобразовательной школе, которые удовлетворяют эту потребность 
и улучшают шансы людей на трудоустройство.
Типичный курс программирования учит подходу «Пробуй, пока не 
заработает». Добившись нужного результата, учащийся восклицает: 
«Работает!» – и идет дальше. К сожалению, эта фраза также является 
самой короткой небылицей в информатике и многим людям стоила 
многих часов их жизни. Эта книга, напротив, фокусируется на навыках 
хорошего программирования и адресована всем – и профессиональным 
программистам, и любителям.
Под «хорошим программированием» мы подразумеваем подход 
к созданию программного обеспечения, который изначально опирается 
на системное мышление, планирование и понимание на каж дом 
этапе и на каждом шаге. Чтобы подчеркнуть это, мы говорим о системном 
проектировании программ и системно спроектированных 
программах. Что особенно важно, последнее словосочетание ясно 
выражает требование к желаемой функциональности. Хорошее программирование 
также удовлетворяет эстетическое чувство выполненного 
долга; хорошая программа по своей элегантности сравнима 
с хорошими стихами или черно-белыми фотографиями ушедшей 
эпохи. Проще говоря, программирование отличается от хорошего 
программирования как наброски карандашом на салфетке, сделанные 
в закусочной, от картин маслом в музее.
Нет, эта книга не превратит вас в мастера живописи. Но мы не стали 
бы тратить пятнадцать лет на подготовку данного издания, если 
бы не верили, что

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

Более того, мы утверждаем, что

проектирование программ – но не программирование –  
в традиционном для Запада высшем образовании должно стоять  
рядом с математикой и лингвистикой.

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

навыки решения задач, приобретет опыт творческой деятельности 
и научится ценить новую форму эстетики. Остальная часть этого 
вступления подробно объясняет, что мы имеем в виду под «системным 
проектированием», кому и чем это выгодно и как мы обучаем 
всему этому.

Системное проектирование программ

Программа взаимодействует с людьми, которых называют пользователями, 
и другими программами, которые могут быть серверами 
или клиентами. Соответственно, любая более или менее полная программа 
состоит из множества строительных блоков, одни из которых 
обрабатывают ввод,  другие производят вывод, а третьи соединяют 
первые со вторыми. В качестве фундаментальных строительных блоков 
мы предпочитаем использовать функции, потому что все мы хорошо 
знакомы с функциями по курсу школьной математики и потому 
что простейшие программы являются именно такими 
функция ми. Главное – выяснить, какие функции необходимы, 
как их соединить между собой и как их сконструировать 
из основных ингредиентов.
В этом контексте «системное проектирование программ» 
означает сочетание двух составляющих: рецептов проектирования 
и итеративного уточнения. Рецепты проектирования – 
это изобретение авторов, обеспечивающее возможность 
итеративного уточнения.
Рецепты проектирования применимы как к целым 
программам, так и к отдельным функциям. В этой книге 
есть всего два рецепта для целых программ: один для 
программ с графическим пользовательским интерфейсом 
(Graphical User Interface, GUI) и другой для неинтерактив-
ных программ. Рецепты проектирования функций, напротив, намного 
разнообразнее: для данных атомарных типов, таких как числа; для 
перечислений разных видов данных; для данных, которые фиксированным 
образом объединяют другие данные; для конечных, но произвольно 
больших данных; и так далее.
Рецепты проектирования для функций объединяются 
общим процессом проектирования. В списке в рецепте 1 
перечислены шесть основных шагов этого процесса. Название 
каждого шага сообщает ожидаемый результат(ы), 
а «команды» определяют ключевые действия. Центральную 
роль в этом процессе играют примеры. Для представления 
данных, выбранного на шаге 1, примеры иллюстрируют, 
как фактическая информация кодируется в данные и как 
данные интерпретируются в информацию. В шаге 3 говорится, 
что человек, решающий задачу, должен проработать конкрет-

Мы черпали вдохновение 
в методе, предложенном 
Майклом Джексоном 
(Michael Jackson) для 
создания программ на 
языке COBOL, а также 
в беседах с Дэниелом 
Фридманом (Daniel 
Friedman) о рекурсии, 
Робертом Харпером 
(Robert Harper) о теории 
типов и Дэниелом Джексоном (
Daniel Jackson) 
о проектировании программного 
обеспечения.

Преподавателям. 
Попросите учащихся 
скопировать рецепт 1 
на картонную карточку. 
Когда у кого-то из них 
возникнет проблема,  
попросите их предъявить 
карточку и указать 
шаг, на котором они 
застряли.
Вступление

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

Рецепт 1. Базовый рецепт проектирования функций
1.  Анализ задачи и определение данных. Определите, какая 
информация и как должна быть представлена в выбранном 
языке программирования. Сформулируйте определения данных 
и проиллюстрируйте их примерами.
2.  Сигнатура, описание назначения, заголовок. Укажите, какие 
данные функция принимает и выдает. Сформулируйте короткий 
ответ на вопрос: «что вычисляет функция?» Определите 
заглушку с соответствующей сигнатурой.
3.  Примеры использования функции. Представьте примеры, 
иллюстрирующие назначение функции.
4.  Создание макета функции. Используя определения данных, 
напишите набросок функции.
5.  Определение функции. Заполните недостающие части в макете 
функции. Используйте определение назначения и примеры.
6.  Тестирование. Переформулируйте примеры в тесты и убедитесь, 
что функция успешно выполняет их все. Это поможет обнаружить 
вкравшиеся ошибки. Кроме того, тесты дополнят 
примеры и помогут другим понять определение функции, если 
в этом возникнет необходимость, а она всегда возникает в любой 
серьезной программе.

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

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

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

DrRa cket и учебные языки

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

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