
Было лето 2022 года, я ехал на автобусе до технического колледжа, где проходили лекции по языку Go, которые мне оплатил работодатель. И тогда у меня возникла ясная мысль: среди этих единиц и нулей есть что-то очень важное лично для меня, и мне нужно до этого докопаться.
И недавно я до этого докопался — самым неожиданным для себя образом. Про это и будет статья, самая концептуальная из всех, которые я писал.
В школе я недолюбливал математику как предмет, в отличие от физики, имевшей дело с вещами, которые можно было визуализировать и представить в голове.
С математикой, как мне казалось, все обстояло по-иному: мы имели дело с очень абстрактными вещами, которые не имеют аналогов в реальном мире, и чем в более старшие классы мы переходили, тем явнее мне это виделось. Все это казалось какой-то абстрактной чушью, которую описывает такой же бессмысленный набор букв.
И не могу сказать, что это только проблема образования и учителей, которые так подавали материал. По факту эта аллергия на предмет была вызвана исключительно тем, что я «прогулял» фундаментальную часть математики как способа описания.
Иначе я бы понял, что математика изначально берет упрощенную модель реальности, выводит из нее базовые примитивы — точки, линии, фигуры и пр. — и пытается непротиворечиво развить отношения между этими примитивами.
Впрочем, школа для меня сама по себе была крайне агрессивной и неблагоприятной средой обитания, и это тоже важно учитывать.
Но начнем по порядку.
Init()
Эта глава нужна для того, чтобы показать, что компьютер я на протяжении этих 6 лет фактически изучал сверху вниз — этот факт будет важен в дальнейшем. Здесь будет рассказано о моем пути в программировании — от написания первой простейшей программы на Python до нынешнего момента.
Первые шаги
В первой половине 2020 года была такая ситуация: учеба на ветеринарно-санитарную экспертизу (химическая, эпидемиологическая проверка пищевых продуктов на безопасность) в местном сельскохозяйственном вузе мне казалась откровенно неинтересной и скучной, и надо было найти другое занятие.
Одно из главных условий было такое: чтобы начать обучаться, достаточно обычного ноутбука. За пару месяцев я попробовал веб-дизайн и 3D-моделирование — ни то ни другое меня особо не зацепило.
В какой-то момент я решил попробовать программирование, которое именно тогда набирало популярность. Я сварганил по туториалам через встроенный IDLE простейший калькулятор на Python, принимающий на вход числа и тип операции.
Сложно описать мои чувства в тот момент. Меня это совершенно пленило, и мне даже сложно было сказать, почему конкретно. Я понял, что углубляться мне нужно именно в это. Потом пошли бесплатные кодерские заказы от знакомых, телеграм-боты и мой первый неудачный заказ за 2к рублей, где какому-то пареньку надо было сделать несложный телеграм-магазин с фотоснимками. Задачу я провалил, но разошлись мы без взаимных претензий.
Мое обучение программированию стабильным не назовешь — оно развивалось обрывками: пет-проект тут, бесплатный проект другу там и долгие периоды, когда я в принципе не был ничем занят. Спустя практически год после написания первой программы на Python, в августе 2021-го, я взялся писать программу-дашборд для иностранного филиала одной российской нефтегазовой компании (а точнее, для компании-подрядчика, которая как раз и разрабатывала для них программный комплекс).
Попадание в офис
Дальше был неудачный опыт на фриланс проекте в коллективе более опытных разрабов, а уже в начале 2022 года я попал в веб-студию — в офис в моем родном городе — тем же Python-разработчиком. Тогда я впервые в реальной жизни оказался в кодерском комьюнити, а сам проект был завязан на GPT-3 и нейросетях — как раз с этого момента я живо заинтересовался этой темой и интересуюсь до сих пор.
Так как заказчики были из Америки, то вследствие известных нехороших событий они в какой-то момент просто не смогли платить нам деньги, а другой работы для меня не нашли, и в августе 2022 года я от этой веб-студии отвалился.
Полугодовой интербеллум
Дальше были полгода неудачных походов на собеседования. За это время я изучил на довольно неплохом уровне язык Go — без практического расчета, просто понравился сам ЯП. Из небольшого интро в начале читатель мог заметить, что я на лекциях по Go уже был, но тогда я был всего на двух лекциях и просто узнал про его существование.
Параллельно мне очень хотелось пойти работать в ИИ-сферу, ибо еще с работы в веб-студии меня эта область конкретно пленила. Но юнец без профильного опыта и образования не был нужен никому — даже мои полгода работы по ИИ-стеку (там был и сбор датасета, и обучение моделей, и тому подобное) были особо никому не нужны.
Впрочем, один раз мне шанс дали и пригласили на собес в крупный маркетплейс, но на собеседовании я продемонстрировал околонулевой уровень знаний по математике языковых моделей. Тогда я очень сильно расстроился из-за этого факапа.
И вот примерно в начале 2023 года я попал на собеседование на позицию программиста микроконтроллеров на приборостроительный завод в своем родном городе. «Завод» тут — полугаражное предприятие, где производилось измерительное оборудование для Севера. При личной встрече местный начальник (довольно опытный прогер-миллениал) дал тестовое задание на листочке, связанное с ООП, — написать его нужно было на C++.
Параллельно этому мне дали тестовое задание на PHP-разраба — там работа казалась мне более привлекательной, плюс была гораздо ближе к дому. Я решил тестовое задание через ChatGPT и сдал его работодателю, но там нашли более достойного кандидата на место.
Вариантов не оставалось — я так же сделал через ChatGPT тестовое, начальник его одобрил, и я попал на завод.
Так я случайно стал программистом микроконтроллеров.
Погружаемся глубже
Подробно рассказывать про работу там не буду. Скажу лишь, что я стал погружаться в схемотехнику, электронику и поработал с микроконтроллерами семейств STM32 и ESP32, а позднее довольно серьезно углубился в 8-битные микроконтроллеры AVR.
На этом заводе я проработал 3 года, и за это время основательно прокачал понимание компьютера на фундаментальном уровне. Но программировал я не только прошивки — также кодил графические интерфейсы на Lazarus (еще был один проект на Swing/Java), то есть с классическим программированием я не попрощался.
В конце 2025-го я перешел в новую компанию — с более высокой зарплатой и гораздо более комфортным work-life balance. Собственно, именно в этот период я стал писать на Хабр, а также делать множество пет-проектов. Но занимаюсь я до сих пор фактически тем же самым.
Конец автобиографии
Я начал с поверхности — с веб-разработки, — но обстоятельства складывались так, что я все глубже погружался по слоям абстракции компьютера и в конечном счете добрался до уровня транзисторов. Так мы подходим к нынешнему моменту.
Момент озарения
Здесь я расскажу, как неожиданно открыл для себя, что последние 6 лет занимался математикой, облеченной в машинную форму, и раскрою подробнее содержание этого инсайта.
Тупой шортс на ютубе
Как обычно, просматривая шортсы на ютубе, я натолкнулся на отрывок из фильма «Люси» Люка Бессона. Там главная героиня с гиперинтеллектом рассказывала умным людям мира сего какую-то псевдонаучную теорию: математика — это фигня, а главное во Вселенной — время.
Автор фильма, не имея какого-либо технического бэкграунда, нес какую-то околесицу через персонажа и делал это с очень умным видом. Мне это показалось тупостью, и я какое-то время об этом думал.
И во время этого думания произошло нечто странное. Я задумался о самой сущности математики, и именно в этот момент случился один из самых мощных инсайтов в моей жизни. Как будто я вставил в свою базу данных недостающее ребро, и разрозненные до этого фрагменты знания стали очень быстро собираться в единую упакованную модель.
Задача про кухонную доску
Ахтунг! Тут будут формулы, если вас такое не устраивает, то кликните сюда для пропуска главы.
Чтобы вы лучше поняли суть этого инсайта, я опишу несложный мысленный эксперимент.
Представим реально существующую доску квадратной формы, которая лежит на столе. А теперь уберем стол, гравитацию, трение и даже обьем, и прочие физические характеристики, которые могут помешать дальнейшей задаче. Клонируем эту доску 5 раз, а теперь нужно их расположить с оригиналом в пространстве таким образом, чтобы по итогу получился куб.
Итак, у нас в пустоте висит доска — без стола, гравитации и даже объёма. Что от неё осталось после того, как мы убрали всю физику? Только форма, в данном случае квадрат.
И чтобы математически описать этот квадрат, сначала нужно договориться, где он находится. Выберем один угол доски и объявим его началом координат — точкой (0, 0, 0) Введём три воображаемые линии, которые идут через начало координат, их еще называют координатные оси:
ось (X) направим вдоль одной стороны доски;
ось (Y) — вдоль соседней.;
ось (Z) — перпендикулярно доске, или грубо - просто торчит вверх.
Сторону доски объявим единицей — метры и сантиметры остались в физическом мире вместе со столом. Теперь доска — это множество точек:
Запись читается так: S — это множество, состоящее из всех точек вида (x, y, 0), у которых первая координата — любое вещественное число от 0 до 1, вторая — тоже любое от 0 до 1, а третья всегда ноль. По факту и x, и y принадлежат к множеству между 0 и 1.
Деревянный предмет превратился в список символов. Этот трюк — переводить фигуры в числа - придумал Декарт в XVII веке, и называется он аналитической геометрией. С этого момента доску можно не рисовать, а вычислять.
Теперь — что значит «расположить доски в пространстве»? Нам достаточно всего два разрешённых действия: перенести и повернуть. Перенос — это сложение: к каждой точке прибавляем вектор t. Поворот — это умножение на матрицу R размером 3×3. Любое положение доски записывается одной конструкцией:
Теперь разберем эту конструкцию более подробно.
Штрих рядом с S означает результат преобразования той же сущности. S — доска до, S′ — та же доска после того, как её повернули и сдвинули. Чисто технически эту переменную можно было назвать как угодно, но для большей читабельности имеет смысл оставить связь с прошлой переменной.
t — это вектор переноса, и содержит он три числа: t = (tₓ, t_y, t_z) — на сколько сдвинуть вдоль оси X, на сколько вдоль Y и на сколько вдоль Z. Измеряется всё в наших единицах, то есть в сторонах доски: других единиц в этом мире не осталось. t = (0, 0, 1) читается «вдоль X не двигать, вдоль Y не двигать, вдоль Z поднять на одну сторону доски».
R — это матрица поворота, таблица 3×3 из девяти чисел. Откуда девять: поворот — операция линейная, а значит, его полностью определяет то, куда он отправляет три вектора координатных осей. Три оси по три координаты — девять чисел, и матрица — просто эти три ответа, записанные столбцами. Умножение R на точку собирает из них новое положение: «икс раз туда, куда уехала ось X, плюс игрек раз туда, куда уехала ось Y, плюс зет раз туда, куда уехала ось Z». А синусы и косинусы внутри — координаты повёрнутых осей: конец единичного вектора при повороте на угол θ оказывается в точке (cos θ, sin θ) — это буквально определение синуса и косинуса на окружности.
Теперь собираем куб — пусть он занимает пространство от 0 до 1 по всем трём осям.
Дно — исходная доска, она уже лежит где надо. Но даже ничего-не-делание математика заставляет оформить явно: R — единичная матрица, поворот на ноль градусов, t = (0, 0, 0).
Крышка — чистый перенос: R единичная, t = (0, 0, 1). Каждая точка (x, y, 0) уезжает в (x, y, 1).
Передняя стенка — а вот здесь нужен поворот: поставим доску вертикально, крутанув её на 90° вокруг оси X. Матрица поворота вокруг X выглядит так:
| 1 0 0 | | 0 cos θ −sin θ | | 0 sin θ cos θ |
Вот они слева направо - те самые синусы и косинусы. Оказывается, это шестерёнки поворота. Подставляем θ = 90°: косинус обнуляется, синус становится единицей:
| 1 0 0 | | 0 0 −1 | | 0 1 0 |
Умножаем на точку (x, y, 0) — и получаем (x, 0, y). Доска встала вертикально. Это передняя грань.
Оставшиеся три грани собираются из тех же двух глаголов: задняя — это передняя, сдвинутая на (0, 1, 0); боковые — поворот вокруг оси Y плюс, для правой, перенос на (1, 0, 0).
Итоговая формула куба:
где
Один квадрат и шесть пар «поворот + перенос». Всё. Получается полый куб.
А теперь оглянемся на инструменты, которые понадобились: координаты, векторы, матрицы, тригонометрия. Откройте оглавление учебников алгебры и геометрии за 10–11 класс — это оно и есть.
Что по итогу
Полученные расчеты — это и есть математика в ее простейшем и первозданном виде. Фактически мы берем упрощенную модель реального мира и на основе базовых примитивов оттуда — точек, линий, фигур и т. д. — строим непротиворечивую воображаемую модель.
И самое удивительное здесь в том, что эта воображаемая модель часто с поразительной точностью предсказывает процессы, которые происходят в мире настоящем.
По сути, последние 6 лет я занимался именно что математикой, просто я это так не называл. Собственно, сам компьютер является математической структурой, которая может производить новые математические структуры, и реализовано это в кремнии, в физическом мире.
И это не говоря уже о том, что все отцы-основатели — от Ады Лавлейс и Бэббиджа до Тьюринга с фон Нейманом — в первую очередь были гениальными математиками, и сам компьютер появился как результат решения математических задач.
Но чтобы раскрыть этот тезис глубже, мы кратко разберем, как компьютер вообще появился.
Находясь у Ядра Машины
Компьютер изобрели дважды, с разницей в сто лет, — и оба раза на бумаге это делали гениальные математики.
Первый раз — Лондон, 1830-е. Навигационные и логарифмические таблицы тогда считали вручную люди-вычислители — и ошибались, а по этим таблицам ходили корабли. Чарльз Бэббидж начал с механического калькулятора для таблиц, но в 1834-м замахнулся на большее.
Его Аналитическая машина — уже полноценный компьютер: «склад» на тысячу сорокозначных чисел (память), «мельница» для операций над ними (процессор), условные переходы, циклы и программа на перфокартах, подсмотренных у ткацкого станка Жаккара. Всё это — из латуни и шестерёнок, с приводом от пара. Точная механика XIX века такой проект не потянула, и машина так и не была построена. Она осталась чертежом — математической моделью, которой не досталось физической реализации.
Ада Лавлейс, ученица Огастеса Де Моргана — того самого, чьи законы вы применяете каждый раз, когда раскрываете !(a && b), — в 1843 году перевела статью итальянского инженера Менабреа об Аналитической машине и снабдила её примечаниями втрое длиннее оригинала. В примечании G лежит расписанный по шагам алгоритм вычисления чисел Бернулли, с циклом и рабочими переменными. Первая опубликованная программа — написанная для машины, которой не существовало.
За это Аду называют первым программистом. Титул формально верен, но он прячет самое интересное. Он рисует картину, будто Ада пересекла границу между математикой и программированием. А границы не было. Ада занималась математикой — причём математикой о математике: она описала поведение математической структуры, которая сама производит математические структуры. Это и есть компьютер, суть которого уместилась в одно предложение.
Второй раз компьютер изобрели в 1936-м — и с противоположного конца. Алан Тьюринг не собирался ничего строить: он решал Проблему разрешимости Гильберта — существует ли механическая процедура, которая про любое математическое утверждение скажет, доказуемо ли оно. Чтобы ответить, надо было сначала строго определить, что вообще такое «механическая процедура».
Тьюринг взял человека-вычислителя (слово computer тогда означало профессию) с карандашом, бумагой и инструкцией — и абстрагировал его до предела: бесконечная лента из ячеек, головка чтения-записи, конечная таблица состояний.
И доказательство состоялось: ответ Гильберту — «нет», существуют задачи, которые не решит никакая вычислительная машина. Компьютер родился побочным эффектом теоремы о границах самой математики. Причём в той же статье описана универсальная машина — та, что читает с ленты описание любой другой машины и исполняет её.
Программа здесь впервые перестала быть частью устройства и стала просто данными — строкой символов, которую можно хранить, копировать и скармливать машине, как любой другой ввод. По этому принципу сейчас работает и ноутбук, и телефон, и любая другая компьютерная техника.
Оставалось отлить эти принципы в железе — но это уже история фон Неймана, который, к слову, статью Тьюринга прекрасно знал, и так же был гениальным математиком своей эпохи.
Как вы можете понять, история происхождения компьютера чуть более, чем полностью состоит из математики, и двигали ее люди, которые решали именно что математические задачи. История компьютера — это не история железа, к которому позвали математиков. Это история математики, которая очень долго ждала своего железа.
Заключение
Я пока только думаю, что делать со свалившимся с неба откровением, но, пожалуй, первым делом перечитаю учебники алгебры за 10-й и 11-й классы — уже с пониманием того, что описанные там структуры вообще значат.
Статья получилась дико экспериментальной даже по моим меркам, и не уверен, что она людям зайдет, но решил рискнуть.
А тем временем это приключение подходит к концу. До новых встреч!
netricks
Поздравляю вас с озарением. Да узрите вы, что операции над коллекциями являются отображениями, теория групп правит миром, а линейная алгебра - по сути есть движок на котором работает научно-технический прогресс всей человеческой цивилизации.
И да... "математика изначально берет упрощенную модель реальности" - это тезис интуиционистов. А если вы хотите узреть здание математики во всём её великолепии, вы должны думать как формалист. Тезис формалистов такой: "математика не имеет никакого отношения к реальности. Это вещь в себе. А то что реальность с завидным упорством отражает математические концепты - это проблема реальности."