В своем курсе CS50 профессор Малан в течение одной из лекций наглядно демонстрировал что такое программирование — он усадил несколько добровольцев из аудитории и они вместе делали бутерброд (или сАндвич, кому как угодно). На просторах интернета еще много было видео про отцов‑программистов, которые делали так же бутерброды по инструкции своих детей. Суть подхода везде была такова, что программирование — это составление четких инструкций для компьютера к исполнению, которые он не может интерпретировать как‑то иначе. Как мне кажется, эта концепция хороша, но для скриптов или для разбора отдельных методов/функций, но не для создания программ в целом. Мне захотелось найти более общую метафору для программирования.
(Рассуждения приведены относительно языка Java)
Представим, что мы строим здание. Если конкретнее — жилой многоквартирный дом. Из чего он состоит? Любому зданию нужны фундамент и каркас — это основа. Как это соотнести с программированием — наверняка вы слышали о таком слове, как фремворк, которое почти дословно можно перевести как каркас. Каркас может отличаться в зависимости от требований застройщика, особенностней окружающей среды, температурного режима, а также бюджета. Дом можно построить на фундаменте из свай, железобетонной плите, стены можно сделать из кирпича, пеноблока и т д. Точно так же для программы можно выбрать основу — Spring для приложения, Cucumber/JUnit для автотестов.
После каркаса нас интересуют этажи. Как обстоят дела с ними — для начала до строительства архитектор создает чертеж типового этажа жилого дома, а потом строители уже по чертежу воспроизводят один и тот же этаж раз за разом (в надежде на изменения) столько, сколько требуется. В программировании есть понятие класса и объекта — вот наглядный пример этих сущностей. Класс — тот самый чертеж от архитектора, а сами этажи — это объекты или экземпляры класса.
Между этажей ходит лифт (допустим, что в нашем доме лифт мы предусмотрели). По сути он тоже является объектом класса лифт, только мы его не так часто воспроизводили. Что нас интересует — что он умеет. А умеет он приезжать на этаж, с которого его вызвали и привозить пассажира на выбранный из кабины этаж. То есть он умеет исполнять некоторые действия или функции. В Java однако функции принято называть методами, методы могут быть доступными всем пользователям — как например перемещение между жилыми этажами — так и доступными пользователям с определенным уровнем доступа — например кнопка перемещения на служебный этаж, которая работает только при вставленном ключе.
Под переменные сменим профиль здания и из жилого переделаем его в банковское хранилище, в котором находятся ячейки. В каждой ячейке можно хранить деньги, драгоценности, ценные бумаги. Или же ячейка может быть пуста. Так же и в программировании — мы используем такие ячейки в опреативной памяти, чтобы хранить нужные нам данные, и записываем мы такое отношение через знак равенства, чтобы указать, что где лежит, а не что чему равно. А теперь представим, что нам нужно сохранить в банке автомобиль. Можно его поместить в ячейку? Машина — не жираф, и в холодильник его не запихаешь в 3 действия, но можно в ячейку положить паспорт транспортного средства и ключи, то есть дать ссылку на автомобиль. Так же и в программировании мы можем в переменной хранить ссылку на более сложный объект, в то время как сам этот объект будет находиться в другом месте (в другой части оперативной памяти, называемой кучей).
Под эту метафору можно привести даже многопоточность — на примере того же лифта, в котором предусмотрен механизм поочередного вызова кабины и сохранения последовательности следования по этажам. Простыми словами — если движущийся лифт вызовут с какого либо из этажей, лифт не прервет свою текущую задачу и не бросится исполнять новую команду. Это еще раз доказывает, что современный подход к программированию исходит из наблюдений об окружающем мире — и не только в плане того, что все является объектом.
Я попытался немного пофантазировать о том, как можно объяснить принципы программирования на примерах из реального мира для тех, кто только начинает его изучать, а также для всех, кому это будет интересно. А какую метафору для программирования используете вы?
А еще у меня есть тг канал про автоматизацию тестирования: https://t.me/auto_toster

