Вот ты твёрдо решил(а) стать программистом. Но ведь есть столько разных направлений и сложных названий, значение которых ты пока не очень-то и понимаешь. В этой статье я рассмотрю только те направления, в которых нужно писать код, хотя бы иногда. Т.е. менеджерские и прочие позиции не вошли, просто чтобы статья не получилась неподъёмно длинной. Итак, попробуем разобраться. (Если я что-то забыл, то буду рад уточнениям в комментариях)
1) Фронтенд (Front-end)
Эта область, как и бэкенд, относится к веб-разработке, т.е. к "деланию сайтов". Фронтендер занимается той частью сайта, которую видит пользователь в браузере. Т.е. кнопки, логотип, поля ввода, окошко, в котором показывается видео и красивый анимированный фон - это всё работа фронтендера. Точнее, часть его работы - вёрстка. (Не обязательно, кстати, кнопки и окошки. Голосовой интерфейс - тоже своего рода фронтенд). Но от верстальщика до фронтендера в настоящее время уже довольно далеко. Потому что современные сайты могут представлять собой полноценные приложения в браузере. Часть функционала такого приложения ложится на бэкенд (тот код, который выполняется на удалённом компьютере в сети - сервере), но довольно большая часть может выполняться и непосредственно в браузере. Единственный язык программирования, выполняющийся в браузере - это JavaScript (про WebAssembly пока умолчу). Не потому что он такой хороший, а скорее так сложилось "по историческим причинам". С ним и придётся работать. Я не буду сейчас сильно углубляться в тему, фронтенд - это очень объёмная область (как и почти все другие) и даже просто назвать все технологии в рамках одной статьи - нереально. Тем более в рамках этой области я закономерно предвзят:). Сделаю только одно замечание. Выбирать фронтенд я советую тем, кому важно видеть результат своего труда непосредственно, тем, кто немного "визуал". Фронтенд - это, конечно, далеко не дизайн, но разрабатывать вы будете именно визуальную часть (да, у неё тоже есть логика).
2) Бэкенд (Back-end)
Бэкенд - это тоже про веб-разработку. Т.е. тот код или, проще говоря, компьютерная программа, которая выполняется на сервере (можно думать о нём как о просто другом компьютере в сети) и к которой можно обратиться "через интернет" и получить ответ (подробнее об этом взаимодействии см. мою немного сумбурную статью "Устройство интернета для самых маленьких"). Чем это отличается от фронтенда? Во-первых, с сервером пользователь не взаимодействует напрямую. Пользователь взаимодействует с фронтенд частью сайта в браузере. Это называется UI - User Interface, интуитивно понятный, естественно:). И уже браузер посылает "запросы" и слушает "ответы" от сервера, пользователю об этом знать вообще не обязательно. При разработке бэкенда вы НЕ будете работать с визуальной или другой "пользовательской" частью сайта (на самом деле писать html иногда придётся), вы будете работать с сетью, т.е. писать такие, вроде как, функции (как математические функции), которые получают какие-то данные из сети, что-то с ними делают (сохраняют, преобразовывают, что-то вычисляют, находят) и отправляют обратно результат. При этом, кстати, совершенно необязательно, что ваш сервер будет "общаться" по сети именно с фронтенд частью сайта, он вполне может взаимодействовать с мобильным приложением или и с другими серверами. Например, пользователь запросил картографические данные. Они не обязаны храниться на вашем сервере, они могут быть на сервере какого-нибудь, прости господи, Гугла. Оттуда наш сервер их и запросит. По-моему, бэкенд больше подойдёт людям, склонным к абстракциям, математике, тем, кто любит решать задачки и уравнения. Впрочем, сама математика будет нужна редко, просто это такой понятный образ. И во-вторых ("во-первых" уже было, помните?), если говорить о технологиях, то здесь их даже ещё больше, чем во фронтенде, но это часто такие невзаимодействующие, во многом повторяющие друг друга области. Например, пишущие сервера на Java понятия не имеют, как это делается в PHP, и им от этого ни холодно, ни жарко. Если фронтенд так или иначе всегда вынужденно завязан на JavaScript, то в бэкенде вы вольны выбирать вроде как вообще всё что угодно, на чём можно писать компьютерные программы. Хоть на бэйсике сервер пишите, кто вам запретит? При этом из-за просто невероятного количества вариантов вы, скорее всего, будете вариться в своём "пузыре" технологий. Джависты всегда уверены, что вокруг одни джависты, рубисты - то же самое, и т.д. Это не отменяет того факта, что базовые для бэкенда вещи - сетевые протоколы, базы данных, etc - везде одинаковы. Если бэкенд в целом вам по душе, то нужно выбрать для начала какой-то один язык и его экосистему, а дальше видно будет. Язык можно и поменять, при этом базовые знания вы не потеряете. Из популярных и востребованных языков бэкенда - Java, PHP, Python, Ruby, Go и, на минуточку, JavaScript.
3) Embedded (программирование устройств)
Это очень важная, но по какой-то причине довольно низкооплачиваемая относительно других (в России) область программирования. Я надеюсь, что есть исключения. Это часто (не всегда) про "низкоуровневый" код, что значит - ближе к "железу". Будет сложно это освоить без инженерного образования, по крайней мере мне кажется, что нужно немного разбираться в устройстве электронных приборов, чтобы понимать почему ты пишешь этот байт в этот регистр. Все электронные устройства - микроконтроллеры, модули Wi-Fi, стиральные машины, Tesla в твоём гараже - запрограммированы этими героическими людьми. По-моему, мы часто даже не замечаем, насколько много подобного кода вокруг нас. Подразумевается по-умолчанию, что стиральная машина стирает, а вайфайчик раздаётся. Да, написание драйверов и операционных систем я бы тоже отнёс сюда. Т.е. Linux - их (его!) рук дело. Языки программирования, применяющиеся здесь - в-основном, конечно, Си, реже С++, разные ассемблеры и осторожно прокладывающий себе дорогу Rust. Делают также разные фокусы с Python и JavaScript, но мне кажется это какое-то баловство, поправьте меня, если это не так. Главный плюс работы в этой области в том, что ты можешь "оживлять" реальные вещи, иногда довольно крышесносные - электронный водосчётчик (тоже неплохо), умный дом, дрон, эту твою Теслу, космический корабль Dragon и т.д. Если ты хочешь работать в Boston Dynamics - то тебе сюда. Или (мы плавно подходим к следующиему пункту) туда ->
4) Machine Learning (Машинное обучение)
Я об этом знаю довольно мало, простите. Главное, что я хотел сказать (а ведь мне это в своё время никто не объяснил), что Machine Learning и Data Science - это разные вещи. Несмотря на то, что в рекламных баннерах они часто стоят в одном предложении. Это связанные области, но цель у них разная. Да, и тут и там Python. Почему именно Python? Да просто учёные - не программисты, поэтому им в плане языков программирования хочется чего попроще. Ну и скоростные вычислительные модули на Си легко прицепляются (тут уже без помощи программистов явно не обошлось). Так вот, цель Machine Learning - "научить машину" (всё, расходимся) выполнять какое-то относительно сложное действие "разумно", правильно. Находить путь в лабиринте, поддерживать равновесие при прямохождении робота, поддерживать беседу. Нейронные сети здесь не то, чтобы совсем ни при чём, но нейронки - это всего лишь один из методов, просто сейчас он довольно успешно применяется, поэтому на слуху. По поводу работы, честно, не знаю. Кажется, что не каждый киоск будет вашим клиентом. Как с футболистами - единицы зарабатывают миллионы, остальные - просто любят футбол. Всё же думаю, что если вам это нравится и вы сможете стать крутым специалистом, то работа найдётся. В Boston Dynamics, например (ну люблю я эту фирму, люблю), или на худой (ахах) конец в беспилотниках Яндекса.
5) Data science и Data Analysis
В отличие от Machine Learning, у этой штуки другая цель. Да, это иногда тоже про нейронки и про Python, но суть в другом. Из-за увеличения объёма данных в мире некоторые компании пытаются использовать эти данные в коммерческих целях (не вижу в этом ничего плохого). Ну или для "улучшения пользовательского опыта". Ваша работа будет заключаться в анализе больших объёмов данных (что пользователи слушают, смотрят, что они покупают, как реагируют на тот или иной контент или интерфейс), выявлении закономерностей и выдаче рекомендаций и стратегий, как это можно использовать. Даже может быть написание таких систем, которые на основе данных принимают какие-то решения. Т.е. по сути - прикладная статистика, только с использованием современных инструментов и методов. Инструменты такие - Python и его датааналитические библиотеки, популярный язык R (мне кажется сейчас учить его с нуля уже не нужно, хотя я может чего не знаю), Julia и старый добрый Excel.Обычные задачи - рекомендательная система на основе музыкальных предпочтений пользователя. Ну или контекстная реклама. Если при этом вы ещё что-нибудь прям "изучаете", то это уже можно назвать Data Science. На самом деле граница между Data Analysis и Data Science размыта (или это голова у меня размыта). И это вот прямо та область, где может реально понадобиться математика (а ты-то убеждал маму, что "в жизни" она не нужна). По работе - не уверен. Много вакансий я что-то не вижу, но думаю, то что есть - это часто интересные и денежные вакансии, к тому же вы сможете зарабатывать деньги математикой, а уже одно это - прекрасно.
6) Mobile - iOS и Android
Всем, наверное, понятно, что эта область занимается разработкой приложений для мобильных устройств - смартфонов, планшетов, смарт-часов. Это действительно так, но не только. Не считая мелких игроков, сейчас существуют 2 платформы - iOS и Android. Правильнее было бы так и называть эти области - разработка под систему iOS и разработка под систему Android. Потому что Android устанавливают ещё и в телевизоры (они не очень мобильные), в бортовые компьютеры автомобилей (сегодня видел вакансию Android-разработчика для встроенных систем в Яндекс-такси), ну и вообще во многих местах можно её найти. Раньше, как правило, разработчики под iOS и разработчики под Android были разными людьми, потому что специфика этих систем разная, а универсалом быть сложно. Сейчас часто всё-таки пытаются упихать это в одну голову, потому что одни хотят сэкономить (заказчики), а другие хотят заработать (разработчики). Насколько это получается - судить не мне, но я считаю, что оба эти желания - сэкономить и заработать - нормальные человеческие желания. Поэтому же, кстати, сейчас моден "фуллстек" (фронтенд и бэкенд вместе) в веб разработке. Современные приложения для iOS в-основном пишутся на языке Swift, для Android - Java и Kotlin. Существует также отдельный вид искусства - кроссплатформенные (универсальные, для iOS и Android сразу) мобильные приложения, их пишут на Flutter (моя любовь), ReactNative, NativeScript, Xamarin, ну и всяких богомерзких Ionic, Cordova и подобных. Различия объяснять здесь не буду, скажу лишь, что "нативщики", т.е. те, кто пишет приложения на Java под Android и на Swift под iOS, часто принципиально не любят такие штуки, из соображений производительности (а возможно просто из вредности). А любит их кто? Правильно, фрондендеры (мои няшки). Потому что кроссплатформенные инструменты часто во многом пересекаются с технологиями разработки под браузер и при этом относительно просты. Бывает даже так, что фронтендер переходит в мобильную разработку, скажем, на ReactNative, или же не переходит, а просто осваивает это как дополнительный навык. Почему бы и нет?
Я думаю, что мобильная разработка имеет довольно много общего с фронтендом, потому что среди прочего вам придётся заниматься и созданием UI и его логики, только немного другими инструментами. Т.е. мои рекомендации касательно фронтенда уместны и здесь. По зарплатам кратко - вакансий много, деньги хорошие.
7) Desktop (программы под ПК и MacOS)
Довольно большая часть приложений сегодня всё ещё делается под настольные ПК или ноутбуки. Иногда это просто традиция - все привыкли к установленному пакету Офиса на компе, а часто - из соображений производительности и удобства работы. Всё таки производительность веб-приложений не всегда достаточна, и не все вещи удобно делать на маленьком экране смартфона. Примеры таких приложений - различные научные, расчётные и инженерные программы, аудио, фото и видеоредакторы и т.д. Пишутся, в принципе, на чём угодно, от С++ до, извините, опять JavaScript. Почему-то вакансий на такую работу сейчас находится мало и оплачивается такая работа не очень. Но у меня есть подозрение, что те вакансии, что попадают на сайты поиска работы - это далеко не самый топ, а какая-нибудь система учёта в бюджетной организации и т.п. Просто потому, что денег у таких организаций немного, а понимания, как и что нужно делать в плане программных продуктов - ещё меньше (это просто не их специализация). А вот всякие вкусные вещи нужно искать на сайтах самих продуктов (посмотрите-ка, например, вакансии на сайте фирмы АСКОН, занимающейся разработкой систем 3D-проектирования, или Adobe, которая делает Photoshop), при этом вам нужно будет стать одновременно крутым программистом и одновременно - специалистом в определённой области (понимать, как проектируются различные изделия инженерами или, например, понимать что-то в обработке звука). Т.е. область очень интересная и разнообразная, нужно только найти своё. Может быть придётся заниматься UI, а может быть и нет (писать алгоритмы для аудиофильтров, например). Так что эту область я бы выбирал, если, например, есть какое-то серьёзное увлечение вне программирования, и вы чувствуете в себе силы приложить руку к программным продуктам, использующимся в этой области.
8) Утилиты (webpack и подобные)
Есть такая специфическая работа - делать программы для программистов. Часто программисты пишут что-то для себя, для автоматизации чего-то, для удобства и облегчения своего труда. Я не про IDE (редакторы кода), а про различные системы сборки, компиляторы, линтеры (погуглите, что это) и т.д. Учитывая очень высокую сложность некоторых инструментов, понятно, что эта деятельность по их разработке может для кого-то стать основной. Мне кажется, автор webpack (такой сборщик проекта для фронтендеров) вряд ли теперь часто пишет сайты, разве что для того, чтобы проверить работу своего детища. Но очевидно, что раз он это придумал и сделал, значит он видел в этом потребность и понимал, что именно нужно людям. А значит он и сам изначально был одним из них. Точно также и авторы различных фреймворков и т.п. Я бы не рекомендовал рассматривать это как начало карьерного пути (да и вакансий таких, я думаю, для новичков просто не существует), но если, уже будучи опытным разработчиком в какой-то области, вы захотите и сможете сделать инструмент, который всем понравится и его начнут использовать - это может стать вашей работой. И я, мне кажется тут немного однобоко подхожу, говоря только про "любительские", опенсорсные (Open Source) инструменты. Ведь большие фирмы (Майкрософт или ещё кто) делают собственные инструменты, и я забыл про главное - языки программирования тоже ведь кто-то пишет. И тогда это действительно - полноценная вакансия и работа.
9) Автоматизация тестирования
Тестирование очень важно. Бизнес иногда экономит на тестировщиках и нанимает их с трудом и нежеланием. Они же ничего не производят, просто "тыкают" приложение и находят ошибки! Мы будем экономными и просто найдём хороших программистов, которые не будут делать ошибок. Ахахах! Может быть стоит объяснить подробнее. Ошибки появляются в приложении не потому что программисты плохие, а потому что они люди. А люди делают ошибки, многие же ошибки человек в принципе не может предсказать и увидеть заранее - какие-нибудь нетривиальные варианты использования приложения, о которых программист и подумать не мог, или утечки памяти, когда приложение "зависает" через 15 часов работы - их нужно специально отлавливать. Это достаточно сложно и поэтому стоит иметь в штате специальных людей, которые в этом разбираются и занимаются только этим.
Многие пытаются начать карьеру в ИТ именно с тестирования. Я не думаю, что это правильный путь, если речь идёт именно о промежуточной цели войти в индустрию, а потом уже стать программистом или кем-то ещё. Потому что я знаю довольно мало случаев реального перехода из тестировщиков в программисты. Это почти так же сложно, как из кого угодно другого в программисты, так что вы таким образом просто увеличиваете свой путь в 2 раза. Хотите быть программистом или менеджером - становитесь сразу программистом или менеджером, пусть с очень начальных позиций, но это будет более прямой путь. Если же тестирование вам подходит само по себе, то есть один хороший вариант развития тестировщика - автоматизация тестрования. Это полноценное программирование, но пишите вы не продукт, а тесты, с использованием специальных инструментов. Эти тесты нужны для того, чтобы при любом изменении кода продукта можно было запустить их и проверить самые разные варианты использования приложения в самых разных условиях (окружениях) и удостовериться, что ничего не сломалось. И чтобы происходило это желательно автоматически, а не много индусов (простите, индусы, я это просто ради красного словца) сидели и руками проверяли весь функционал при малейшем изменении (это, во-первых, дорого, а во-вторых - просто долго). Тестировщик-автоматизатор может заменить собой несколько "ручных" тестировщиков, а значит и зарабатывать может больше.
Один из наиболее популярных инструментов для тестирования - Selenium, но сейчас есть очень много разных других вариантов, да и языки, на которых пишутся тесты, очень разнообразны. Область сама по себе очень большая, и может быть, кстати, очень интересной (чего стоит тестирование вёрстки попиксельным сравнением скриншотов).
10) Девопс (DevOps - DEVelopment OPeration)
Человек, занимающийся DevOps (иногда его самого тоже так называют, для простоты) занимается настройкой серверов. Иногда и "железной" их частью (сами физические сервера), а в основном - программной, выстраивая автоматизированный процесс "разработки, тестирования и развёртывания". Заниматься придётся разным - устанавливать и чинить серверные модули (если у вас в фирме будут свои "железные" сервера, а не купленные облачные, ну или вы и работаете, собственно, в компании, предоставляющей другим эти самые "облачные" сервера в аренду), устанавливать необходимое ПО, настраивать, писать скрипты. Типичный процесс, который вы будете автоматизировать и поддерживать - разработчики пишут код и сохраняют его, этот код автоматически тестируется-собирается-компилируется, потом запускаются автотесты для собранного приложения, потом, в случае успешного прохождения этой цепочки, приложение выкладывается на "боевые" сервера, т.е. становится доступным конечному пользователю. Но вообще разные задачи есть. Девопс - это такой как бы "админ на стероидах". В DevOps часто переходят из администрирования или из бэкенда, область находится на стыке между этими двумя. На данный момент DevOps - очень высокооплачиваемая профессия, особенно если вы сертифицировались по каким-нибудь облачным технологиям, типа AWS или Azure.
11) VR/AR (Виртуальная и дополненная реальность)
Я выделил эту область отдельно, т.к. не знаю, куда это, собственно, поместить. Мне кажется, что эта штука имеет гигантский потенциал, который не раскрыт. И как его раскрыть - никто по настоящему пока не придумал. Что-то вроде мобильной разработки лет 15 назад - что-то не совсем серьёзное и немного игрушечное. Но, вангую, после появления достоточно удобных и доступных устройств (очки дополненной реальности) эта отрасль "взорвётся", породив огромный пласт технологий и применений. Если есть желание - можно попробовать запрыгнуть в этот поезд уже сейчас, освоив технологии, которые уже есть. Написать какую-нибудь фигню типа оживающего скелетика на пачке чипсов, и кто знает, может быть это поможет вам стать очень успешным через пару-тройку лет, когда появятся более серьёзные применения. Технологии я пока вам не предложу (ну разве что вездесущий JavaScript с библиотекой AR.js, так, просто чтобы попробовать), потому что сам только начал копать эту тему и не совсем разобрался. Когда разберусь - напишу отдельно:)
12) Геймдев (разработка игр)
Вот здесь не буду много расписывать, потому что бесполезно пробовать охватить огромный геймдев за пару абзацев. Всё, что вы прочитали выше - актуально и для этой области. Т.е. это как всё остальное вместе взятое, только про игры. Бывают игры онлайн (фронденд и бэкенд), мобильные игры (mobile и тоже бэкенд), бывают игровые устройства (embedded), бывает ИИ (искусственный интеллект) в играх (Machine Learning) и Data Analisys (исследование предпочтений пользователей), десктопные игры по прежнему актуальны (игры для приставок можно отнести сюда же). Утилиты, тестирование и девопс в игровых компаниях тоже никто не отменял. VR/AR - это, возможно, будущее игровой индустрии (то, что есть сейчас, меня, простите, не впечатляет). Мне самому эта область по какой-то причине малоинтересна, может быть потому, что я не люблю и не умею играть (эти два факта вполне могут быть связаны), но насколько я вижу, молодёжь (эх, молодёжь) часто мечтает разрабатывать именно игры. Штош, отрасль эта очень богатая и перспективная как в целом, так и для вас лично, так что если вы хотите сюда - то вперёд. Тем более игровая индустрия часто оказывается впереди всех в каких-то новых технологиях и прокладывает дорогу другим, более приближенным к реальности (простите, не удержался), применениям.
Эпилог
Да, статья всё-таки получилась длинной, хоть я и пытался сжать информацию до минимума. Я попытался объяснить, какие отрасли программирования существуют в мире, чтобы дать вам понимание, из чего в принципе вы можете выбирать. Стоит в первую очередь ориентироваться на то, что нравится именно вам, а не на то, где больше денег. Деньги вы сможете заработать в любой из перечисленных областей, благо любая работа программиста сейчас оплачивается неплохо, а вот получать удовольствие от работы - этого ничто не заменит.
Напоследок одна небольшую хитрость. После того, как вы хорошо освоите какую-то понравившуюся область - не забрасывайте её и постоянно углубляйте ваши знания в ней. Узкие и глубокие специалисты оплачиваются лучше поверхностных универсалов. Но также попробуйте выбрать что-то ещё. Т.е. имейте одну основную глубокую специализацию, а вторую как дополнительную. Это даст вам 2 преимущества. Первое - расширение кругозора и вгляд на свою область немного со стороны, что позволит лучше понимать некоторые вещи и отделять мух от котлет. Второе - уникальная комбинация разных навыков вполне может сделать вас уникальным же специалистом, за которым будут охотиться (но это не точно).
Спасибо за дочитывание длинного текста до конца, я старался. Увидимся в следующих статьях.