Программирование — страница 16 из 57

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

Эта книга о программировании, и мы пообещали научить вас программировать. Зачем же мы подчеркиваем важность остальных предметов и постоянно указываем на ограниченную роль программирования? Хороший программист понимает роль программ и техники программирования в работе над проектом. Хороший программист (в большинстве случаев) — это ответственный командный игрок, стремящийся сделать как можно более весомый вклад в решение общей задачи. Например, представьте себе, что работая над новым MP3-плеером, я заботился бы лишь о красоте своей программы и количестве технических тонкостей. Вероятно, я стал бы настаивать на том, чтобы моя программа выполнялась на самом мощном компьютере. Я бы пренебрег теорией кодирования звука, поскольку эта дисциплина не относится к программированию. Я бы оставался в стенах своей лаборатории и не стал бы встречаться с потенциальными пользователями, у которых, несомненно, дурной музыкальный вкус и которые, конечно, не способны оценить новейшие достижения в области разработки графического пользовательского интерфейса. Вполне вероятно, что результаты моей работы были бы катастрофическими для всего проекта. Чем более мощный компьютер я бы потребовал, тем дороже стал бы MP3-плеер и тем быстрее разряжались бы его батареи питания. Существенную часть цифровой обработки музыки занимает ее кодирование, поэтому пренебрежение современными методами кодирования информации привело бы к завышенным требованиям к объему памяти для каждой песни (кодирование может уменьшить объем песни почти вдвое без потери качества ее звучания). Игнорирование предпочтений потенциальных пользователей — какими бы странными и архаичными они ни казались — обычно приводит к тому, что они выбирают другой продукт. При разработке хороших программ важно понимать потребности пользователей и ограничения, которые необходимо накладывать на программный код. Для того чтобы завершить карикатурный образ программиста, упомянем о тенденции опаздывать и нарушать сроки поставки из-за одержимости деталями и слепой веры в правильность плохо отлаженной программы. Мы желаем вам стать хорошим программистом с широким кругозором. Эти два качества одинаково полезны для общества и являются ключевыми для удовлетворения от своей работы.

1.4. Компьютерные науки

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

В 1995 году правительство США выпустило так называемую “Голубую книгу”, в которой дано следующее определение компьютерных наук: “Систематическое изучение компьютерных систем и вычислений. Комплекс знаний, порождаемых этой дисциплиной, содержит теории компьютерных систем и методов; методы, алгоритмы и инструменты проектирования; методы проверки концепций; методы анализа и верификации; методы представления и реализации знаний”. Как и следовало ожидать, Википедия дает более неформальное определение: “Компьютерные науки, или науки о вычислениях, изучают теоретические основы информации и вычислений, а также методы их реализации и приложения в компьютерных системах. Компьютерные науки состоят из многих подобластей; одни сосредоточены на конкретных вычислениях (например, компьютерная графика), другие (например, теория вычислительной сложности) изучают абстрактные проблемы вычислений, третьи связаны с реализацией вычислений. Например, теория языков программирования изучает подходы к описанию вычислений, в то время как компьютерное программирование применяет языки программирования для решения конкретных вычислительных задач”.

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

1.5. Компьютеры повсюду

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

Многие люди представляют себе компьютер как небольшой серый ящик с экраном и клавиатурой. Такие компьютеры, как правило, стоят под письменным столом и хорошо подходят для игр, обмена сообщениями, электронной почты и воспроизведения музыкальных произведений. Другие компьютеры, ноутбуки, используются в самолетах занятыми бизнесменами, просматривающими базы данных, играющими в компьютерные игры и просматривающими видеофильмы. Эта карикатура — всего лишь вершина айсберга. Большинство компьютеров вообще не попадает в поле нашего зрения, и именно от их работы зависит существование нашей цивилизации. Одни компьютеры занимают целые комнаты, а другие не больше монетки. Многие из наиболее интересных компьютеров вообще не имеют непосредственной связи с людьми, осуществляемой с помощью клавиатуры, мыши или других устройств.

1.5.1. С экранами и без них

Представление о компьютере как о ящике с экраном и клавиатурой широко распространено и весьма устойчиво. Однако представим себе два следующих компьютера.

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



1.5.2. Кораблестроение

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



Посмотрим, в каком месте компьютеры и программное обеспечение могли бы сыграть ключевую роль.

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

Строительство. Современные корабли сильно компьютеризованы. Сборка корабля тщательно планируется с помощью компьютеров, а сам процесс осуществляется под управлением компьютеров. Сварка проводится роботами. В частности, современные двухкорпусные танкеры невозможно построить без маленьких роботов-сварщиков, способных проникнуть в пространство между корпусами. Там просто нет места, в которое мог бы протиснуться человек. Разрезание стальных плит для корабля было одним из первых приложений систем компьютерного проектирования и производства CAD/CAM (computer-aided design and computer-aided manufacture).

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

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

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


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

1.5.3. Телекоммуникации

На этих двух фотографиях изображены телефонный коммутатор и телефон (в который встроены фотоаппарат, MP3-плеер, FM-радиоприемник и веб-браузер).



Посмотрим, в каком месте компьютеры и программное обеспечение могли бы сыграть ключевую роль здесь. Допустим, вы берете в руку телефон и делаете вызов, а человек, которому вы звоните, отвечает вам, и вы начинаете разговор. А возможно, вы хотите соединиться с автоматизированной справочной системой, или послать фотографию, сделанную с помощью встроенного фотоаппарата, или послать текстовое сообщение (просто нажав кнопку “послать” и поручив всю остальную работу телефону). Очевидно, что такой телефон является компьютером. Это особенно ясно, если телефон (как большинство мобильных телефонов) имеет экран и предусматривает больше, чем обычные телефонные услуги, например функции веб-браузера. На самом деле такие телефоны содержат несколько компьютеров: один управляет экраном, другой обеспечивает связь с телефонной станцией, а третий делает что-то еще.

Часть телефона, которая управляет экраном, выполняет функции веб-браузера и решает другие задачи, возможно, покажется пользователям компьютеров наиболее знакомой: она просто запускает графический пользовательский интерфейс. Большинство пользователей даже не представляют, с какой огромной системой соединяется такой маленький телефонный аппарат, выполняя свою работу. Допустим, я нахожусь в Техасе, а вы — в Нью-Йорке, но уже через несколько секунд ваш телефон зазвонит, и я услышу “Алло!” на фоне городского гула. Многие телефоны способны выполнить этот фокус и соединить вас с любой точкой Земли, и вы принимаете это как должное. Как телефон находит вас? Как передается звук? Как этот звук шифруется в пакетах? Ответы на эти вопросы могут заполнить много книг, но в целом для этого необходима согласованная работа аппаратного и программного обеспечения сотен компьютеров, разбросанных по всему миру. Если вам не повезет, то несколько телекоммуникационных спутников (которые сами представляют собой компьютерные системы) также включатся в работу. Мы говорим “не повезет”, потому что не можем полностью компенсировать окольный путь длиной 20 тыс. миль; скорость света (а значит, скорость передачи вашего голоса) является конечной (оптоволоконные кабели значительно ускоряют передачу сигнала). Большинство этих функций выполняются отлично; коэффициент надежности основных телекоммуникационных систем достигает 99,9999% (например, они допускают лишь 20 минут простоя за 20 лет). Основные проблемы кроются в линиях связи между вашим мобильным телефоном и ближайшим телефонным коммуникатором.

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

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



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

1.5.4. Медицина

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



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

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

1.5.5. Информация

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



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

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

• 719 блоков.

• 63 272 компьютера.

• 126 544 центральных процессора.

• Производительность — 253 ТГц.

• Объем оперативной памяти — 126 544 Гбайт.

• Объем постоянной памяти — 5 062 Тбайт.


Гигабайт (Гбайт) — это около миллиарда символов. Терабайт (Tбайт) — это около тысячи гигабайтов, т.е. около триллиона символов. За прошедшее время группа серверов Google стала намного больше. Это довольно экстремальный пример, но каждая крупная компания выполняет программы в веб, чтобы взаимодействовать с пользователями и клиентами. Достаточно вспомнить компании Amazon (книжная и другая торговля), Amadeus (продажа авиабилетов и аренда автомобилей) и eBay (интернет-аукционы). Миллионы небольших компаний, организаций и частных лиц также работают в сети веб. Большинство из них не используют собственное программное обеспечение, но многие все же пишут свои программы, которые часто бывают совсем не тривиальными.

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

• Вовремя ли прибудет самолет, вылетающий в Чикаго в 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. Идеалы программистов