Предыстория (отрицание)
Когда я только начал интересоваться программированием, передо мной встал выбор - учить C или Python. В итоге, я выбрал Python из-за простоты использования языка. Под "использованием" я имею в виду "я не знаю что такое память, пока что нет времени учить как она работает, мне нужно написать что-то быстренько".
Это отлично сработало и не сказать что мой выбор был плох. Сейчас, когда я уже определился со своим направлением в программировании на ближайший период, я начинаю жалеть, мол "почему ты не начал с языка %X%, так бы быстрее влился в нужную тебе сферу". Хотя, по правде, эти жалобы - абсолютно бесполезны и некомпетентны, ибо на тот момент я не знал чего я хочу.
Казалось бы: сиди себе, программируй на Python простые программки и в ус не дуй. Однако, такой подход со мной не сработал - не могу я писать циклы, не понимая что происходит "под капотом". В итоге все свелось к тому, что я начал учить старый добрый C. Нет, не C++/Rust/Haskell или др., более абстрагированные языки, а именно C - мне он казался менее отстраненным от реальности на тот момент.
"Плохому танцору и ноги, и пол мешают" (гнев)
Изучение языка C шло размеренными шагами и, как у большинства людей, сопровождалось вопросами "Черт побери, что такое указатель? На кой черт он мне нужен? Да кому сдался такой тяжелый язык?". Прошу заметить, что в моем вопросе о тяжести языка шла речь не о синтаксисе, а о семантике.
Учил я, учил... писал всякие программульки: очень много раз натыкался на злющее сообщение "segmentation fault (core dumped)" и "радовался" жизни.
После того как я написал пару совсем простых программ, я стал ненавидеть C. В тот момент, меня можно было понять: до этого я писал на Python, писал программы намного быстрее, еще и работали они сразу. "Как можно вообще полюбить этот ваш C?"
Ну и бросил я это дело, и не сказать что жил я плохо после этого.
Абстрагируемся с первой космической скоростью (торг)
С момента неудачи прошло много времени: мне уже не так хотелось учить все эти низкоуровневые штуки, хотя и к высокоуровневым штукам я относился новичково-скептически. Все же, я принял решение попробовать Rust и был очень приятно удивлен. Язык, будучи довольно низкоуровневым, позволял практически не думать о тех вещах, над которыми тебя бы били палками в C.
Очевидно, что мой код был ужасен (сейчас ситуация лишь немного улучшилась), но меня это не останавливало и не расстраивало. Я видел подходы, видел методы решения задач, интересную архитектуру, асинхронность - это заполонило все мое внимание.
Я каждый день сидел с таким удовольствием над программированием на ржавом, что не хватило бы слов чтобы передать эти эмоции. Я и сейчас пишу на Rust, но уже с менее довольной рожей. Таким темпом проходит год, может полтора - и все прекрасно: мир розовый, мир полон пони, пора покупать кофе в Starbucks. Я активный участник коммьюнити Rust и по сей день - там прекрасные люди, которые действительно заинтересованы в языке.
С этого момента, я начинаю углубляться в различные, как мне тогда казалось, "глубинки" программирования: матлогика, теория множеств, лямбда-исчисление, теория типов. Это было завораживающе скучно, но и крайне интересно. Я, довольный студент первого курса по направлению "системное программирование", при помощи своих знаний, сдаю за 3 месяца до первой сессии компьютерную логику, дискретную математику, базовое программирование и алгоритмику. Еще и своих однокурсников по материалу натаскиваю. Все ведь хорошо, правда?
Все и вправду было прекрасно, до поры до времени. В какой-то момент, я начал ощущать тяжесть абстракций (хоть и даже 20% существующих не испытал на практике), которые мне казались великолепными и изящными при первой встрече. В действительности, я не профессиональный разработчик - у меня практически не было опыта разработки на тот момент. Так что, следующие статьи, в совокупности с некоторыми другими, все же выбили меня из колеи:
Я не могу сказать, что статьи абсурдно ужасны или великолепны, но я не слышал плохих отзывов о них.
Думаю заметно, как легко посеять зерно сомнений в неопытном человеке. Хотя даже там, где я опытен - я всегда ищу новое и интересное: может поэтому во мне посеять его проще, чем в остальных? Не знаю, судить не мне, но думаю, что суть ясна — зерно было посеяно и с этим нужно было что-то делать.
Вышеупомянутые статьи все еще актуальны для современного Rust, не смотря на то, что одна из статей - 2019 года: очередная проблема Rust формата "ожидайте™".
"Чем больше шкаф, тем громче падает" (депрессия)
Сел я, значит, в один солнечный день, и думаю: "Шо ж делать-то, друзья мои?". Мне было абсолютно ясно, что, например, для бизнеса, было абсолютно неважно на чем ты решаешь его проблемы, да хоть на бумаге: главное, чтобы это работало, это было поддерживаемо и можно было бы найти разработчиков для увеличения штата сотрудников. Однако, с того момента, программирование для меня стало чем-то бОльшим, чем просто "работа". Я вливаюсь туда с душой, а получаю негативный "отпор", что-ли... я хочу совершенствовать существующее и создавать невозможное, но я, будто, ограничен то ли своими амбициями, то ли своей расстроенностью.
Тут я и начал свои скитания по разным языкам, в поисках различного интересного и идеального. Я успел опробовать: OCaml, Haskell, Java, NASM под x86-64 Linux, C#, Lua, Go, Zig, C++, Fortran, HLSL, Pascal, JS, Idris, APL и другие языки. Мне понравилось использовать функциональные языки, но они были довольно сложны, и меня это отталкивало. Не подумайте, что я не люблю сложности и сразу же все бросаю - нет. Я впрямь заинтересовался функциональной парадигмой: sum types, product types, dependent types - все это я изучаю и по сей день. Но, меня все еще беспокоит сложность языков - они действительно прекрасны своими элегантными решениями, но слишком сложны. Возможно, я устал от возможности делать что мне взбредет в голову, хоть и восхищаюсь этой возможностью. Не меньше меня беспокоила возможность "выполнить задачу %X% двадцатью разными способами на одном и том же языке".
Go довольно простой язык, но я ведь искал "идеальный" язык, а в эту категорию языки с GC не попадают, прошу простить.
Может, нужно что-то попроще, что-то элегантно простое?
Конец? (смирение)
Хоть и не полноценным, но достаточно адекватным решением в моей ситуации было следующее:
- Осознать очевидную вещь - "не бывает идеального языка программирования";
- "Начать с чистого листа" - орудуем с самой основы используя язык C;
После того, как я поигрался с другими языками, вернувшись в C, я сразу же учуял запах старого деда. Однако, я бы не сказал, что это было плохо - это было... приятно? Хоть я и очень скучал по errors as values, удобному comp-time evaluation, гибкой системе типов, но я был сильно доволен простотой, понятностью и размеренностью языка C.
В этот момент я понял, что как бы другие языки не пытались трубить мол "я - самый лучший язык на планете", часто, это сводится к тому, что суть языка становится "перевернуть мир" и "показать всем как надо делать", а дальше занавес и пустота, затем - ничего. Будто им неинтересен результат крупной разработки.
Я действительно стал больше уважать C. У него есть минусы, есть плюсы - вы уже, наверное, и без меня это слышали, и еще услышите. Язык неидеален - это нормально, я это принял, но он достаточно прост, чтобы приблизиться к идеальности.
"И начал он изучать C, продолжил он падать на сегфолтах, страдать от макросов и невыразительности языка, но был он доволен как слон и ненасытен в познании нового как лев".
Итоги
"К несчастью, то ж бывает у людей:
Как ни полезна вещь, — цены не зная ей,
Невежда про нее свой толк все к худу клонит;
А ежели невежда познатней,
Так он ее еще и гонит."
Крылов И. А., 1815 год.
Знаете, а я даже рад, что в итоге прошел через эти 5 этапов. Может, я прошел их раньше остальных разработчиков/заинтересованных, а может и слишком поздно - кто знает. Главное, что я их уже прошел и нужно двигаться дальше.
Я пойму, если вы скажете, что эта статья - ни о чем. Кто-то посмеется, кто-то увидит себя в этом, кто-то не дочитает даже до этого момента - это нормально, я буду рад любому мнению.
Спасибо за внимание. Пойду на C попишу, что ли.
ООО "Безнадежная молодежь".