Специальности в IT. Программирование
Всем привет, мы в Айтишном Поиске! Цель нового цикла статей о специальностях в том, чтобы дать читателю представление, чем в целом занимаются в IT-индустрии, и что делают люди на конкретных позициях, вакансии к которым можно найти на любом рекрутинговом ресурсе.
Виды деятельности в ИТ крайне разнообразны, так что есть из чего выбрать (сопоставив их с вашими склонностями, взять то, что ближе по душе).
Список специальностей не претендует на исчерпывающую полноту; скорее, задача - покрыть 80% самых популярных, затратив на это 20% времени.
Я расскажу о тех, с кем работал за последние 17 (на дату написания статьи) лет, и о чьей работе имею четкоё представление.
Пожалуй, какие-то из перечисленных специальностей являются более важными, чем другие, но порядок моего рассказа это отражать не будет, он более-менее случаен.
Хотя, над самой систематизацией пришлось немало попотеть.
(У статьи, как и у других, есть видео-версия).
Программирование
Далеко не одни только программисты (или же разработчики ПО / Software Developers / Software Development Engineers)
Специальности “просто программист” сейчас уже не бывает, потому что областей разработки ПО стало слишком много, для каждой необходимо знание своих языков, инструментов и подходов. Как итог, объём знаний просто перестал физически влезать в одну голову.
Так что программистские специальности сгруппированы вокруг множества подразделов, которые мы сейчас и рассмотрим.
Бэкенд / Backend
Бэкенд-разработка ведется в серверной части клиент-серверной архитектуры (здесь следовало бы сразу поговорить об этой концепции, но мы заготовим её на будущее, как тему отдельной статьи).
Чаще всего речь про Web-системы, то есть работающие в Интернет-среде (а может и Интранет, то есть внутренней корпоративной сети).
Для современного бэкенда характерен упор на микросервисы - (обычно) небольшие, условно независимые программы, выполняющие свою ограниченную часть работы общего функционала системы. Предшественники микросервисов - монолиты - тоже не сдают позиции, и остаются популярным выбором.
На тему “Монолиты vs. Микросервисы” сломано много копий, и на каждом следующем витке развития IT маятник общественного одобрения качается в ту или иную сторону. Мы рассмотрим преимущества и недостатки этих подходов в отдельной статье.
Иногда особенностью бекенда является хайлоад - работа систем в условиях особенно высоких нагрузок - большом количестве сетевых взаимодействий (примерный нижний порог хайлоада оценивается в сотни/тысячи запросов в секунду, верхний порог - десятки тысяч, в пределе переваливающий за 100 тысяч обрабатываемых запросов в секунду).
Адаптация бэкенда к хайлоаду - крайне увлекательное занятие, требующее знаний из самых разных областей айти.
Специальности в бэкенде чаще всего сгруппированы вокруг языков программирования:
- Java-разработчик/программист
- Go-разработчик
- Python-разработчик, и так далее
У каждого языка есть свои инструменты разработки бэкенда - фреймворки, например Spring в Джаве или Django в Питоне. Когда вы метите на бэкенд специальность, фреймворки становятся обязательны к освоению; одного только знания языка зачастую бывает недостаточно.
Фронтенд / Frontend
Во фронтенде разработка сфокусирована на клиентских частях программ, то есть тем, с чем пользователь взаимодействует напрямую через графический интерфейс (Graphic User interface / GUI).
Сейчас, обычно, когда говорят про фронтенд, то имеют ввиду Web-фронтенд - работающий в Веб-браузере (Google Chrome, Firefox, Edge и других).
Есть еще вариант разработки фронтенда на фреймворке Electron, но там под капотом, по сути, тот же веб-браузер (Chromium, на базе которого работает Chrome). Многие современные приложения, из тех что вы ставите на свои Windows и Maки (например Discord или Twitch) - пример веб-фронтенда на Electron’е.
В современном фронтенде не обойтись без уверенного знания JavaScript, а лучше, его продолжателя - TypeScript. В будущем, мы обязательно поговорим про различия языков с динамический и статической типизацией (где яркие примеры это JavaScript и TypeScript соответственно).
Также, важно владеть HTML и CSS - это языки не программирования, но разметки, форматирования и управления стилями визуальных частей Web.
Специальности во фронтенде чаще всего сгруппированы вокруг веб-фреймворков, каждый из которых, как отдельная технология, требует предварительного и планомерного освоения.
Однако во фронтенде не стоит (да и не получится) ограничиваться погружением в один только фреймворк и библиотеки - важно получать знания из широкого спектра областей: освоить протоколы сетевого взаимодействия, основы ИТ-безопасности (хотя бы на уровне понимания инструментов, применяемых во фронтенде), принципы кроссбраузерности, кроссплатформенности, концепции Single Page Application (SPA), Progressive Web Application (PWA).
Как было упомянуто в начале, фронтенд это обычно web, но - не всегда. Разработка графического интерфейса происходит и в сфере Mobile, и, отчасти, для Desktop, но о них чуть ниже.
Фулстек / Fullstack
Фулстек - это комбинирование бэкенд и фронтенд разработки внутри одной специальности.
С одной стороны это удобное сочетание - программисты становятся более универсальными (и, кстати, взаимозаменямыми) - разработка конкретной фичи может вестись Front-To-Back - от начала до конца - тем же самым человеком, что снижает затраты на согласование работы бэкенд и фронтенд частей.
Но есть и минусы - каждому конкретному разработчику требуется более широкий профиль разнородных познаний. То есть в дилемме развития компетенций в глубину или в ширину - выбор делается в сторону последнего. Я сам проработал как Fullstack несколько лет, перед тем как предпочел сосредоточиться на бэкенд разработке - перевыбрал “глубину”.
Иногда, фулстек специальность это комбинация бэкенд и фронтенд инструментов, например: Java+Spring и Angular+Typescript (так было в моём случае).
Но есть инструменты, сочетающие в себе и бэк и фронт. Например с Node.js - можно писать на Javascript и на клиенте и на сервере, таким образом, шаря (от share - поделиться [кодом], т.е. дать возможность исполнять один и тот же код в разных модулях) часть кодовой базы.
Есть и более экзотичные варианты фулстек разработки, например с использованием Kotlin/JS - расширения бэкендового языка Kotlin (преемника Джавы), позволяющего писать на нем и для фронтенда.
Встроенные системы / Embedded
Embedded-разработка сконцентрирована вокруг встроенных систем - компьютеров, (чаще всего миниатюрных), выполняющих специфический круг задач (в отличие от систем общего назначения, типа настольных ПК). Например, это электронная начинка бытовой техники, автомобильных систем, промышленного и медицинского оборудования.
Интересными из актуальных направлений, связанных с embedded мне видятся робототехника (которая, впрочем, не ограничена одним embedded), концепция Internet of Things (IoT) и базирующиеся на ней технологии Умного Дома.
На embedded-специальностях из языков программирования обычно требуются С, C++, и в некоторых случаях Assembler под конкретную архитектуру контроллера, с которым идет работа.
Желательными являются познания в электронике и электротехнике (в первой - больше физики, во второй - упор на практику).
Хорошим подспорьем тут может стать опыт с такой платформой как Arduino (Вот, например, хорошая вводная статья), посмотрите, может вам зайдёт, даже как хобби.
ПО для embedded пишется с учётом серьёзных ограничений по объему памяти, быстродействия и механизмам отладки целевых систем. То есть железо обычно маломощное, и заменять его на более дорогостоящие комплектующие не целесообразно - получится совсем другой итоговый ценник, и, вероятно, понадобятся другие поставщики.
Это заметное отличие, от, например бекенда, где иногда можно закидать проблемы дополнительным “железом”, что стало особенно просто с переходом backend в “облачные” сервисы.
Мобайл / Mobile
Современные смартфоны совмещают в себе как embedded на уровне железа, так и разработку на уровне приложений их операционных систем, которая и выделена в специальность “мобильная разработка”.
Разработка программ на мобильных устройствах имеет больше отличий, чем сходств с бэкендом и фронтендом. Здесь, отчасти, и ограничения на производительность целевых устройств, как в embededd.
Как вы знаете, сейчас на рынке остались два лагеря: Android и iOS; остальное - уже незначительные проценты.
iOS-разработчики занимаются софтом исключительно для Apple-устройств. Для iOS понадобится знание языков Swift и Objective-C, а также знание инструментов взаимодействия с операционной системой - iOS SDK (Software Development Kit - так называется набор инструментов, библиотек и документации для разработки на конкретной платформе).
В то же время, Android-разработчики могут действовать в более широкой области, так как Android является отчасти открытой системой и не ограничен мобильниками и планшетами, а может работать, например в Smart TV и другой бытовой технике, хотя это и небольшая доля рынка.
Для Android-разработки нужно знание Kotlin, и, точно также, инструментов взаимодействия с системой - Android SDK.
Десктоп / Desktop
Десктоп-разработка сосредоточена на создании программ для привычных всем ПК, то есть настольных компьютерах или ноутбуках.
Эта сфера несколько потеряла популярность после повсеместного перехода на Web (в том числе и на Web-интерфейсы), но всегда остается востребованной.
Важные, повсеместно используемые программы, такие как веб-браузеры (для доступа к тому же Web!), программы-срéды разработки (называемые IDE - Integrated Development Environment), например, Intellij IDEA, XCode; офисные программы типа Microsoft Word, Excel, и множество другого профессионального софта - всё результаты трудов десктоп-разработчиков.
Популярным языком для десктоп разработки является C# (перенявший пальму первенста у Delphi, господствовавшего в среде Windows десктоп-приложений не одно десятилетие); на C# написано множество современных продуктов Microsoft, и различный корпоративный бизнес-софт.
Часто бывает востребован C++, например с фреймворком Qt (успешным во многом благодаря инструментарию создания графических интерфейсов Qt Designer).
Пишут и на Java, где ярким примером будет лидер рынка IDE (сред разработки) - Intellij IDEA, и, кстати, популярнейшая игра Minecraft (которая теперь называется Minecraft Java Edition, в то время как Minecraft Bedrock Edition для мобильных и консолей написан уже на C++), но игр мы коснемся чуть позже.
Кстати языки Swift и Objective-C, (на которых пишут для Apple iOS), используются и для macOS - операционной системы для настольных Mac, а значит, попадают в область десктоп разработки.
Системное программирование / System
Еще одна сфера, доля которой в разработке сокращается (не в абсолютном выражении, а за счет роста доли других сфер), но являющаяся критически важной и которая никогда не исчезнет - это системное программирование. В чём-то оно перекликается с embedded, и некоторые упрощенные классификации объединяют системную и embedded разработки в одну область.
Системное программирование - о создании низкоуровневых компонентов. “Низкоуровневый” - значит не “низкого качества”, а лежащий ближе к физическому устройству компьютера, чем к прикладным программам. Это, например, операционные системы и их составляющие части, такие как драйверы, утилиты.
К другим примерам работы системного программиста можно отнести компиляторы и интерпретаторы языков программирования.
Синтезом системной и embedded разработки являются firmware - прошивки устройств, например сетевого оборудования типа роутеров.
В каком-то смысле, системная разработка это Rocket Science от IT, сфера сложная и требующая глубокого знания компьютерной архитектуры, информатики и устройства операционных систем.
Но никогда не стоит пасовать перед сложностью, если вам интересно заниматься столь фундаментальными вещами. Конечно, в System приходят не сразу, а по прошествии времени и накоплению опыта в смежных областях разработки.
Применяемые языки, как и в embedded - С/С++ и вариации ассемблера.
Геймдев / Gamedev
Думаю, многие (как и я), впервые проявили интерес к айти после знакомства с компьютерными играми в детстве. Интересно было не только играть, но и разобраться самому - как создавать подобное? Это естественное стремление любознательного человека.
Геймдев - это индустрия разработки видеоигр. Хотя можно было бы относиться к ней, просто как к одной из категорий, перечисленных ранее, но я выделил ее. Почему?
Хотя бы потому, что gamedev-вакансии обычно постятся на обособленных площадках, да и во всей индустрии - “своя атмосфера”. Наверное, из-за того, насколько люди горят здесь своей работой (горят, и, увы, сгорают - тенденции к авральным переработкам в gamedev широко известны - там это называют “кранчи”).
Эта одна из немногих областей, где вам реально пригодится знание математики, особенно при работе с 2D/3D-графикой.
Здесь ценится знание специфических инструментов, например игровых движков, таких как Unity или Unreal Engine.
Помимо общепринятых C++ или C#, многое пишется и на своих внутренних скриптовых языках, или на малораспространённом за пределами геймдева языкe Lua (к примеру, это основной язык платформы Roblox).
Геймдев - это не только программирование, но еще и анимация, арт, игровой дизайн. Тема, на самом деле, огромная, и крайне меня интересующая; я даже подумывал завести для нее отдельный канал, но, пока, боюсь разорваться между разными направлениями.
На этом мы заканчиваем с чисто разработчискими/программистскими специальностями.
Однако, это была только вершина айсберга, в следующей статье рассмотрим работу в других аспектах жизненного цикла ПО.
Если вам нравится в Айтишном Поиске - подписывайтесь на наш Ютуб и Телеграмм каналы:
До встречи в следующем выпуске!