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