Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

• Вовремя ли прибудет самолет, вылетающий в Чикаго в 12:30?

• Болел ли Гильберт Салливан корью?

• Поступила ли на склад кофеварка, которую заказал Хуан Вальдез?

• Какую кухонную мебель купил Джек Спрат в 1996 году и покупал ли он ее вообще?

• Сколько телефонных звонков поступило из зоны 212 в августе 2006 года?

• Сколько кофейных чашек было продано в январе и чему равна их совокупная стоимость?

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

Этот вид использования компьютеров часто называют обработкой информации. Он

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

1.5.6. Вид сверху

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

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

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

Программы управления марсоходами, конечно, являются компьютерными программами, — двигатель марсохода работает автономно и круглосуточно, подчиняясь командам, посылаемым с Земли за день до их выполнения. Передача команд управляется программами. Операционные системы, используемые на разных компьютерах, вовлеченных в управление марсоходами, передачей команд и реконструкцией фотографий, ничем не отличаются от приложений, используемых при редактировании этой главы. Компьютеры, на которых запускаются эти программы, в свою очередь, разработаны и созданы с помощью систем компьютерного проектирования и производства CAD/CAM. Микросхемы, входящие в состав этих ком пьютеров, произведены на компьютеризованных сборочных линиях с использованием высокоточных инструментов, причем сами эти инструменты спроектированы и созданы с помощью компьютеров (и программного обеспечения).

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

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

1.5.7. И что?

Какое отношение все эти превосходные и сложные приложения и системы программного обеспечения имеют к изучению
программирования и языка С++? Связь довольно очевидная — для того чтобы специалисты могли успешно выполнять такие проекты, они должны хорошо знать программирование и языки программирования. Кроме того, каждый пример в этой главе связан с языком С++ и по крайней мере с одним из методов программирования, описанных в книге. Да, программы, написанные на С++, работают и в MP3-плеерах, и на кораблях, и в воздушных турбинах, и на Марсе, и в проекте по расшифровке генома человека. Остальные приложения, созданные с использованием языка С++, описаны на веб-странице
www.research.att.com/~bs/applications.html.

1.6. Идеалы программистов

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

Именно эти аспекты программного обеспечения (оборудования, систем) могут быть по достоинству оценены непрограммистами. Они должны служить для программистов идеалами, которые следует иметь в виду постоянно, особенно на ранних стадиях проектирования, если мы хотим разработать качественное программное обеспечение. Мы должны также учитывать требования к самому коду: он должен быть удобным в сопровождении; т.е. его структура должна быть такой, что-бы любой другой программист мог понять его и внести свои изменения. Успешная программа “живет” долго (часто десятки лет), постоянно изменяясь. Например, она может быть выполнена на новом аппаратном обеспечении, получить новые возможности, адаптироваться к новым средствам ввода-вывода (экраны, видео, звук), взаимодействовать с пользователями на новых естественных языках и т.д. Только неправильную программу невозможно модифицировать. Для удобства сопровождения программа должна быть относительно простой, а ее код должен непосредственно выражать идеи, лежащие в ее основе. Сложность — враг простоты и удобства — может быть присуща самой проблеме (в этом случае мы должны просто как-то с этим справиться), но она также может быть следствием неудачного выражения идей, заложенных в программе. Мы должны избегать этого, придерживаясь хорошего стиля программирования — стиль имеет значение!

Звучит довольно просто, но это далеко не так. Почему? В программировании по существу нет ничего сложного: просто сообщите компьютеру, что вы от него хотите. Почему же оно может потребовать большого напряжения сил? Ведь в компьютерах тоже нет ничего сложного; они просто выполняют определенные наборы операций, например складывают два числа и выбирают следующую инструкцию в зависимости от результата их сравнения. Проблема заключается в том, что мы не используем компьютеры для решения простых задач. Мы хотим, чтобы они решали задачи, которые нам самим не под силу, но при этом забываем, что вычислительные машины — это придирчивые, ничего не прощающие и безмолвные существа. Более того, мир устроен более сложно, чем мы думаем, поэтому часто не представляем, к каким последствиям могут привести наши запросы.

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

Такой образ мышления приводит к заключению, что “программирование — это понимание”: если вы можете запрограммировать задачу, значит, понимаете ее. И наоборот, если вы глубоко разобрались в задаче, то сможете написать и программу для ее решения. Иначе говоря, программирование можно рассматривать как часть усилий по исследованию проблемы. Программы — это точное представление нашего понимания задачи. Когда вы программируете, то проводите много времени, пытаясь понять задачу, которую хотите автоматизировать.

Поделиться:
Популярные книги

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Сердце Дракона. Том 9

Клеванский Кирилл Сергеевич
9. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.69
рейтинг книги
Сердце Дракона. Том 9

Дайте поспать! Том II

Матисов Павел
2. Вечный Сон
Фантастика:
фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Дайте поспать! Том II

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Сумеречный Стрелок 3

Карелин Сергей Витальевич
3. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 3

Возвращение

Кораблев Родион
5. Другая сторона
Фантастика:
боевая фантастика
6.23
рейтинг книги
Возвращение

Восход. Солнцев. Книга VIII

Скабер Артемий
8. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга VIII

Идеальный мир для Лекаря

Сапфир Олег
1. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря

На границе империй. Том 7

INDIGO
7. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
6.75
рейтинг книги
На границе империй. Том 7

Кодекс Крови. Книга V

Борзых М.
5. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга V

Адмирал южных морей

Каменистый Артем
4. Девятый
Фантастика:
фэнтези
8.96
рейтинг книги
Адмирал южных морей

Возвышение Меркурия. Книга 15

Кронос Александр
15. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 15

Измена

Рей Полина
Любовные романы:
современные любовные романы
5.38
рейтинг книги
Измена

Эффект Фостера

Аллен Селина
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Эффект Фостера