March 15, 2024

Когда программирование было интересным

Давеча вспоминал, как я начинал программировать в школьные годы, какие программы я писал, на каких языках. Чуть позже так совпало, что знакомился с нашим новым тимлидом и он тоже вспоминал свои начинания, а я ему рассказывал про свои. И хоть мы вместе всего второй раз за жизнь виделись, сумели поймать эдакую волну прежней страсти к программированию, и разговор, который должен был длиться минут десять, в итоге затянулся почти на час. Хочу вспомнить все эти моменты и изложить их тут в текстовом виде, а не просто на словах. Поностальгировать по прежним временам, когда программирование не было ограничено работой, когда не было интернета, когда куча времени тратилась на разбор в примитивных вещах, но радость от работающей программы превосходила все многочасовые страдания над двумя строчками кода.

Мой папа к сожалению развелся с мамой, но почему-то оставил у нас в квартире свой стационарный компьютер. И так эта лежачая коробка с огромным ЭЛТ монитором пылилась долгие годы, аж пока я одним утром не проснулся, не посмотрел на него и не задался вопросом — а что это вообще за хрень и что она делает?! По нынешним стандартам с глобальным доступом в интернет, ко всем знаниям мира и искусственным интеллектом, которые умеет генерировать картинки, видео, текст и код, то были дикие времена. Компьютеры были относительно слабые, огромные и мало что умели. А тот, что стоял у меня, был уже устаревшим на несколько поколений. На нем была 95-я винда и все, что она умела на тот момент — это рисовать в пэинте, проигрывать WAV файлы, компакт диски, и писать текстовые файлы. А ну да, еще там был солитёр и паук с майнсвипером. Это все, что меня тогда могло заинтересовать в компьютере как школьника. Одноклассники играли в разные игры на своих компах, но у меня их не было. Чуть позже я более-менее разобрался в спецификациях этого куска железа, и пошел с мамой на раскладку дисков в метро на Лукьяновке. Там добрый дядя навешал мне лапши на уши, что все игры, которые я выбрал, без проблем будут пахать на моей лошадке, хотя требования на обороте дисков явно не совпадали с возможностями моего компа. А комп то был действительно допотопный. Помню, что там был 120-мегагерцовый процессор и винт всего на 600Мб. Сколько было оперативки не помню, но можно догадаться. Проц был даже не Intel вроде бы, возможно Texas Instruments, потому что Intel-ы на то время были уже минимум на 133MHz. Вот так приблизительно выглядела эта коробка:

Купленные мамой игры на таких железяках конечно же даже не установились. И я не мог толком понять почему. Позже я догадался, что свободного места на винте просто не хватало. Тогда поудалял по максимум все ненужное, но когда и это не помогло, решил воспользоваться функцией Windows, которая вроде как "сжимала" содержимое диска и в теории могла увеличить свободное место. Как и все подобные "магические" утилиты в те времена, эта хрень просто сломала мне систему.

Честно сказать, очень сложно собрать в памяти, какие именно компы у меня были. Помню из глубокого детства очень допотопный tower моего бати, с огромным красным тумблером, но я его не использовал. Вроде как IBM такие делали, не уверен. Потом были вот эти лежачие Compaq-и. Первый сдох по моей вине от сжатия диска, и папик сам заменил его на более свежую модель Compaq-а, который похож на картинку ниже. Я буквально пытался вспомнить эти модели по кнопкам включения (у первого был тумблер, а у более нового вот такая круглая кнопка). Я остановлюсь на предположении, что первый был Compaq Prolinea, а второй Compaq Presario.

В любом случае даже по меркам того времени — что одно было говно, что другое. Про всякие там Commodore, о которых обычно рассказывают бородатые тру-программисты, я и не слыхал. Вообще в моем окружении никто ничего не знал о компьютерах. Кроме разве что моих одноклассников, которые пользовались ими исключительно в интерактивных целях, играли в игрушки. Мне же современные игрушки были недоступны. Работали только простые DOS игры на этих компах, коих у меня был целый компакт диск.

Иными словами, интерактив для меня на этих железяках закончился быстро. Однако я видел в них огромный потенциал, и поэтому продолжал сидеть и искать в дебрях файловой системы хоть что-то интересное. От скуки я прошерстил наверное все возможные файлы и папки, и в конечном итоге попал на программу с названием Visual Basic 6. Когда я ее открыл, то увидел перед собой дизайнер привычных мне виндовых форм. И тогда подумал — хм, если я смогу разобраться, как самому создавать программы для этого компа, то мне уже никогда не будет скучно, и я никогда не буду ограничен в выборе того, что есть на этом компе. Доступа в интернет тогда не было, покупать или даже качать программы было практически невозможно. Единственным выходом было писать эти программы самому: если мне что-то надо, то в чем проблема создать это собственными руками и использовать?!

Так и начался мой путь в познании программирования. Уже смутно помню, как именно я разбирался в азах работы с Windows формами и Visual Basic. Большую часть этих знаний я похоже получил методом проб и ошибок: буквально сидел и ковырялся в этой IDE с каждым компонентом, пробовал что он делает, как он реагирует на разные изменения. Возможно я так жа нашел на компе какие-то примеры кода и ковырялся в них, не помню. Этот комп явно был рабочей станцией с папиной работы, поэтому там остались эти средства разработки. Прогресс моего обучения был очень сумбурным и тернистым. Мне не хватало примитивных знаний, хотя бы каких-то примеров. Я буквально занимался blackbox тестированием языка программирования как обезьяна. У меня не было ни литературы, ни учителя, ничего вообще. Я пытался понять сами концепции — что у компонентов есть какие-то свойства, что их можно менять. Что они вызывают какие-то события при взаимодействии с ними, и в этих событиях можно выполнять какой-то код. А с помощью этого кода можно, например, менять свойства других компонентов, или выполнять иные задачи.

Спустя какое-то время папик узнал о моих интересах, и купил мне две книги — одну тоненькую по Quick Basic, и вторую толстую именно про Visual Basic 6. Я помню какой восторг тогда испытал, как только пролистал эти две книги при встрече с папой — я хотел немедленно идти и писать код, проверять те примеры, которые там были описаны. Наконец у меня появилось хоть какое-то руководство, которое я смогу прочесть и понять, что и как делать. А даже если не смогу понять, то смогу разобраться в каждой отдельной строчке кода из примеров. И так я и делал — я написал все программки из тоненькой книги на QuickBasic. Я разобрался в каждой из них, как она работает, что она делает. Это было максимально интересно. Потом я перешел обратно к Visual Basic и начал клепать формочки с кнопочками и текстовыми полями, соединять их между собой, смотреть как они работают. Я изучал каждый компонент и что он делает, экспериментировал. Не было лучше чувства на свете, чем собрать даже самую простую, тупую программку, которая ничего не делает, поставить её ярлык себе на рабочий стол рядом с остальными, и запустить её. Книга помогала понять всю ту базу, которой мне не хватало, и параллельно давала примеры к которым я бы сам никогда не пришел. Это был огромный толчок в моих познаниях.

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

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

Так же я работал и с графикой — освоил инструменты для рисования примитивов. Сделал очень простую версию собственного пэинта. Да, она не умела заполнять пространство цветом или рисовать спреем. Для этого мне не хватало знаний алгоритмов. Но со всякими примитивами она прекрасно справлялась и умела сохранять это в файл, открывать файл, редактировать его. Одной из первых проб некого "алгоритма" была моя успешная попытка самому попытаться разобраться, как отрисовать отрезок. Это казалось довольно простая задача — есть точка А и точка B с соответствующими координатами. Нужно равномерно заполнить между ними пространство шириной в один пиксель. Сколько часов или даже дней я убил на это... Хотя по сути мне не нужно было это делать, все предоставленные мне инструменты уже это умели. Но мне было интересно попробовать самому разобраться, как такая простая вещь может предположительно работать под капотом этих инструментов. В конечном итоге я добил этот алгоритм и он рисовал отрезки. Проблема была только в том, что по сравнению с нативными методами, оно было довольно медленным. Ну, во-первых Visual Basic был не самым быстрым, во вторых мой комп, а в третьих мой алгоритм. Но это было и не важно. Важно было то, что хоть это был не самый эффективный метод обучения, зато очень действенный. После таких упражнений, понимание программирования укрепляется прям конкретно. Что немаловажно, так это то как порой попытки сделать какие-то вещи приводили к тому, что давали знания и понимание того, как что-то сделать в своих предыдущих программах.

В какой-то мере программирование переплеталось с полученными знаниями в школе. Мы начали изучать синусы, косинусы, тангенсы и прочую лабуду. В нагрузку к этому шло умение рисовать графики этих функций, и соответствующие задачи, типа нарисовать график функции 2cos(x) + 1. Я подумал очень просто — на кой хрен мне знать, как рисовать эти функции, если я могу написать программу, которая будет рисовать их за меня?! Изи-пизи, черт побери! О наивный молодой я, еще тогда не сознававший, на сколько сильно сам себе противоречил. Проблема была только в том, что я никак не мог подойти к этой задаче. Поэтому я поехал одним вечером к бате в гости и попросил его раздуплить меня. Целый вечер мы сидели за его ноутом и он раскладывал мне эту задачу по мельчайшим деталям. Сделал такую же форму, с пространством для рисования, обьяснил что такое график функции, и постепенно начиная от отрисовки осей и координат, до точек графика, описал весь алгоритм рисования. Разжевал мне его до мельчайших подробностей. Никогда в жизни я не был так поглощен в этот процесс, как тогда. Мне было максимально интересно, максимально понятно. Я аж зубами скрипел от нетерпения, чтоб попробовать реализовать это самому, чтоб закрепить эти знания. Пришел потом домой и сел писать по памяти все то же самое. И написал. И мог теперь рисовать любые графики. Были там проблемы с этой прогой, которые требовали разбираться в графиках функций, но я их исправил.

Что мне не нравилось в этой программе, так это необходимость каждый раз ее переписывать и компилировать под каждую новую функцию. Ты не мог просто ввести в текстовое поле функцию и отрисовать ее. И я начал думать о том, как это реализовать. Иными словами, я начал пытаться писать свой собственный парсер и транслятор. Пропарсить строку для меня не являлось проблемой, но что делать со всеми этими токенами и символами дальше я просто не знал. Мне для этого не хватало знаний в структурах данных и в принципах разработки трансляторов. Более того — я даже не знал слова "парсер" и "компилятор" на тот момент. Батя дал мне намёки, в какую сторону смотреть, но времени раздуплять меня в столь обширных темах ни у него ни у меня к сожалению не было. Поэтому эта тема отложилась до лучших времен (аж до универа).

Еще я часто использовал Wolfram Mathematica для решения задач по алгебре. И меня всегда впечатляла возможность этой программы точно выводить результаты любого размера. Хочешь помножить миллион миллиардов на двадцать тысяч в пятидесятой степени? Какой ответ тебе даст твой обычный калькулятор? Правильно: 1e1000. Очень понятно, очень точно, очень полезно. Wolfram Mathematics выведет тебе точный результат до последней цифры, даже если он будет занимать 50 экранов места. И меня это впечатляло. Я понимал, что типы данных в компьютерах ограничены и не могут посчитать точно столь большие числа. Поэтому я придумал свой способ — почему бы мне не работать с цифровыми примитивами как со строками, и не реализовать арифметику самому? А ведь действительно, что такого в арифметике? Мы все ее изучали в начальных классах школы, там простой алгоритм действий, чтоб сложить, вычесть, умножить или разделить два числа. А это необходимый минимум для любых вычислений. Дальше можно вывести из этого все, что душа пожелает, и получить максимально точный результат вычислений. Казалось просто, но чисто на сложение и вычитание я потратил несколько дней времени, и этот алгоритм все равно не работал идеально (стыд-позор). Что уж говорить про умножение и деление...

Интересно в этом всем то, как по мере освоения чего-то нового, я приходил к более сложным проблемам. И эти проблемы были вполне реальны и более фундаментальны. Так как например с транслятором: мой путь познания программирования привел меня к фундаментальной проблеме создания программы, с помощью которой можно писать другие программы. Моя проблема с разработкой супер точного калькулятора, привела меня к проблеме с манипуляцией числами в компьютерах, к базовой математике. Ох, не помню даже насколько это было давно и насколько я был мал, когда так же у папы дома мы залегли с ним на диван, и он начал объяснять мне двоичную систему исчисления на бумажках. Все так же само, по полочкам — от того, как представлена десятичная система, в чем ее смысл, и что такое двоичная система. И до того, как сложить, вычесть, умножить и поделить двоичные числа. А потом он рассказал про шестнадцатиричную систему и дал понять, что предела тут нет. На следующий же день я пошел домой писать программу, которая преобразует числа между разным системами счисления. О святые угодники, не могу себе представить более скучного времяпровождения с ребёнком. Но для меня это было самым захватывающим занятием. Да, программисты слегка конченные люди, даже в детстве. Пока все играли в Counter Strike, я рисовал графики, умножал и делил двоичные числа, и получал от этого кайф. Вообще я любил сразу писать всякие утилитарные программки, как только разбирался в новой теме. Всякие преобразователи чисел, кодов цветов, времени и т.п., уже всего и не вспомню.

В какой-то момент я все-таки накопил 100 грн на 56Кбит модем и подключил свою клячу к глобальной сети. Начались вот эти вот странные звуки, негодование бабушки вечно занятой линией и огромным счетом за телефон. До этого для связи с папой, который какое-то время жил далеко в Ирландии, мне приходилось ходить в компьютерный клуб, чтоб прочитать имейл от него и написать что-то в ответ. Просто дикий запад какой-то, amish paradise, пещерный век! Интернет у меня дома приоткрыл окошко в мир, дал увидеть, что вообще происходит за пределами некогда разваленного совка. Помню я вернулся к своему медиаплееру, хотел там сделать визаулизации. Простые, на подобии такой как была в том же винампе. Существующий виндовый компонент медиаплеера не позволял такого сделать, и я начал искать пути решения этой задачи. Тогда же я начал свое знакомство с библиотеками — надыбал вроде какую-то бесплатную библиотечку, которая умела работать с аудио файлами и имела интерфейс, который возвращал данные гистограммы в реальном времени. Убил на это дело наверное целую неделю, раз за разом вчитываясь в документацию и пытаясь её понять. Я получал некий результат, но он было каким-то неполноценным. Полосочка (или бары) дергалась совсем чуть-чуть, аж пока я в сотый раз не вчитался в документацию и не понял, что оно для каждого тона аудиоспектра возвращает значение от 0 до 1. Мне оставалось только помножить это на высоту моей шкалы, и в итоге я получил заветные полоски аудиоспектра!

Картинка для иллюстрации

После этого я начал гуглить много разных вещей. Одной из них была возможность делать alpha-прозрачность на формах. Видите ли, интерфейсы тогда выглядели максимально убого. И я все время пытался их как-то улучшить. Одним таким вдохновением был splash-скрин тогдашнего фотошопа. Кто помнит, он был не просто прямоугольным, а произвольной формы. И при этом плавно сливался с тем, что было под ним. Возможность делать прозрачные места в windows формах была, и это было просто. Но это балы исключительно или полная прозрачность, или ее отсутствие. Поэтому, если я хотел например сделать у формы закругленные края, они выглядели вот так:

А я хотел, чтоб было вот так:

И к сожалению это не поддерживалось. Мне пришлось покопаться в форумах и глубоко в документациях windows forms библиотеки, чтоб понять как это сделать. Это уже требовало подключения этой библиотеки и каких-то хитрых манипуляций с шестнадцатиричными параметрами, чтоб реализовать. Точно не помню, получилось у меня это или нет. Но если и получилось, у меня в памяти такое чувство, что оно просто жутко лагало. Не знаю, как сделали это в фотошопе, но винда на тот момент не поддерживала такого функционала.

Вообще тема интерфейсов меня тогда тоже интересовала. Я насмотрелся на современные интерфейсы Apple — их Macintosh, Logic Pro, Motion, Final Cut. В сравнении с тогдашним уже Windows XP это была земля и небо. Глядя на компьютеры Apple я начинал ненавидеть винду. Но Apple были недосягаемы. Они и сейчас со своими ценами для большинства людей недосягаемы, а тогда для нас, школьников c только начавшими прорезаться усиками, это был космос. Помню, как Валдис накопил денег и купил свой первый MacBook Pro. Он показывал его торец приоткрыв сумку, почти в подворотне. И я узнал этот комп чисто по его торцу, потому что тогда не было ни одного ноутбука похожего на MacBook. Все было пластиковое, убогое, дебелое, оно скрипело и гнулось. Тачпады были неудобными, каждый выдумывал какую-то свою неудобную фичу в ноутбуках, интегрировался со сторонними производителями для рекламы. В общем был полнейший бардак. Сейчас на маркете дешевых ноутов в принципе такой же бардак, но уже хотя бы есть прилично смотрящиеся модели подороже. К сожалению у Валдиса его макбук в итоге украли. А я, все что не пытался делать, делал это с оглядкой на интерфейсы Apple. И постоянно удивлялся — неужели, сука, так сложно сделать что-то достойное и на винде?! Меня начало бесить это меню "Пуск" или "Start" на английском, в котором я постоянно пытался сделать удобный порядок приложений, которые использую. Но я продолжал недоумевать — почему, просто почему бы их не вынести на главный экран как в Dock на маке? Почему самая важная вещь в компьютере (программы) должна быть постоянно спрятана за каким-то идиотским "пуском"?! В плане дизайна и функционала, винда меня бесила практически всегда и всем. В более молодом возрасте я не знал об альтернативах, но когда их увидел то понял, что винда убогая.

Позволить себе мак я не мог, поэтому написал свой собственный Dock — с возможностью прикрепить туда любые программы и в любом порядке и даже с кастомизировать иконки. И вся эта лабуда прекрасно смотрелась на моем рабочем столе. Она была не идеальная, не повторяла весь функционал оригинального дока (но я его даже и не знал), зато удовлетворяла мои потребности в перфекционизме на каком-то уровне.

Я очень жалею, что у меня не осталось ни одной крупицы исходного кода всех тех программок, которые я писал. Компы менялись, носители менялись, устаревали, ломались. Про Git и вообще про VCS я и знать не знал, поэтому со временем оно все кануло в лету. Хотел бы я сейчас посмотреть на этот код, показать его и даже попытаться запустить какие-то из тех программ.

Сейчас уже совершенно другие времена. Теперь есть макбук с доком. Теперь можно за одну минуту установить модуль для вычисления больших чисел; за два часа поставить и сконфигурировать лексику для своего транслятора и начать им пользоваться; за несколько минут сделать визуализацию звуковой дорожки; можно делать формы любой формы (простите за тавтологию), и конвертировать все что хочешь, во все что хочешь. Можно сделать видео чат, можно сделать любую рисовалку, найти реализацию любого алгоритма. Все, что можно было запрограммировать в те времена, уже запрограммировали. В самой работе нету той страсти, которая была ранее, когда только все это познавал. Изучать новые языки не хочется, потому что понимаешь, что все они плюс-минус одинаковые — имеют одинаковую структуру, но разные слова. Становится просто лень, потому что ничего особенного, нового или уникального ты на них не напишешь. Напишешь все то же самое, но просто на другом языке. Изредка появляются интересные задачи, которые можно делать долго, сложно, томными сонными ночами — и это интересно. Но это изредка. Каким-то странным образом отсутствие информации в прошлом толкало больше к действию и естественному познанию, чем сейчас, когда все знания мира под кончиками твоих пальцев, но именно поэтому ничего не хочется познавать.