Найти тему
5,7K подписчиков

Программист с лопатой

675 прочитали

Я веду канал уже более двух лет (оказывается), и начинал его с попыток объяснить, как работают программы.

Хочу вернуться к этой теме в связи с тем, что в последнее время появилось очень много курсов, которые предлагают написать 9 нейросетей за 3 дня и тому подобное.

Чтобы понять абсурдность данных предложений, достаточно переделать заголовки:

  • Пишем 9 поэм Шекспира за 3 дня
  • Делаем 9 полостных операций за 3 дня
  • Играем 9 концертов за 3 дня

Сразу видно, что с ними что-то не так. Вы не увидите подобные приглашения на курсы хирургов, но кто-то упорно создаёт иллюзию, что с программистами всё по-другому.

Вообще говоря, вы могли бы и на курсах хирургов выучить 9 операций за 3 дня. Там вам покажут, в каком месте сделать разрез, как выглядит нужный орган, где помазать спиртом и т.д.

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

Как мне кажется из наблюдений, в головах людей существует некий разрыв в понимании, что такое настоящее программирование.

Рассуждают примерно так: программирование это когда ты пишешь какие-то буквы на экране, а тебе за это платят деньги. Я хочу, чтобы мне платили деньги, значит, мне надо научиться писать буквы на экране. Надо пойти на курсы, где покажут, какие буквы надо писать.

Это приводит к массовым вопросам на сайтах типа StackOverflow: как мне сложить 2 и 3?

Ответ: 2 и 3 складываются так: 2 + 3 = 5

Следующий вопрос: Спасибо, а как мне теперь сложить 3 и 2?

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

Он задаёт такие вопросы, потому что думает, что это нужно просто заучивать, что в этом и состоит обучение на программиста. Кто больше выучил – тот и лучший программист.

В чём тогда заключается программирование?

Для понимания вы должны взять в руки лопату, и это не шутка.

Я веду канал уже более двух лет (оказывается), и начинал его с попыток объяснить, как работают программы.

Казалось бы, совершенно разные занятия – писать код и бросать лопатой песок. На самом человек с лопатой гораздо ближе стоит к программированию. Чем быстрее вы это поймёте, тем легче вам будет.

Информация и энергия

Это два термина, которых необходимо и достаточно, чтобы описать всё. Наш мир целиком состоит из энергии. В разных местах пространства есть разное количество энергии, что даёт некую информацию.

Например, если в каком-то месте находится куча песка, там больше энергии, чем в другом месте, где этой кучи нет.

Я веду канал уже более двух лет (оказывается), и начинал его с попыток объяснить, как работают программы.-2

Разница в энергии это информация.

Далее, абсолютно все процессы, которые происходят, это изменение информации. Если информация не меняется, то не меняется и энергия. А если не меняется энергия, значит, не текут никакие процессы (даже время).

Когда вы перебрасываете песок лопатой, вы распределяете энергию по-другому. Но чтобы это сделать, нужно также потратить энергию, которую надо взять откуда-то ещё. Сам по себе песок из состояния покоя перекидываться не может.

Отсюда вытекают законы термодинамики и тепловая смерть Вселенной, но не будем о плохом.

У процесса перекидывания песка лопатой есть абсолютно понятные цели и способы. Практически любой человек в этой ситуации понимает, что надо делать, как и зачем. Нужно переместить эту кучу песка из одного места в другое, чтобы использовать там. Для этого есть лопата, которой можно набирать песок и перемещать его в пространстве. Всё это крайне наглядно.

Если теперь обратиться к программированию, то там будут точно такие абсолютно понятные цели и способы. Разницы нет вообще:

  1. Есть некоторая энергия / информация в одном месте
  2. Её надо перенести в другое место

Понимаете, что это всё? Разница лишь в том, что энергия находится внутри компьютера, в виде электрических сигналов, но её точно так же нужно брать электрической лопатой и переносить.

Модели

Но что нам даёт перемещение энергии внутри компьютера? Мы всегда можем пояснить, зачем перетаскивать песок. Но перетаскивать электрические сигналы?

Это суррогат реальности. Кроме практических целей, часто есть необходимость получить ответ на вопрос, что случилось бы с кучей песка, если бы мы с ней что-то сделали. Для этого в реальном мире нужно реально что-то с ней сделать. Но у нас не всегда есть в наличии куча песка, а также силы и средства, чтобы что-то делать с ней.

Поэтому мы строим её модель. Модель это информация и энергия, которая ведёт себя так же как куча, и значит наблюдая за моделью, мы можем получать ответы, которые верны и для кучи.

Таким образом, основная задача программирования – строить и использовать модели реальных вещей и процессов. Модели денег, модели писем, модели деталей станков, модели покупки и доставки товаров, модели общения, можете придумать любые примеры и убедиться, что речь всегда идёт об имитации чего-то реального.

Но раз мы имитируем что-то реальное, то мы всегда знаем, как обращаться с этим реальным. Мы знаем, как набирать воду в кружку, как переходить дорогу, как разговаривать с другими людьми и прочее. Следовательно, если мы имеем дело с моделями этих действий, мы должны также понимать, как работают эти модели.

Нам нужен лишь инструмент для работы с ними внутри компьютера.

Рассмотрим модель кучи песка:

A = 100

A – так называется место, где лежит песок. 100 – столько песка там лежит.

Что такое 100? Например, это высота кучи песка в сантиметрах. Или её вес в килограммах. Или количество песчинок в ней. Мы сами выбираем смысл этого числа, исходя из того, какие именно свойства кучи песка нам нужны в модели.

Далее, чтобы что-то делать с моделью, мы должны тратить реальную физическую энергию.

Когда мы напишем:

B = A
A = 0

То это будет означать, что количество песка из места A скопировалось в место B. А в месте А оно стало равным нулю. То есть мы переместили весь песок из места A в место B. Это не просто аллегория, энергия в виде электрических зарядов действительно была перемещена. Чтобы это произошло, компьютер должен был затратить некоторое количество внешней энергии. И это количество пропорционально физической работе в реальном мире.

Но вы скажете – я перебрасываю лопатой песок целый день, а здесь всего лишь присвоено одно число и всё готово. А ведь присвоить можно не только 100, но и 1000, и перенести так же за один раз. Как же тогда количество затраченной компьютером энергии может быть пропорционально физической работе?

Дело в том, что точность нашей модели A = 100 на много порядков ниже, чем точность физической кучи песка. Поэтому и энергии на изменение этой модели требуется на много порядков меньше.

Попробуйте увеличить точность модели. Введите в неё состояние каждой песчинки. Её пространственное расположение, вес, форму. Попробуйте описать, как песчинки вступают в соприкосновение с лопатой и друг с другом.

Вам моментально понадобятся огромные объёмы памяти и огромная энергия, чтобы это всё считать. Возможно, эта энергия окажется даже больше той, которую вы тратите в реальности. А ведь в реальности вы работаете с идеальной моделью кучи – то есть с ней самой. Где учтены вообще все возможные её свойства.

Если запрограммировать модель кучи максимально, абсолютно точно, то мы получим... да, ту самую физическую кучу и получим. При этом встанет вопрос, как отличить реальность от абсолютно точной модели реальности? А вот никак. Мы можем жить в Матрице.

И в чём же оно заключается?

Как уже понятно, в основном в построении моделей. Но фишка здесь в том, что требуется строить адекватные модели. С одной стороны, они должны как можно точнее описывать объекты, а с другой быть экономными по затратам энергии.

Задача программиста – находить такой баланс.

Программист всегда учится именно этому, а не тому, как писать на экране буквы. Если вы не знаете, как что-то должно работать в реальности, то и запрограммировать это не сможете.

В реальности сложение 2 + 3 или 3 + 2 никогда не вызвало бы у вас вопросов. Очевидно, что это одно и то же. Также, если сложить синий и красный карандаш, вы получите два карандаша, и у вас не возникнет вопроса, как сложить зелёный и жёлтый.

Не стоит думать, что с переходом к компьютерным моделям должно что-то меняться. Для них будут работать те же правила и законы, с которыми вы знакомы в реальной жизни.

Поэтому начинайте учить программирование не с языков, а с того, как строить модели.