Что такое информатика?

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

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

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

Так же при описании задач и их решений часто встречается слово “вычислимый”. Мы говорим, что задача вычислима, если существует алгоритм для её решения. Таким образом, можно сформулировать альтернативное определение информатики, как науки, занимающейся изучением вычислимых и не вычислимых задач, существующих и не существующих алгоритмов. В любом случае, вы легко можете заметить, что слово “компьютер” здесь нигде не употребляется. Решение рассматривается независимо от машины.

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

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

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

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

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

>>> import math
>>> math.sqrt(16)
4.0
>>>

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

../_images/blackbox.png

Рисунок 1: Процедурная абстракция

Next Section - Что такое программирование?