Прежде чем браться за основную часть курса, стоит понять, где мы вообще находимся. Разберём три вещи: кто такой инженер и какие цели он перед собой ставит, что такое программа и какую задачу она решает, и почему абстракция – главный навык в этой профессии. Из этих трёх понятий и складывается определение объекта.
Кто такой инженер
Слово «инженер» происходит от латинского ingenium – «изобретательность», «остроумие».
Инженер – это не тот, кто знает формулы, а тот, кто решает практическую задачу в условиях ограничений. У моста есть бюджет, сроки, материалы и нагрузка, которую он обязан выдержать.
Задача инженера не «построить мост», а «связать два берега» – и мост тут лишь один из вариантов. Отсюда и работа, которую он делает:
- понять настоящую задачу – чего от сооружения ждут на самом деле и по каким признакам будет видно, что оно работает;
- выбрать решение из возможных – мост, тоннель или паром, у каждого своя цена и свои последствия;
- уложиться в ограничения – бюджет, сроки, материалы, люди; идеального решения нет, есть подходящее вот этим условиям;
- заложить запас – нагрузка вырастет, река разольётся, требования изменятся;
- отвечать за результат – мост стоит десятилетиями, и чинить его будет уже кто-то другой.
Ни один из этих пунктов не про знание формул. Формулы – инструмент, а работа инженера – принять решение и обосновать его.
Что такое программа
Программа – это формализованное описание решения задачи, записанное так, чтобы его мог выполнить исполнитель, то есть компьютер.
У Ады Лавлейс исполнителем была машина Бэббиджа, а задача была математической. У нас исполнитель тот же, но задачи ставит бизнес, а ограничения знакомы по мостам: время, деньги и люди.
Отсюда главная мысль: программист – это инженер, а код – инженерное сооружение. Мост строят один раз, а обслуживают десятилетиями. С кодом то же самое: написать – примерно 20% работы, остальные 80% – читать, менять и расширять. Причём читают его люди, а не компьютер.
Запомните эту пропорцию: она объясняет почти всё, что происходит дальше в курсе.
Абстракция
Абстракция – это сознательное отбрасывание несущественных деталей ради работы с существенными. Вы пользуетесь ею каждый день: схема метро не показывает реальные расстояния, повороты туннелей и глубину станций – только линии и пересадки. Именно поэтому она полезна: для задачи «доехать из точки А в точку Б» всё остальное – шум.
Проблема в том, что абстракция бывает неграмотной. Если бы схему метро рисовали с реальными расстояниями, она была бы точнее – и бесполезнее. В коде так же: неудачная абстракция либо прячет важное, либо выпячивает то, что должно быть скрыто.
Грамотная абстракция отвечает на один вопрос: какие детали существенны для этой задачи? Умение отвечать на него и есть главный навык проектировщика, и никакая парадигма не сделает этого за вас.
Определение объекта
Теперь можно дать определение главному термину курса.
Объект – это абстракция части предметной области, объединяющая состояние (данные) и поведение (операции над этими данными) в единое целое.
Заказ в интернет-магазине «знает» свои позиции и сумму – и «умеет» себя оплатить или отменить. Почему объединение данных и поведения оказалось такой мощной идеей – тема следующего модуля.
Зачем это в эпоху AI
Сегодня нейросеть напишет класс быстрее, чем вы дочитаете этот абзац. Но код – самый нижний уровень абстракции: выше – классы и их зона ответственности, модули, границы, сервисы. Чем выше уровень, тем меньше вопрос «как это написать» и тем больше – «что здесь должно быть и почему». Это и остаётся за инженером, и цена ошибки тут другая: класс правится за час, границы системы – месяцами работы инженеров и сотнями тысяч долларов для бизнеса.
AI при этом усилитель: в коде с грамотными абстракциями он ускоряет работу в разы, в болоте из плохих – с той же скоростью производит новое болото.
Учиться этому сразу на архитектуре слишком дорого – поэтому классы и объекты и есть тренажёр. Задача на них ровно та же: решить, что существенно, а что спрятать. Разница только в цене ошибки – час вместо месяцев, и видно её сразу.
Вы удивитесь тому, насколько разобранные здесь принципы и паттерны переиспользуются на других уровнях: то, что вы разберёте на классах, узнаётся в устройстве модулей, сервисов и даже команд. Понимание «чисто ООПшных» абстракций делает вас сильнее как инженера – даже если в работе вы не напишете на ООП ни строчки.