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

Мы подходим к развилке, когда становимся более опытными разработчиками; Должны ли мы выбрать специализацию в нашем текущем стеке или диверсификацию, чтобы иметь возможность работать в нескольких парадигмах? Большинство разработчиков, с которыми я работал в прошлом, выбрали первое. Хотя это правильный выбор карьеры и у него есть свои достоинства, я считаю, что становление программистом-полиглотом имеет огромные преимущества, которые недостаточно представлены на рынке труда. Вот об этом я и хотел бы поговорить с вами сегодня.

Понимание синтаксиса языка

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

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

Недостатки языковой специализации

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

Если вы не работаете только над одним типом проекта, вероятность того, что вы тоже столкнетесь с этой проблемой, очень высока, если вы еще этого не сделали. Именно здесь ограничение себя только одним стеком ставит вас в крайне невыгодное положение. Единственные варианты, которые у вас есть на данный момент, — это заново изобрести колесо или использовать несколько инструментов или библиотек с различными уровнями интеграции, чтобы комбинировать уже готовое решение. Будучи полиглотом, вы сможете адаптироваться и решить проблему быстрее, либо написав свой сервис или решение на основе найденной вами библиотеки или фреймворка, либо быстрее изучив решение и реализовав параллельное решение в другом стеке.

Использование основных концепций

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

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

  1. Переменные. По сути, это именованные ключи, в которых можно хранить значения для последующего использования. Некоторые языки имеют несколько типов объявлений переменных, например JavaScript, а другие — только один, например Python. В любом случае, их назначение функционально с небольшими отличиями.
  2. Типы данных. Это первое отличие одного языка от другого. Некоторые языки предлагают широкий спектр типов данных, в то время как другие сводят их к простым числам, строкам, логическим значениям и т.п.
  3. Сложные типы данных. Более сложные типы данных существуют практически в каждом языке, например массивы, кортежи или структуры. Большинство языков программирования также позволяют вам, как разработчику, создавать собственные типы данных, состоящие из комбинаций всех доступных типов данных.
  4. Потоки управления. Здесь кривая изучения языка программирования начинает увеличиваться. Вообще говоря, знания того, как написать оператор if/else, цикл for и цикл while, достаточно, чтобы разобраться в языке и добиться нужного результата.
  5. Функции. Эта концепция лежит в основе программирования. Умение писать функции, которые легко читать и тестировать, а также эффективное использование функций для разделения кода на логические единицы — вот что отличает посредственного программиста от настоящего профессионала.
  6. Обработка ошибок и отладка. Обработка ошибок, которую часто упускают из виду, помогает справиться с трудностями при работе с языком программирования. Понимание того, как язык или инфраструктура сообщает об ошибках и обрабатывает их, поможет вам быстрее отлаживать проблемы и избавит вас от необходимости программировать в обороне.
  7. Модулизация и разделение кода. Изучение того, как язык программирования или фреймворк позволяет вам разделять код по файлам и использовать сторонние приложения, открывает вам двери для создания многофункциональных приложений в любом стеке.

Сила понимания основных концепций

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

Прагматический подход: решение проблем с помощью правильного инструмента

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

Способ, которым я смог реализовать это в своей жизни, заключается в пассивном изучении вещей, когда я работаю над проблемой или ищу решение. Когда я сталкиваюсь с задачей, которую я не уверен на 100%, я трачу около получаса на то, чтобы выяснить, какие инструменты, языки программирования или фреймворки другие использовали для решения подобных задач. Часто я нахожу нужную информацию на уже известном мне языке, но это также открывает передо мной и другие возможности.

Если я часто сталкиваюсь со стеком во время своих исследований, он становится вероятным претендентом на мое следующее начинание в языке программирования. Это когда я смотрю видео или два о языке или читаю документацию, чтобы понять ключевые различия между ним и тем, что я уже умею делать. Во время этого процесса я сталкиваюсь с большим количеством кода, который я просто не понимаю, и я стараюсь пересматривать его несколько раз, когда узнаю больше о языке программирования, чтобы сравнить свой уровень понимания с точкой, в которой я оказался в прошлом. Я также стараюсь ознакомиться с тем, как устроена документация по языку, чтобы быстро ориентироваться в ней.

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

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

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

Естественно, это очень личный выбор для меня; так же, как это будет для вас. Смысл этой части состоял в том, чтобы просто пролить свет на возможность разработки с несколькими стеками, потенциальные преимущества этого выбора и, в конечном счете, помочь вам принять обоснованное решение о том, как вы хотите формировать свое путешествие.