“Специализация нужна только насекомым”.
Р.А. Хайнлайн (R.A. Heinlein)
В этой главе излагаются темы, которые, по нашему мнению, делают программирование важным, интересным и радостным занятием. Мы также описываем несколько фундаментальных идей и принципов, надеясь развеять множество распространенных мифов о программировании и программистах. Пока эту главу достаточно просто просмотреть, но мы рекомендуем вернуться к ней впоследствии, когда вы начнете самостоятельно программировать и засомневаетесь, а стоит ли этим заниматься вообще.
Как и любой процесс обучения, преподавание программирования сводится к дилемме о яйце и курице. Мы хотим поскорее начать работу, но одновременно желаем объяснить, почему именно эти темы выбрали для изучения. Мы хотим передать вам практические навыки, но одновременно хотим убедить вас, что это не причуда, а необходимость. Мы не желаем терять время, но при этом не хотим подгонять вас и читать проповеди. Пока отнеситесь к данной главе как к обычному интересному тексту, а затем можете вернуться к ней, для того чтобы освежить в памяти.
Эта глава выражает нашу личную точку зрения на то, что мы считаем интересным и важным для программирования. В ней изложены причины, по которым мы вот уже много десятков лет занимаемся этим делом. Она должна помочь вам понять, в чем заключаются наши основные цели и какими бывают программисты. Учебники для начинающих неизбежно содержат массу прописных истин. В этой главе мы закрываем глаза на технические детали и предлагаем рассмотреть картину в целом. Почему программирование является достойным занятием? Какую роль играет программирование в нашей цивилизации? В каких областях программисты могут сделать вклад, которым могли бы гордиться? Какие задачи остались пока нерешенными в области разработки, развертывания и эксплуатации программного обеспечения? Какое место занимает программирование в области компьютерных наук, разработки программного обеспечения, информационных технологий и т.д.? Чем занимаются программисты? Какими навыками они должны владеть?
Для студентов основной причиной изучения какой-либо идеи, метода или главы учебника может быть простое желание получить хорошую оценку на экзамене, но должны же быть и более веские мотивы! Для людей, работающих в области разработки программного обеспечения, наиболее важной причиной изучения какой-либо идеи, метода или главы учебника может быть желание узнать нечто, что поможет ему заслужить одобрение босса, от которого зависит повышение зарплаты, продвижение по службе и увольнение, — но должны же быть и более веские мотивы! Лучше всего мы работаем, когда чувствуем, что наша работа делает мир лучше и помогает другим людям. Для задач, которые мы решаем годами (из которых, собственно, и складывается карьера профессионала), жизненно важными являются идеалы и более абстрактные идеи.
Жизнедеятельность нашей цивилизации зависит от программного обеспечения. Улучшение программного обеспечения и поиск новых областей для его применения позволит улучшить жизнь многих людей. Программирование играет в этом очень важную роль.
Хорошее программное обеспечение невидимо. Вы не можете его потрогать, взвесить или стукнуть. Программное обеспечение — это совокупность программ, выполняемых на определенном компьютере. Иногда мы можем пощупать этот компьютер, но чаще можем увидеть лишь устройство, содержащее этот компьютер, например телефон, фотоаппарат, тестер, автомобиль или воздушную турбину. Мы способны воспринимать лишь результаты работы программного обеспечения. Кроме того, если работа программного обеспечения не соответствует нашим ожиданиям или потребностям, это может стать поводом для беспокойства.
Сколько компьютеров существует в мире? Мы не знаем; по крайней мере, миллиарды. Компьютеров в мире больше, чем людей. В 2004 году по оценкам Международного телекоммуникационного союза (International Telecommunication Union — ITU) в мире насчитывалось 772 миллиона персональных компьютеров, причем большинство компьютеров в эту категорию не входило.
Сколько компьютеров (более или менее непосредственно) вы используете каждый день? Например, в моем автомобиле установлено более тридцати компьютеров, в мобильном телефоне — два, в MP3-плеере — один и еще один в видеокамере. Кроме того, у меня есть еще ноутбук (на котором я набирал текст, который вы сейчас читаете), а также настольный компьютер. Контроллер кондиционера, который летом поддерживает комфортную температуру и влажность, также представляет собой простой компьютер. В нашем университете компьютер управляет работой эскалатора. Если вы пользуетесь современными телевизорами, то обязательно найдете в нем хотя бы один компьютер. Переходя с одной веб-страницы на другую, вы соединяетесь с десятками, а возможно, и сотнями серверов через телекоммуникационные системы, состоящие из многих тысяч компьютеров: телефонных коммутаторов, маршрутизаторов и т.д.
Нет, я не храню тридцать ноутбуков на заднем сиденье своего автомобиля! Дело в том, что большинство компьютеров выглядят совсем не так, как мы привыкли (с дисплеем, клавиатурой, мышью и т.д.); они просто являются небольшим устройством, встроенным в используемое оборудование. Итак, в моем автомобиле нет ничего похожего на типичный компьютер, нет даже экрана для изображения карты и указания направления движения (хотя такие устройства весьма популярны). Однако двигатель моего автомобиля содержит несколько компьютеров, например, управляющих впрыскиванием топлива и контролирующих его температуру. По крайней мере, еще один компьютер встроен в рулевой механизм, в радиосистему и систему безопасности. Я подозреваю даже, что система, открывающая и закрывающая окна, управляется компьютером. В более современные автомобили встроены компьютеры, которые непрерывно контролируют даже давление в шинах.
От скольких компьютеров вы зависите на протяжении дня? Если вы живете в большом городе, то для того чтобы получить еду, кто-то должен совершить небольшие чудеса, связанные с планированием, транспортировкой и хранением продуктов. Разумеется, управление сетями распределения продуктов компьютеризовано, как и работа любых коммуникационных систем, требующих согласованной работы. Современные фермы также компьютеризованы; на них можно найти компьютеры, используемые как в хлеву, так и в бухгалтерии (для учета возраста, состояния здоровья коров, надоев и т.д.). Фермеры все шире используют компьютеры для делопроизводства, причем количество отчетов, которые необходимо отправлять в разные правительственные агентства, приводит их в отчаянье. О том, что происходит в мире, вы прочтете в газете; разумеется, статья в этой газете будет набрана на компьютерах, сверстана на компьютерах и напечатана на компьютеризованном оборудовании — часто после передачи в типографию в электронном виде. Если вам потребуется связь с удаленным компьютером, то трафик будет управляться компьютерами, которые попытаются (как правило, тщетно) избежать узких мест. Вы предпочитаете ездить на поезде? Этот поезд тоже будет компьютеризован; некоторые из поездов даже ездят без помощи машинистов, причем большинство бортовых систем поезда (объявления по радио, торможение и продажа билетов) состоит из множества компьютеров. Современную индустрию развлечений (музыку, фильмы, телевидение, театрализованные представления) тоже невозможно представить без использования компьютеров. Даже художественные фильмы производятся с массовым применением компьютеров; музыкальные произведения и фотографии также все чаще основаны на цифровых технологиях (т.е. создаются с помощью компьютеров) как при записи, так и при доставке. Если вы заболеете, то все анализы доктор проведет с помощью компьютеров, записи в медицинских книжках будут внесены в электронном виде, а большинство медицинского оборудования в больницах окажется компьютеризованным. Если вы не живете в лесной избушке без доступа к электричеству, то используете электроэнергию. Нефть обнаруживается, извлекается и транспортируется по системе трубопроводов, управляемых компьютерами на каждом этапе этого процесса: от погружения бура в землю до подачи топлива на местную насосную станцию. Если вы платите за бензин с помощью кредитной карточки, то снова задействуете огромное количество компьютеров. То же самое можно сказать о добыче и транспортировке угля, газа, а также солнечной и ветряной энергии.
Все приведенные выше примеры были “материальными”; они предусматривали непосредственное использование компьютеров в ежедневной жизнедеятельности. Не менее важной и интересной областью является проектирование. Одежда, которую вы носите, и кофеварка, в которой варите свой любимый кофе, были спроектированы и произведены с помощью компьютеров. Превосходное качество оптических линз в современных фотоаппаратах, а также утонченные формы современных технических устройств и посуды обеспечиваются компьютеризованным проектированием и производством. Производственники, проектировщики, артисты и инженеры, создающие окружающую нас среду, свободны от многих физических ограничений, которые ранее считались непреодолимыми. Если вы заболеете, то даже лекарство, которое выпишет врач, окажется синтезированным с помощью компьютеров.
В заключение отметим, что исследования — т.е. собственно наука — в целом основаны на использовании компьютеров. Телескопы, открывающие секреты далеких звезд, невозможно спроектировать, построить и эксплуатировать без помощи компьютеров, а огромные массивы данных, которые они производят, невозможно проанализировать и понять без компьютерной обработки. Отдельные биологические исследования иногда способны обойтись без широкого использования компьютеров (разумеется, если не учитывать фотоаппараты, устройства хранения данных, телефоны и т.д.), но данные все же необходимо как-то хранить, анализировать, сравнивать с компьютерными моделями и передавать другим ученым. Еще несколько лет назад невозможно было представить, насколько широко будут использоваться компьютеры в современной химии и биологии — включая медицинские исследования. Компьютеры смогли расшифровать геном человека. Точнее говоря, этот геном был расшифрован людьми с помощью компьютеров. Во всех этих примерах компьютер кардинально облегчает работу.
На каждом из упомянутых компьютеров установлено программное обеспечение. Без него компьютеры представляют собой просто дорогую груду кремния, металла и пластика, которую можно использовать лишь в качестве груза, якоря или обогревателя воздуха. Любое программное обеспечение создается людьми. Каждая строка программы, выполняемой компьютером, имеет определенный смысл. Очень странно, что все это работает! Ведь мы говорим о миллиардах строк программ, написанных на сотнях языков программирования. Для того чтобы все это правильно работало, люди затратили массу усилий и применили множество знаний.
Нет ни одного устройства, работу которого мы не хотели бы усовершенствовать. Достаточно просто задуматься о его функционировании, и вы сразу поймете, что именно требуется изменить. В любом случае каждое устройство можно уменьшить (или увеличить), заставить работать быстрее или надежнее, снабдить более широкими возможностями или мощностями, сделать красивее или дешевле. Очень вероятно, что для этого вам придется использовать программирование.
Компьютеры созданы людьми и для людей. Компьютер представляет собой универсальное устройство, его можно использовать для решения невероятно широкого спектра задач. Именно благодаря этому программы приносят пользу. Иначе говоря, компьютер — это просто груда железа, пока некто — программист — не напишет программу, делающую что-то полезное. Мы часто забываем о программном обеспечении. Еще чаще забываем о программисте.
Голливуд и другие “масскультовые” источники дезинформации создали программистам весьма негативный имидж. Например, по их мнению, программист — это одинокий толстый отщепенец, не имеющий социальных связей, не отрывающийся от видеоигр и постоянно залезающий в чужие компьютеры. Он (почти все программисты в фильмах — мужчины) либо стремится разрушить весь мир, либо спасти его. Разумеется, в реальном мире существуют люди, отдаленно напоминающие эту карикатуру, но наш опыт показывает, что среди программистов они встречаются не чаще, чем среди адвокатов, полицейских, продавцов автомобилей, журналистов, артистов и политиков.
Подумайте об известных вам компьютерных приложениях. Можете вспомнить приложение, используемое одиночкой в темной комнате? Конечно, нет! Разработка фрагментов программного обеспечения, компьютерных устройств или систем невозможна без совместной работы десятков, сотен и даже тысяч людей, играющих невероятно разнообразные роли: например, среди них есть программисты, проектировщики, тестировщики, аниматоры, менеджеры фокус–групп, экспериментальные психологи, разработчики пользовательского интерфейса, аналитики, системные администраторы, специалисты по связям с потребителями, звукоинженеры, менеджеры проектов, инженеры по качеству, статистики, разработчики интерфейсов аппаратного обеспечения, специалисты по разработке технических заданий, сотрудники службы безопасности, математики, продавцы, ремонтники, проектировщики сетей, специалисты по методологии, менеджеры по разработке программного обеспечения, специалисты по созданию библиотек программ и т.п. Диапазон ролей огромен и неисчерпаем, при этом их названия варьируются: инженер в одной организации в другой компании может называться программистом, разработчиком, членом технической команды или архитектором. Существуют даже организации, позволяющие своим сотрудникам самим выбирать, как называются их должности. Не все эти роли непосредственно связаны с программированием. Однако лично нам приходилось встречаться с людьми, основным занятием которых было читать или писать программы. Кроме того, программист (выполняющий одну или несколько из указанных ролей) может некоторое время контактировать со многими людьми из других прикладных областей: биологами, конструкторами автомобилей, адвокатами, продавцами автомобилей, медиками, историками, геологами, астронавтами, авиаконструкторами, менеджерами лесопилок, ракетостроителями, проектировщиками боулингов, журналистами и мультипликаторами (да, этот список — результат личного опыта). Некоторые из них также могут быть некоторое время программистами, а затем занять должность, не связанную с программированием.
Миф о программисте-одиночке — просто выдумка. Люди, предпочитающие самостоятельно выбирать задания, лучше всего соответствующие их способностям, обычно горько жалуются на то, что их часто отвлекают или вызывают на совещания. Люди, предпочитающие контактировать с другими людьми, чувствуют себя намного комфортнее, так как разработка современного программного обеспечения — коллективное занятие. По этой причине социальные связи и навыки общения для программистов имеют намного более высокую ценность, чем считается. Одним из наиболее желательных навыков программиста (реального программиста) является умение общаться с разными людьми — на совещаниях, посредством писем и на формальных презентациях. Мы убеждены, что, не завершив один-два коллективных проекта, вы не получите представления о том, что такое программирование и действительно ли оно вам нравится. В частности, мы любим программирование за возможность общаться с приятными и интересными людьми и посещать разные города.
Единственной сложностью является то, что все эти люди имеют разное образование, интересы и привычки, влияющие на производство хорошего программного обеспечения. От этих людей зависит качество нашей жизни — иногда даже сама жизнь. Ни один человек не может играть все роли, упомянутые выше; да и, вообще, ни один разумный человек к этому не стремится. Мы перечислили их, чтобы показать, что вы имеете намного более широкий выбор возможностей, чем можете себе представить. Можете перебирать разные области занятий, выбирая то, что лучше всего соответствует вашим умениям, талантам и интересам.
Мы все время говорим о программистах и программировании, но совершенно очевидно, что программирование — это только часть общей картины. Люди, разрабатывающие корабли или мобильные телефоны, не считают себя программистами. Кроме того, хотя программирование — важная часть разработки программного обеспечения, разработка программного обеспечения — это не только программирование. Аналогично, для большинства товаров разработка программного обеспечения — это важная часть производства, но не все производство.
Мы вовсе не предполагаем, что вы — наш читатель — стремитесь стать профессиональным программистом и провести все оставшееся рабочее время в написании программ. Даже самые лучшие программисты — и особенно лучшие программисты — тратят большую часть своего времени вовсе не на кодирование программ. Анализ задачи требует серьезных затрат времени и значительных интеллектуальных усилий. Именно за это многие программисты любят программирование. Помимо этого, многие из лучших программистов имеют научные степени по дисциплинам, которые не считаются частью компьютерных наук. Например, если вы работаете над программным обеспечением для исследований генома, ваша работа станет намного эффективнее, если вы будете разбираться в молекулярной биологии. Если же вы работаете над анализом средневековых текстов, то сможете написать гораздо более эффективные программы, если будете знать эту литературу и, возможно, один или несколько древних языков. В частности, люди, утверждающие, что их интересуют только компьютеры и программирование, обычно просто не в состоянии общаться с коллегами-непрограммистами. Такие люди не только лишены роскоши человеческого общения (в чем собственно и состоит жизнь), но и, как правило, разрабатывают плохое программное обеспечение.
Итак, в чем заключается наша точка зрения? Программирование — это набор навыков, требующих интеллектуальных усилий и образующих часть многих важных и интересных технических дисциплин. Кроме того, программирование — это существенная часть окружающего нас мира, поэтому не знать основы программирования — это то же самое, что не знать основ физики, истории, биологии или литературы. Если человек полностью игнорирует программирование, значит, он верит в чудеса и опасен на технической должности. Если вы читали Дилберта (Dilbert), то вспомните образ начальника с волосатыми пальцами и поймете, какой тип менеджера никогда не хотелось бы встретить в своей жизни и (что было бы еще ужаснее) каким руководителем вам никогда не хотелось бы стать. Кроме того, программирование часто бывает веселым занятием.
Так для чего же вам может понадобиться программирование? Может быть, вы будете использовать его как основной инструмент своих исследований, не став профессиональным программистом. Возможно, вы будете профессионально общаться с другими людьми, работая в областях, в которых знание программирования может дать существенное преимущество, например, став конструктором, писателем, менеджером или ученым. Может быть, освоив программирование на профессиональном уровне, вы сможете сделать его частью своей работы. Даже если вы станете профессиональным программистом, маловероятно, что вы не будете знать ничего, кроме программирования.
Вы можете стать инженером, занимающимся конструированием компьютеров, или специалистом по компьютерным наукам, но и в этом случае вы не будете все время программировать. Программирование — это способ выражения своих идей в виде программ. Это помогает решать задачи. Программирование становится совершенно бесполезной тратой времени, если у вас нет идей, которые вы хотели бы выразить, и нет задач, которые стоило бы решить.
Эта книга о программировании, и мы пообещали научить вас программировать. Зачем же мы подчеркиваем важность остальных предметов и постоянно указываем на ограниченную роль программирования? Хороший программист понимает роль программ и техники программирования в работе над проектом. Хороший программист (в большинстве случаев) — это ответственный командный игрок, стремящийся сделать как можно более весомый вклад в решение общей задачи. Например, представьте себе, что работая над новым MP3-плеером, я заботился бы лишь о красоте своей программы и количестве технических тонкостей. Вероятно, я стал бы настаивать на том, чтобы моя программа выполнялась на самом мощном компьютере. Я бы пренебрег теорией кодирования звука, поскольку эта дисциплина не относится к программированию. Я бы оставался в стенах своей лаборатории и не стал бы встречаться с потенциальными пользователями, у которых, несомненно, дурной музыкальный вкус и которые, конечно, не способны оценить новейшие достижения в области разработки графического пользовательского интерфейса. Вполне вероятно, что результаты моей работы были бы катастрофическими для всего проекта. Чем более мощный компьютер я бы потребовал, тем дороже стал бы MP3-плеер и тем быстрее разряжались бы его батареи питания. Существенную часть цифровой обработки музыки занимает ее кодирование, поэтому пренебрежение современными методами кодирования информации привело бы к завышенным требованиям к объему памяти для каждой песни (кодирование может уменьшить объем песни почти вдвое без потери качества ее звучания). Игнорирование предпочтений потенциальных пользователей — какими бы странными и архаичными они ни казались — обычно приводит к тому, что они выбирают другой продукт. При разработке хороших программ важно понимать потребности пользователей и ограничения, которые необходимо накладывать на программный код. Для того чтобы завершить карикатурный образ программиста, упомянем о тенденции опаздывать и нарушать сроки поставки из-за одержимости деталями и слепой веры в правильность плохо отлаженной программы. Мы желаем вам стать хорошим программистом с широким кругозором. Эти два качества одинаково полезны для общества и являются ключевыми для удовлетворения от своей работы.
Даже в самом широком смысле программирование является частью более крупной научной дисциплины. Мы можем рассматривать ее как часть компьютерных наук, компьютерной техники, информационных технологий или другой научной дисциплины, связанной с программным обеспечением. Программирование является вспомогательной технологией, используемой как в информатике, так и в технике, физике, биологии, медицине, истории, литературе и других академических областях.
В 1995 году правительство США выпустило так называемую “Голубую книгу”, в которой дано следующее определение компьютерных наук: “Систематическое изучение компьютерных систем и вычислений. Комплекс знаний, порождаемых этой дисциплиной, содержит теории компьютерных систем и методов; методы, алгоритмы и инструменты проектирования; методы проверки концепций; методы анализа и верификации; методы представления и реализации знаний”. Как и следовало ожидать, Википедия дает более неформальное определение: “Компьютерные науки, или науки о вычислениях, изучают теоретические основы информации и вычислений, а также методы их реализации и приложения в компьютерных системах. Компьютерные науки состоят из многих подобластей; одни сосредоточены на конкретных вычислениях (например, компьютерная графика), другие (например, теория вычислительной сложности) изучают абстрактные проблемы вычислений, третьи связаны с реализацией вычислений. Например, теория языков программирования изучает подходы к описанию вычислений, в то время как компьютерное программирование применяет языки программирования для решения конкретных вычислительных задач”.
Программирование — это основной инструмент выражения решений фундаментальных и прикладных задач, допускающий их проверку, уточнение с помощью эксперимента и использование на практике. Программирование — это дисциплина, в которой идеи и теории сталкиваются с реальностью; где компьютерные науки становятся экспериментальными, а не теоретическими и начинают влиять на реальный мир. В этом контексте, как и во многих других аспектах, важно подчеркнуть, что программирование — это средство реализации как практических, так и теоретических методов. Программирование нельзя сводить к простому ремесленничеству: мол, достаточно заполучить хоть какую-то программу, лишь бы работала.
Каждый из нас что-то где-то слышал о компьютерах или программах. В этом разделе мы приводим несколько примеров. Может быть, среди них вы найдете тот, который вам понравится. По крайней мере, мы хотели бы убедить вас, что сфера применения компьютеров — а значит, и программирования — намного больше, чем можно себе представить.
Многие люди представляют себе компьютер как небольшой серый ящик с экраном и клавиатурой. Такие компьютеры, как правило, стоят под письменным столом и хорошо подходят для игр, обмена сообщениями, электронной почты и воспроизведения музыкальных произведений. Другие компьютеры, ноутбуки, используются в самолетах занятыми бизнесменами, просматривающими базы данных, играющими в компьютерные игры и просматривающими видеофильмы. Эта карикатура — всего лишь вершина айсберга. Большинство компьютеров вообще не попадает в поле нашего зрения, и именно от их работы зависит существование нашей цивилизации. Одни компьютеры занимают целые комнаты, а другие не больше монетки. Многие из наиболее интересных компьютеров вообще не имеют непосредственной связи с людьми, осуществляемой с помощью клавиатуры, мыши или других устройств.
Представление о компьютере как о ящике с экраном и клавиатурой широко распространено и весьма устойчиво. Однако представим себе два следующих компьютера.
Оба компьютера можно увидеть непосредственно. Кроме того, будем считать, что они относятся к одной и той же модели, только с разными системами ввода-вывода. На левом устройстве время выводится на маленький экран (напоминающий экраны обычных компьютеров, но только поменьше), а справа отображается на традиционном циферблате, работающем под управлением небольшого электрического моторчика. Их системы ввода-вывода состоят из четырех кнопок (их легко обнаружить на правом устройстве) и радиоприемника, обеспечивающего синхронизацию с высокоточными атомными часами. Большинство программ, управляющих этими двумя компьютерами, являются общими для них.
На этих двух фотографиях изображены крупный дизельный корабельный двигатель и огромный корабль, на котором может быть установлен такой двигатель.
Посмотрим, в каком месте компьютеры и программное обеспечение могли бы сыграть ключевую роль.
• Проектирование. Разумеется, как корабль, так и его двигатель проектируется с помощью компьютеров. Список их применения практически бесконечен и включает в себя изготовление архитектурных и инженерных чертежей, общие вычисления, визуализацию помещений и конструкций, а также моделирование их работы.
• Строительство. Современные корабли сильно компьютеризованы. Сборка корабля тщательно планируется с помощью компьютеров, а сам процесс осуществляется под управлением компьютеров. Сварка проводится роботами. В частности, современные двухкорпусные танкеры невозможно построить без маленьких роботов-сварщиков, способных проникнуть в пространство между корпусами. Там просто нет места, в которое мог бы протиснуться человек. Разрезание стальных плит для корабля было одним из первых приложений систем компьютерного проектирования и производства CAD/CAM (computer-aided design and computer-aided manufacture).
• Двигатель. Имеет электронную систему впрыскивания топлива и контролируется несколькими десятками компьютеров. Для двигателя мощностью 100 тысяч лошадиных сил (такого, какой изображен на фотографии) это нетривиальная задача. Например, компьютеры, управляющие двигателем, настраивают топливную смесь, чтобы минимизировать загрязнение. Многие насосы, связанные с двигателем (и другими частями корабля), также управляются компьютерами.
• Управление. Корабли предназначены для доставки груза и людей. Составление расписания движения флотилии кораблей — непрерывный процесс (который также выполняется компьютерами), поскольку он зависит от погоды, спроса и предложения, а также от грузоподъемности кораблей и вместимости портов. Существуют даже веб-сайты, с помощью которых можно отслеживать движение торговых кораблей. Корабль, изображенный на фотографии, — крупнейший в мире сухогруз (397 м в длину и 56 м в ширину), но другие крупные современные корабли управляются точно так же.
• Мониторинг. Океанские лайнеры в большой степени автономны; иначе говоря, их команды могут справиться с любыми неожиданностями еще до прибытия в следующий порт. Одновременно они являются частью глобальной системы, имеют доступ к достаточно точной метеорологической информации (через компьютеризованные космические спутники). Кроме того, у них имеются устройства глобального позиционирования (global positioning system — GPS), а также радары, управляемые компьютерами. Если команде нужен отдых, то за работой большинства систем (включая двигатель, радар и т.п.) можно следить (через спутник), находясь в центре управления кораблем. Если произойдет нечто необычное или связь будет нарушена, то команда сразу узнает об этом.
Что произойдет, если один из многих сотен упомянутых компьютеров выйдет из строя. В главе 25, “Программирование встроенных систем”, эта тема рассмотрена более подробно. Создание программ для современных кораблей — очень сложная и интересная работа. Кроме того, она приносит пользу. Стоимость транспорта действительно удивительно мала. Вы оцените это, когда захотите купить какой-нибудь товар, произведенный в другом месте. Морской транспорт всегда был дешевле, чем наземный; в настоящее время одной из причин этого является широкое использование компьютеров и информации.
На этих двух фотографиях изображены телефонный коммутатор и телефон (в который встроены фотоаппарат, MP3-плеер, FM-радиоприемник и веб-браузер).
Посмотрим, в каком месте компьютеры и программное обеспечение могли бы сыграть ключевую роль здесь. Допустим, вы берете в руку телефон и делаете вызов, а человек, которому вы звоните, отвечает вам, и вы начинаете разговор. А возможно, вы хотите соединиться с автоматизированной справочной системой, или послать фотографию, сделанную с помощью встроенного фотоаппарата, или послать текстовое сообщение (просто нажав кнопку “послать” и поручив всю остальную работу телефону). Очевидно, что такой телефон является компьютером. Это особенно ясно, если телефон (как большинство мобильных телефонов) имеет экран и предусматривает больше, чем обычные телефонные услуги, например функции веб-браузера. На самом деле такие телефоны содержат несколько компьютеров: один управляет экраном, другой обеспечивает связь с телефонной станцией, а третий делает что-то еще.
Часть телефона, которая управляет экраном, выполняет функции веб-браузера и решает другие задачи, возможно, покажется пользователям компьютеров наиболее знакомой: она просто запускает графический пользовательский интерфейс. Большинство пользователей даже не представляют, с какой огромной системой соединяется такой маленький телефонный аппарат, выполняя свою работу. Допустим, я нахожусь в Техасе, а вы — в Нью-Йорке, но уже через несколько секунд ваш телефон зазвонит, и я услышу “Алло!” на фоне городского гула. Многие телефоны способны выполнить этот фокус и соединить вас с любой точкой Земли, и вы принимаете это как должное. Как телефон находит вас? Как передается звук? Как этот звук шифруется в пакетах? Ответы на эти вопросы могут заполнить много книг, но в целом для этого необходима согласованная работа аппаратного и программного обеспечения сотен компьютеров, разбросанных по всему миру. Если вам не повезет, то несколько телекоммуникационных спутников (которые сами представляют собой компьютерные системы) также включатся в работу. Мы говорим “не повезет”, потому что не можем полностью компенсировать окольный путь длиной 20 тыс. миль; скорость света (а значит, скорость передачи вашего голоса) является конечной (оптоволоконные кабели значительно ускоряют передачу сигнала). Большинство этих функций выполняются отлично; коэффициент надежности основных телекоммуникационных систем достигает 99,9999% (например, они допускают лишь 20 минут простоя за 20 лет). Основные проблемы кроются в линиях связи между вашим мобильным телефоном и ближайшим телефонным коммуникатором.
Существует программное обеспечение, предназначенное для соединения телефонов, кодирования слов в виде пакетов сигналов для последующей передачи по проводам и радиоволнам, для маршрутизации сообщений, исправления любых неполадок, непрерывного мониторинга качества и надежности услуг, а также, конечно, для учета затраченного времени. Даже для простого слежения за физическими устройствами этой системы требуется большой объем сложного программного обеспечения. Кто с кем разговаривает? Какие части образуют новую систему? Когда следует провести превентивный ремонт?
Вероятно, основные телекоммуникационные мировые системы, состоящие из полуавтономных, но взаимосвязанных систем, являются самым крупным и сложным произведением человечества. Для того чтобы подчеркнуть это, напомним, что звонок по мобильному телефону — это не обычный звонок по старому телефону, у которого появилось несколько новых звуков. Он требует согласованной работы многих инфраструктур, являющихся также основой Интернета, банковских и коммерческих систем, кабельного телевидения. Работу телекоммуникации можно также проиллюстрировать еще несколькими фотографиями.
Помещение, изображенное на левой фотографии, представляет собой торговую площадку американской фондовой биржи на Уолл-стрит в Нью-Йорке, а карта демонстрирует часть Интернета (полная карта выглядит слишком запутанной). Как видите, мы любим цифровую фотографию и используем компьютеры для изображения специальных карт, позволяющих визуализировать информацию.
На следующих двух фотографиях продемонстрирован сканер компьютерной аксиальной томографии CAT и операционная для компьютерной хирургии (которая также называется роботохирургией).
Посмотрим, в каком месте компьютеры и программное обеспечение могли бы сыграть ключевую роль здесь. Сканеры — это в основном компьютеры; излучаемые ими импульсы управляются компьютерами, но получаемая информация представляет собой неразбериху, пока не будет обработана сложными алгоритмами и преобразована в понятные трехмерные изображения соответствующей части тела. Для проведения хирургических операций с помощью компьютеров мы должны продвинуться еще дальше. Существует множество методов визуализации, позволяющих хирургу видеть внутренности пациента при наилучшем увеличении и освещении. С помощью компьютеров хирург может намного точнее оперировать инструментами, чем человеческая рука, и проникать в области, куда обычным способом без дополнительных разрезов дотянуться невозможно. Минимально инвазивная хирургия (лапароскопия) — это яркий пример медицинской технологии, позволяющей уменьшить боль до минимума и сократить время выздоровления миллионов людей. Компьютер может также помочь руке хирурга выполнить более тонкую работу, чем обычно. Кроме того, робототехническая система допускает дистанционное управление, позволяя доктору работать на расстоянии (например, через Интернет). Компьютеры и программы, связанные с этими системами, поразительно сложны и интересны. Разработка пользовательского интерфейса, средств управления оборудованием и методов визуализации в этих системах загрузит работой многие тысячи исследователей, инженеров и программистов на многие десятилетия вперед.
Среди медиков идет дискуссия о том, какой именно новый инструмент оказался наиболее полезным. Сканер компьютерной аксиальной томографии? Сканер магниторезонансной томографии? Аппараты для автоматического анализа крови? Ультразвуковые установки с высоким разрешением? Персональные информационные устройства? К удивлению многих, “победителем” в этом “соревновании” стали устройства, обеспечивающие непрерывный доступ к записям о состоянии пациента. Знание истории болезни пациента (заболевания, которые он перенес, виды медицинской помощи, к которой он обращался, аллергические реакции, наследственные проблемы, общее состояние здоровья, текущее лечение и т.д.) упрощает диагностику и минимизирует вероятность ошибок.
На следующих двух фотографиях изображены обычные персональные компьютеры и группа серверов.
Мы сосредоточились на аппаратных устройствах по вполне очевидным причинам: никто не в состоянии увидеть, потрогать или услышать программное обеспечение. Поскольку показать фотографию программы невозможно, мы демонстрируем оборудование, которое ее выполняет. Однако многие виды программного обеспечения непосредственно работают с информацией. Итак, рассмотрим обычное использование обычных компьютеров, выполняющих обычное программное обеспечение.
Группа серверов — это совокупность компьютеров, обеспечивающих веб-сервис. Используя поисковую машину Google, мы можем прочитать в Википедии (веб-словаре) следующую информацию. По некоторым оценкам, в 2004 году группа серверов поисковой машины Google имела следующие характеристики.
• 719 блоков.
• 63 272 компьютера.
• 126 544 центральных процессора.
• Производительность — 253 ТГц.
• Объем оперативной памяти — 126 544 Гбайт.
• Объем постоянной памяти — 5 062 Тбайт.
Гигабайт (Гбайт) — это около миллиарда символов. Терабайт (Tбайт) — это около тысячи гигабайтов, т.е. около триллиона символов. За прошедшее время группа серверов Google стала намного больше. Это довольно экстремальный пример, но каждая крупная компания выполняет программы в веб, чтобы взаимодействовать с пользователями и клиентами. Достаточно вспомнить компании Amazon (книжная и другая торговля), Amadeus (продажа авиабилетов и аренда автомобилей) и eBay (интернет-аукционы). Миллионы небольших компаний, организаций и частных лиц также работают в сети веб. Большинство из них не используют собственное программное обеспечение, но многие все же пишут свои программы, которые часто бывают совсем не тривиальными.
Более традиционным является использование компьютеров для ведения бухгалтерии, учета заказов, платежей и счетов, управления запасами, учета кадров, ведения баз данных, хранения записей о студентах, персонале, пациентах и т.п. Эти записи хранят практически все организации (коммерческие и некоммерческие, правительственные и частные), поскольку они составляют основу их работы. Компьютерная обработка таких записей выглядит просто: в большинстве случаев информация (записи) просто записывается в память компьютера и извлекается из его памяти, и очень редко обрабатывается с его помощью. Приведем некоторые примеры.
• Вовремя ли прибудет самолет, вылетающий в Чикаго в 12:30?
• Болел ли Гильберт Салливан корью?
• Поступила ли на склад кофеварка, которую заказал Хуан Вальдез?
• Какую кухонную мебель купил Джек Спрат в 1996 году и покупал ли он ее вообще?
• Сколько телефонных звонков поступило из зоны 212 в августе 2006 года?
• Сколько кофейных чашек было продано в январе и чему равна их совокупная стоимость?
Из-за крупного масштаба баз данных эти системы весьма сложны. К тому же ответы на вопросы следует давать быстро (часто на протяжении не более двух секунд) и правильно (по крайней мере, почти всегда). Сегодня трудно кого-то удивить терабайтами данных (байт — это единица памяти, необходимая для хранения обычного символа). Эта традиционная обработка данных часто сочетается с доступом к базам данных через веб.
Этот вид использования компьютеров часто называют обработкой информации. Он сосредоточен на данных — как правило, на крупных объемах данных — и создает интересные проблемы, связанные с организацией и передачей информации, а также со сжатым представлением огромных массивов данных: пользовательский интерфейс представляет собой важный аспект обработки данных. Например, представьте себя на месте исследователя средневековой литературы (скажем, “Кентерберийских рассказов” Чосера или “Дон Кихота” Сервантеса) и подумайте, каким образом можно было бы выяснить, кто именно из многих десятков гипотетических авторов на самом деле написал анализируемый текст. Для этого пришлось бы выполнить поиск по тексту, руководствуясь множеством критериев, сформулированных литературоведами, а также вывести результаты, позволяющие выявить скрытые особенности этих произведений. Размышляя об анализе текстов, вы непременно вспомните и о сегодняшних публикациях: нынче любая статья, книга, брошюра, газета производится на компьютере. Разработка программного обеспечения, облегчающего публикацию текстов, для большинства людей остается задачей, не имеющей удовлетворительного решения.
Говорят, что палеонтологи способны полностью реконструировать динозавра, описать его образ жизни и естественную среду, изучив лишь одну его маленькую косточку. Возможно, это покажется преувеличением, но иногда полезно изучить простой артефакт и подумать, какие следствия он влечет. Посмотрите на фотографию марсианского ландшафта, сделанную марсоходом NASA.
Если хотите заниматься космонавтикой, то стоит стать хорошим программистом. В многочисленных космических программах участвует огромное количество программистов, хорошо знающих физику, математику, электротехнику, механику, медицинскую технику и тому подобное, т.е. все научные дисциплины, лежащие в основе исследования Космоса. Управление двумя марсоходами на протяжении четырех лет (при том что они были рассчитаны на три месяца) — одно из крупнейших достижений нашей цивилизации.
Эта фотография пришла на Землю по каналу связи с 25-минутной задержкой; при этом большое количество искушенных программистов и талантливых математиков сделали все возможное, чтобы эта картинка была закодирована минимальным количеством битов без потери хотя бы одного бита. На Земле фотография обработана с помощью алгоритмов, восстанавливающих цвет и минимизирующих искажения, возникающие из-за несовершенства оптических приборов и электронных сенсоров.
Программы управления марсоходами, конечно, являются компьютерными программами, — двигатель марсохода работает автономно и круглосуточно, подчиняясь командам, посылаемым с Земли за день до их выполнения. Передача команд управляется программами. Операционные системы, используемые на разных компьютерах, вовлеченных в управление марсоходами, передачей команд и реконструкцией фотографий, ничем не отличаются от приложений, используемых при редактировании этой главы. Компьютеры, на которых запускаются эти программы, в свою очередь, разработаны и созданы с помощью систем компьютерного проектирования и производства CAD/CAM. Микросхемы, входящие в состав этих ком пьютеров, произведены на компьютеризованных сборочных линиях с использованием высокоточных инструментов, причем сами эти инструменты спроектированы и созданы с помощью компьютеров (и программного обеспечения).
Управление качеством этого долгого процесса конструирования связано с серьезными вычислениями. Все эти программы написаны людьми на языках программирования высокого уровня и переведены в машинный код компиляторов, которые сами являются программами. Многие из этих программ взаимодействуют с пользователями с помощью графического пользовательского интерфейса и обмениваются данными через потоки ввода-вывода.
Кроме того, большое количество программистов занимаются обработкой изображений (в том числе обработкой фотографий, поступающих с марсохода), анимацией и редактированием фотографий (по сети веб “гуляют” варианты марсианских фотографий, на которых изображены марсиане).
Какое отношение все эти превосходные и сложные приложения и системы программного обеспечения имеют к изучению программирования и языка С++? Связь довольно очевидная — для того чтобы специалисты могли успешно выполнять такие проекты, они должны хорошо знать программирование и языки программирования. Кроме того, каждый пример в этой главе связан с языком С++ и по крайней мере с одним из методов программирования, описанных в книге. Да, программы, написанные на С++, работают и в MP3-плеерах, и на кораблях, и в воздушных турбинах, и на Марсе, и в проекте по расшифровке генома человека. Остальные приложения, созданные с использованием языка С++, описаны на веб-странице
www.research.att.com/~bs/applications.html.
Чего мы ждем от наших программ вообще? Чего хотим от конкретной программы в частности? Мы хотим, чтобы программа работала правильно и надежно. Если программа не делает то, что от нее требуется, или работает ненадежно, то в лучшем случае это серьезный нюанс, а в худшем — опасность. При этом мы хотим, чтобы программа была хорошо спроектирована, т.е. удовлетворяла наши реальные потребности; на самом деле совершенно неважно, что программа работает правильно, если она делает не то, что задумано, или правильно выполняет задание, но способ, которым она это делает, вызывает тревогу. Кроме того, мы хотим, чтобы программа была экономичной; возможно, я предпочел бы ездить на роллс-ройсе или летать на корпоративном самолете, но пока я не миллиардер, должен учитывать стоимость этого удовольствия.
Именно эти аспекты программного обеспечения (оборудования, систем) могут быть по достоинству оценены непрограммистами. Они должны служить для программистов идеалами, которые следует иметь в виду постоянно, особенно на ранних стадиях проектирования, если мы хотим разработать качественное программное обеспечение. Мы должны также учитывать требования к самому коду: он должен быть удобным в сопровождении; т.е. его структура должна быть такой, что-бы любой другой программист мог понять его и внести свои изменения. Успешная программа “живет” долго (часто десятки лет), постоянно изменяясь. Например, она может быть выполнена на новом аппаратном обеспечении, получить новые возможности, адаптироваться к новым средствам ввода-вывода (экраны, видео, звук), взаимодействовать с пользователями на новых естественных языках и т.д. Только неправильную программу невозможно модифицировать. Для удобства сопровождения программа должна быть относительно простой, а ее код должен непосредственно выражать идеи, лежащие в ее основе. Сложность — враг простоты и удобства — может быть присуща самой проблеме (в этом случае мы должны просто как-то с этим справиться), но она также может быть следствием неудачного выражения идей, заложенных в программе. Мы должны избегать этого, придерживаясь хорошего стиля программирования — стиль имеет значение!
Звучит довольно просто, но это далеко не так. Почему? В программировании по существу нет ничего сложного: просто сообщите компьютеру, что вы от него хотите. Почему же оно может потребовать большого напряжения сил? Ведь в компьютерах тоже нет ничего сложного; они просто выполняют определенные наборы операций, например складывают два числа и выбирают следующую инструкцию в зависимости от результата их сравнения. Проблема заключается в том, что мы не используем компьютеры для решения простых задач. Мы хотим, чтобы они решали задачи, которые нам самим не под силу, но при этом забываем, что вычислительные машины — это придирчивые, ничего не прощающие и безмолвные существа. Более того, мир устроен более сложно, чем мы думаем, поэтому часто не представляем, к каким последствиям могут привести наши запросы.
Мы просто хотим, чтобы программа “делала что-то вроде этого”, и не вникаем в техническое детали. Кроме того, мы часто опираемся на “здравый смысл”. К сожалению, даже среди людей встречаются разные точки зрения на здравый смысл, а уж у компьютеров его вообще нет (хотя некоторые действительно хорошо спроектированные программы могут имитировать здравый смысл в конкретных, подробно изученных ситуациях).
Такой образ мышления приводит к заключению, что “программирование — это понимание”: если вы можете запрограммировать задачу, значит, понимаете ее. И наоборот, если вы глубоко разобрались в задаче, то сможете написать и программу для ее решения. Иначе говоря, программирование можно рассматривать как часть усилий по исследованию проблемы. Программы — это точное представление нашего понимания задачи. Когда вы программируете, то проводите много времени, пытаясь понять задачу, которую хотите автоматизировать.
Процесс разработки программ можно разделить на четыре этапа.
• Анализ. В чем заключается задача? Чего хочет пользователь? Что требуется пользователю? Что может позволить себе пользователь? Какая степень надежности нам необходима?
• Проектирование. Как решить задачу? Какую структуру должна иметь система? Из каких частей она должна состоять? Каким образом эти части будут взаимодействовать? Каким образом система будет взаимодействовать с пользователем?
• Программирование. Выражаем решение задачи (проект) в виде программы. Пишем программу, учитывая все установленные ограничения (по времени, объему, финансам, надежности и т.д.). Убеждаемся, что программа работает правильно и удобна в сопровождении.
• Тестирование. Убеждаемся, что во всех предусмотренных ситуациях система работает правильно.
Программирование и тестирование часто называют реализацией. Очевидно, это простое разделение на четыре части является условным. По этим четырем темам написаны толстые книги, и еще больше книг написано о том, как эти темы взаимосвязаны друг с другом. Следует помнить, что эти стадии проектирования не являются независимыми и на практике не следуют именно в таком порядке. Обычно мы начинаем с анализа, но обратная связь на этапе тестирования влияет на программирование; проблемы, возникающие на этапе программирования, могут свидетельствовать о проблемах, нерешенных на этапе проектирования; в свою очередь, проектирование может выявить аспекты, не учтенные на этапе анализа. На самом деле функционирование системы обычно сразу же выявляет слабость анализа.
Чрезвычайно важным обстоятельством является обратная связь. Мы учимся на ошибках и уточняем свое поведение, основываясь на обучении. Это очень важно для эффективной разработки программного обеспечения. В работе над любым крупным проектом нам неизвестна вся информация о проблеме и ее решении, пока мы не приступим к делу. Конечно, опробовать идеи и проанализировать обратную связь можно и на этапе программирования, но на более ранних стадиях разработки это можно сделать намного легче и быстрее, записав идеи, проработав их и испытав на друзьях. По нашему мнению, наилучшим инструментом проектирования является меловая доска (если вы предпочитаете химические запахи, а не запах мела, то можете использовать доску для фломастеров).
По возможности никогда не проектируйте в одиночку! Никогда не начинайте писать программу, пока не опробуете свои идеи, объяснив их кому-то еще. Обсуждение проекта и методов проектирования с друзьями, коллегами, потенциальными пользователями и другими людьми следует проводить еще до того, как вы сядете за клавиатуру. Просто удивительно, как много можно узнать, просто попытавшись объяснить свою идею словами. Помимо всего прочего, программа — это всего лишь средство выражения идей в виде кода.
Аналогично, попав в тупик при реализации программы, оторвитесь от клавиатуры. Думайте о самой задаче, а не о своем неполном решении этой задачи. Поговорите с кем-нибудь: объясните, что вы хотели и почему программа не работает. Просто удивительно, как часто можно найти решение, просто подробно объяснив задачу кому-то еще. Не занимайтесь отладкой программ (поиском ошибок) в одиночку, если есть такая возможность!
В центре внимания нашей книги лежит реализация и особенно программирование. Мы не учим решать задачи, заваливая вас грудой примеров и решений. Часто новую задачу можно свести к уже известной и применить традиционный метод ее решения. Только после того, как большая часть подзадач будет обработана таким образом, можно позволить себе увлекательное “свободное творчество”. Итак, сосредоточимся на методах выражения идей в виде программ.
Непосредственное выражение идей в виде программ — это основная цель программирования. Это совершенно очевидно, но до сих пор мы еще не привели достаточно ярких примеров. Мы еще не раз будем возвращаться к этому. Если в нашей программе необходимо целое число, мы храним его в виде переменной типа int, предусматривающего основные операции с целыми числами. Если мы хотим работать со строками символов, то храним их в виде переменных типа string, обеспечивающего основные операции по манипуляции с текстом. В идеале, если у нас есть идея, концепция, сущность или какая-то “вещь”, которую можно изобразить на доске и сослаться на нее в ходе дискуссии, про которую написано в учебнике (по некомпьютерным наукам), то мы хотим, чтобы это нечто существовало в нашей программе в виде именованной сущности (типа), предусматривающей требуемые операции. Если мы собираемся проводить математические вычисления, то нам потребуется тип complex для комплексных чисел и тип Matrix для матриц. Если хотим рисовать, то потребуются типы Shape (Фигура), Circle (Круг), Color (Цвет) и Dialog_box (Диалоговое окно). Если хотим работать с потоками данных, скажем, поступающих от датчика температуры, то нам понадобится тип istream (буква “i” означает ввод (input)). Очевидно, что каждый такой тип должен обеспечивать совершенно конкретный набор предусмотренных операций. Мы привели лишь несколько примеров из книги. Кроме них, мы опишем инструменты и методы, позволяющие создавать собственные типы, описывающие любые концепции, необходимые для вашей программы.
Программирование носит частично практический, частично теоретический характер. Если вы ограничитесь ее практическими аспектами, то будете создавать немасштабируемые и трудные для сопровождения поделки. Если же захотите остаться теоретиком, то будете разрабатывать непрактичные (и не экономичные) игрушки. Различные точки зрения на идеалы программирования и биографии людей, внесших значительный вклад в создание языков программирования, изложены в главе 22 “Идеалы и история”.
Контрольные вопросы
Контрольные вопросы предназначены для выделения основных идей, изложенных в главе. Их можно рассматривать как дополнение к упражнениям. В то время как упражнения подчеркивают практический аспект, контрольные вопросы посвящены идеям и концепциям.
1. Что такое программное обеспечение?
2. Чем объясняется важность программного обеспечения?
3. В чем проявляется важность программного обеспечения?
4. Что может произойти, если программное обеспечение будет работать неправильно? Приведите несколько примеров.
5. В каких областях программное обеспечение играет важную роль? Приведите несколько примеров.
6. Какие виды деятельности связаны с разработкой программного обеспечения? Приведите несколько примеров.
7. В чем разница между компьютерными науками и программированием?
8. Где в процессе проектирования, конструирования и использования кораблей используется программное обеспечение?
9. Что такое группа серверов?
10. Какие запросы вы посылаете по сети? Приведите примеры.
11. Как программное обеспечение используется в научных исследованиях? Приведите примеры.
12. Как программное обеспечение используется в медицине? Приведите примеры.
13. Как программное обеспечение используется в индустрии развлечений? Приведите примеры.
14. Какими свойствами должно обладать хорошее программное обеспечение?
15. Как выглядит разработчик программного обеспечения?
16. Перечислите этапы разработки программного обеспечения.
17. Чем могут объясняться трудности разработки программного обеспечения? Назовите несколько причин.
18. Как программное обеспечение может облегчить жизнь?
19. Как программное обеспечение может осложнить жизнь?
Термины
Приведенные термины входят в основной словарь по программированию и языку С++. Если хотите понимать, что люди говорят о программировании, и озвучивать свои собственные идеи, следует понимать их смысл.
Упражнения
1. Перечислите виды деятельности, которыми вы занимаетесь большую часть времени (например, ходите в университет, едите или смотрите телевизор). Укажите среди них те виды деятельности, которые более или менее тесно связаны с компьютерами.
2. Укажите профессию, которой вы хотели бы овладеть или о которой вы что-нибудь знаете. Перечислите виды деятельности, связанные с этой профессией и компьютерами.
3. Отдайте список, заполненный при выполнении упр. 2, своему другу и возьмите у него аналогичный список, посвященный другой профессии. Уточните его список. Когда вы оба сделаете это, сравните результаты. Помните: упражнения, допускающие разные решения, не имеют однозначного ответа, поэтому они всегда могут уточняться.
4. Опишите виды деятельности, которые, по вашему мнению, невозможны без компьютеров.
5. Перечислите программы (программное обеспечение), которые вы используете непосредственно. Укажите только программы, с которыми вы взаимодействуете прямо (например, выбирая новую песню на MP3-плеере), а не перечисляйте программы, которые могут быть установлены на используемых вами компьютерах (например, при вращении руля в вашем автомобиле).
6. Укажите десять видов деятельности, занимаясь которыми люди никак не используют компьютеры, даже косвенно. Это упражнение сложнее, чем кажется!
7. Укажите пять задач, для решения которых компьютеры в настоящее время не используются, но в будущем, по вашему мнению, будут использоваться. Обоснуйте свой ответ.
8. Объясните, чем вам нравится программирование (используя не меньше 100, но не больше 500 слов). Если же вы убеждены, что не станете программистом, то объясните почему. В любом случае приведите продуманные и логичные аргументы.
9. Опишите роль, помимо профессии программиста (независимо от ответа, данного выше), которую вы хотели бы играть в компьютерной индустрии (используя не меньше 100, но не больше 500 слов).
10. Могут ли компьютеры когда-нибудь стать сознательными и мыслящими существами, конкурирующими с человеком? Обоснуйте свою точку зрения (используя не менее 100 слов).
11. Перечислите свойства, присущие наиболее успешным программистам. После этого укажите характеристики, которые общественное мнение приписывает программистам.
12. Назовите пять приложений компьютерных программ, упомянутых в главе, и укажите одно из них, которое считаете наиболее интересным и в разработке которого хотели бы принять участие. Обоснуйте свою точку зрения (используя не менее 100 слов).
13. Сколько памяти может понадобиться для хранения а) этой страницы текста, б) этой главы и 3) всех произведений Шекспира? Будем считать, что для хранения одного символа требуется один байт, а допустимая точность ответа составляет 20%.
14. Какой объем памяти у вашего компьютера? Какой объем оперативной памяти? Какой объем жесткого диска?
Послесловие
Жизнедеятельность нашей цивилизации зависит от программного обеспечения. Разработка программного обеспечения — это область невероятно разнообразных возможностей для интересной, социально полезной и прибыльной работы. Создавая программное обеспечение, необходимо быть принципиальным и серьезным: необходимо устранять проблемы, а не создавать их.
Разумеется, мы испытываем благоговение перед программным обеспечением, пронизывающим всю нашу техническую цивилизацию. Конечно, не все программы хороши, но это другая история. Здесь мы хотим подчеркнуть, насколько широко распространено программное обеспечение и как сильно зависит от них наша повседневная жизнь. Все эти программы написаны людьми вроде нас. Все эти ученые, математики, инженеры, программисты и другие специалисты начинали примерно так же, как и вы.
Теперь вернемся на землю и приступим к овладению техническими навыками, необходимыми для программирования. Если вы начнете сомневаться, стоит ли заниматься этой трудной работой (большинство разумных людей время от времени думают об этом), вернитесь назад, перечитайте эту главу, предисловие и часть главы 0, “Обращение к читателям”. Если начнете сомневаться, сможете ли справиться с этой работой, помните, что миллионы людей справляются с ней и становятся компетентными программистами, проектировщиками, разработчиками программного обеспечения и т.д. Вы тоже сможете, мы уверены.