Часть серии All Tech Positions
Эта история - одна из серии статей, посвященных различным техническим позициям в отрасли. Чтобы просмотреть каталог / содержание, перейдите по этой ссылке.
Что такое инженер-программист?
Инженер-программист - это человек, чья работа заключается в общем проектировании, внедрении и сопровождении программ или кода.
В зависимости от компании они могут в конечном итоге нести ответственность за больше, но для компаний любого размера программирование является общей ответственностью.
У людей, которые освоили фундаментальную разработку программного обеспечения, есть много вариантов карьеры:
- Они могут продолжать заниматься разработкой программного обеспечения и подниматься по служебной лестнице.
- У них есть выбор в разных отраслях - практически все требует программного обеспечения. Вам нравится музыка? Вы могли бы спроектировать DAW, VST и т. Д. Вам нравится железо и электроника? Вам могут понравиться IoT и встроенный.
- Они могут переключиться на связанные задания или дисциплины, которые тесно работают с кодом, но не несут прямой ответственности за его разработку (например, SRE, безопасность и т. Д.).
- Они могут выбрать руководящие или управленческие должности, если у них есть необходимые навыки межличностного общения.
Требуемые знания и навыки
- Основы программирования - от среднего до продвинутого в одном или нескольких языках, а также основы, общие для большинства языков (например, управление потоком, примитивные / сложные типы, компиляция / выполнение, управление зависимостями).
- Парадигмы программирования. Большинство из них начинают с последовательного, императивного обучения ООП. Но знание остальных парадигм, а также сильных и слабых сторон каждой из них чрезвычайно важно и часто требуется.
- Алгоритмы и структуры данных. По своей сути, SE должны знать, как разбивать сложные проблемы и решать их оптимальным образом. Знание того, когда использовать то, что является решающим навыком. Кроме того, в зависимости от должности, на которой вы хотите работать, полезно хорошее знание математики.
- Основы баз данных. Базы данных являются основой всего хранилища данных. Как правило, люди изучают как минимум реляционную базу данных (например, MySQL, Postgres) и базу данных NoSQL (например, Mongo). Вы изучаете более конкретные знания для конкретной работы.
- Базовая сеть. Приложения должны так или иначе обмениваться данными, поэтому инженеры-программисты должны быть знакомы с основами работы в сети (TCP / IP, HTTP (S), REST, сокеты, маршрутизация, прокси, балансировка нагрузки, и т.д.).
- Базовая безопасность. Хотя безопасность - это отдельная (и обширная) область, инженеры-программисты должны понимать элементарную безопасность для разработки, которая включает в себя различные темы, такие как шифрование, санация ввода, аутентификация, авторизация, шифрование, хеширование, высокая доступность. , отслеживание и ведение журнала и т. д.
- Базовые сценарии и терминал. Знание командной строки / терминала имеет решающее значение для системного администрирования и развертывания приложений. Сценарии также полезны для автоматизации задач.
- Основы операционных систем. Понимание того, как программное обеспечение работает на компьютерах, позволяет писать более качественный код, следовать передовым методам и выполнять отладку, особенно на языках более низкого уровня, таких как C, C ++ и т. д.
- Разработка веб-приложений. Инженеры-программисты обычно хотят знать хотя бы одну структуру веб-приложений для своего лучшего языка. Например, Node.js для JavaScript (или новый интересный Deno), Spring Boot для Java, Django для Python и т. Д.
- Основы тестирования. В идеале вы должны знать платформу для конкретного языка, а также общую платформу тестирования API. Я говорю «в идеале», потому что некоторые стартапы развиваются слишком быстро, чтобы оправдать усилия по написанию огромных наборов регрессионных программ.
Знания и навыки разработчиков программного обеспечения различаются по широкому спектру.
Некоторые отрасли промышленности разрабатывают базовые веб-приложения или веб-сайты, и для них может не потребоваться степень в области компьютерных наук или знание алгоритмов.
Другие части отрасли работают над передовыми технологиями, такими как машинное обучение, блокчейн, аналитика данных и т. Д. В этих областях требуется глубокое знание системной инженерии, алгоритмов, структур данных и других сложных тем.
Именно этот набор знаний и опыта отделяет «инженеров» программного обеспечения от «программистов».
И, естественно, есть все промежуточное. Чем выше ваши знания, тем больше возможностей вы откроете для себя.
Категории / концентрации
Из-за огромного количества языков, инструментов и вариантов использования существуют различные категории разработчиков программного обеспечения, которые сосредотачиваются на разных вещах. Некоторые из этих различий совпадают с различиями в их отраслях.
Как правило, инженеры-программисты изучают базовые знания, перечисленные выше, а затем дополнительно узнают более подробную информацию о данной концентрации:
- Front-End, UI - специализируемся на разработке клиентских приложений. Подумайте о веб-сайтах, веб-приложениях и обычно графических пользовательских интерфейсах. Множество HTML, CSS, JavaScript или TypeScript, фреймворков или библиотек, манипуляции с DOM, веб-безопасность ... Они также идеально знают принципы дизайна и, по крайней мере, знакомы с основами взаимодействия с пользователем (UX). Front-end dev - это отличное место для концентрации, если вам нравится веб-дизайн, UX-дизайн и обратная связь в реальном времени.
- Серверная часть или системы - специализируется на разработке частей приложений (часто называемых службами), которые обрабатывают логику, взаимодействуют с базами данных, выполняют аутентификацию и т. д. Эти службы выполняют тяжелую работу и обработку для Приложения. Обычно внутренние разработчики увлекаются алгоритмами и основами CS, а также базами данных, кэшированием, аутентификацией, брокерингом сообщений и различными другими темами. Вы можете использовать любой язык или фреймворк для внутренней разработки, поэтому существует огромное разнообразие даже в области серверной части или системной инженерии.
- Full-Stack - специализируйтесь как на интерфейсе, так и на сервере. Небольшие компании с меньшим количеством инженеров с большей вероятностью потребуют владения полным стеком. Эта позиция становится все более и более невыполнимой из-за огромного количества инструментов, языков и технологий, которые необходимо изучить. См. Это сообщение в блоге Энди Шора, чтобы узнать больше.
- Встроенное. Специализируйтесь на программном обеспечении, используемом во встроенных устройствах. Подумайте о микропроцессорах, интеллектуальных устройствах и устройствах Интернета вещей. Здесь есть различие, потому что встраиваемая разработка обычно включает в себя языки нижнего уровня, взаимодействующие с операционной системой, сетью + сокеты, драйверы, память, микропрограммное обеспечение, оборудование, что требует некоторых других парадигм программирования, языков и практик.
- Блокчейн - блокчейн - это отдельная область, инженеры-программисты которой специализируются на разработке и оптимизации протоколов блокчейн, смарт-контрактов и веб-приложений, использующих блокчейн. Это поле также включает криптовалюты, ядро которых составляет блокчейн.
- Сети - специализируемся на автоматизации настройки сети и связи. Существует несколько сертификатов по сетевым технологиям (многие из которых поддерживаются Cisco и CompTIA), и для их изучения требуются месяцы или годы. Пересечение сетевой инженерии и разработки программного обеспечения представляет собой Программно-определяемые сети, которые включают инициативы по автоматизации конфигурации сети и коммуникации во всем мире.
- ML & AI - специализируется на математике, статистике, науке о данных и глубоком обучении, кульминацией которых являются такие проекты, как беспилотные автомобили, электронные помощники и другое интеллектуальное программное обеспечение. Искусственный интеллект, вероятно, однажды станет править миром.
- Игра - специализируйтесь на различных темах, необходимых для создания игр, включая теорию игр, кусочки машинного обучения и искусственного интеллекта (для поведения NPC и врагов), сети (многопользовательские игры) и даже графику. программирование в некоторых случаях. Тем не менее, разработчики игр широко распространены и включают в себя также разработку мобильных приложений для мобильных игр, веб-разработку веб-игр и т. Д.
- Графика - специализируется на продвинутой математике, линейной алгебре, сжатии и других вычислениях, связанных с управлением и производством графики, включая, среди прочего, трассировку лучей. Разработчики игр не обязательно являются разработчиками графики, и наоборот. Например, разработчик игр может использовать Unreal Engine для создания видеоигр. Но инженер-график будет разрабатывать сам Unreal Engine, писать алгоритмы для обработки графики и других механизмов.
- Облако - Облачные разработчики сосредотачиваются на приложениях для конкретных облачных провайдеров. Например, вы можете специализироваться на написании кода и разработке приложений / решений, специально адаптированных для AWS, GCP, Azure и т. Д. Обратите внимание, что инженеры облачного программного обеспечения отличаются от инженеров платформ / инфраструктуры, чьи обязанности лежат в большей степени. вокруг настройки, проектирования, подготовки и т. д. облака.
- Mobile - специализируется на создании приложений для телефонов, особенно для Android и iOS (Windows и другие операционные системы для телефонов занимают крошечные доли рынка). В последнее время наблюдается рост кроссплатформенных фреймворков / библиотек мобильных приложений (React Native, Flutter, Xamarin и т. Д.).
- … и многое другое. В программной инженерии есть множество других «концентраций». С радостью добавлю их, если вы думаете, что я что-то пропустил, и отвечу на эту историю.
Потенциально переключение концентрации может быть полезным и забавным. Однако некоторые из них (например, машинное обучение) часто требуют много времени и изучения из-за сложности содержания.
Переключение между дисциплинами в программной инженерии мало чем отличается от переключения между сферами деятельности в области медицины - анестезиолог не может стать хирургом в одночасье и наоборот.
Точно так же большинство из нас, вероятно, не сможет освоить ИИ всего за месяц, даже будучи старшим инженером.
Оплата труда
Эти средние значения включают все уровни стажа, а также все отрасли. Заработная плата начального уровня может быть на несколько тысяч ниже, а на руководящих должностях может быть намного, намного выше.
Заработная плата будет зависеть от многих факторов, поэтому не принимайте следующие пункты как закон. Но в целом:
- Более высокие должности зарабатывают больше денег.
- Стартапы, как правило, платят меньше доходов и льгот, но предоставляют больше акций или опционов на акции.
- Конкретные отрасли и подкатегории платят больше (например, инженеры ML / AI зарабатывают больше, чем разработчики пользовательского интерфейса или веб-разработчики)
- Работа в городах и штатах с более высокой стоимостью жизни будет платить больше (например, зарплаты в Калифорнии, как правило, выше, чем в Кентукки)
Естественно, эти цифры относятся к большинству наемных работников отрасли. Если вы старший научный сотрудник, который помогал создавать компанию с нуля, ваша зарплата может составлять от нескольких сотен тысяч до миллионов (!!!).
Карьерный рост
Лестница
В разных компаниях есть разные вариации, но обычно есть лестница навыков / стажа в разработке программного обеспечения.
Инженеры начального уровня присоединятся как «младшие». или инженеры-программисты «Уровня 1». От младших инженеров требуется применять свои фундаментальные знания при написании кода и исправлении ошибок.
От инженеров среднего и старшего звена требуется, чтобы они выполняли более важные роли, связанные с принятием решений, архитектурой, дизайном и руководством.
Из-за разнообразия ролей разносторонние инженеры-программисты часто могут продвигать или переходить на другие должности, такие как лидерство, менеджмент и связанные с ними дисциплины в программном обеспечении.
Однако, если вы предпочитаете просто продолжать взламывать что-то, вы можете пройти свой путь от уровня «Старший» до «Персонал», «Старший персонал», «Директор», «Выдающийся» и даже «Товарищи».
Может быть, вы могли бы стать главным хакером (CTO) и основать свою собственную компанию.
Примечание. Более крупные компании, как правило, имеют больше уровней / различий.
Здесь множество вариантов, независимо от того, чем вы хотите заниматься. Есть место для роста как по вертикали, так и по горизонтали. Это занятие мечты для тех из нас, кому посчастливилось его полюбить.
Что касается продвижения по службе, у большинства компаний будут уникальные графики продвижения и рубрики. Эти критерии позволяют оценить вашу компетенцию, чтобы определить ваш стаж и навыки.
Самая важная часть - поговорить с вашим менеджером о ваших целях, чтобы они могли помочь вам в их достижении.
В качестве примеров ознакомьтесь со следующими ресурсами:
- Матрица компетенций в области разработки программного обеспечения [Сиджин Джозеф]
- Матрица инженерных компетенций [CircleCI]
- Матрица карьерных рамок [GitLab]
- Список ссылок по инженерным лестницам [Бенджамин Рейтцаммер]
Коучинг
Естественно, лучший способ получить опыт и научиться - работать над реальными проектами с другими старшими инженерами.
Однако, помимо повседневной работы, также может быть полезно получить коучинг по множеству разных вещей, от программирования до лидерства и других нематериальных активов.
- Коучинг лидерства Марлоу
- MentorCruise
- Codementor
- CodePath
- ЗАПАД (Женщины, входящие и оставшиеся в сфере технологий)
Образовательные ресурсы
Обучение и общее образование
Вернитесь к разделу Требуемые знания выше, чтобы получить общий обзор тем, которые вам следует знать как разработчику программного обеспечения.
Я написал отдельную статью с подробным описанием различных бесплатных и платных ресурсов для обучения:
Кроме того, я создал подробный план обучения (в настоящее время только интерфейс и бэкэнд). В настоящее время я работаю над подробными сопутствующими статьями со ссылками на ресурсы.
Технические конференции
Как инженер-программист, у вас есть практически неограниченный выбор на технических конференциях по всему миру.
Есть конференции, посвященные конкретным инструментам, языкам и областям, например, DockerCon (для Docker), KubeCon (для K8s), PyCon (Python), Devnexus, JSConf, GopherCon и т. Д.
Есть также крупные многопрофильные конференции, которые организуются или спонсируются технологическими гигантами. Эти конференции будут охватывать широкий спектр знаний и инструментов, и, как правило, собирают тысячи участников и докладчиков. Примеры включают Microsoft Ignite, AWS re: Invent, Google I / O, Mobile World Congress (мобильные устройства), E3 (видеоигры) и многие другие.
Поездки на эти конференции и участие в семинарах, мероприятиях для выступающих и сетевых мероприятиях чрезвычайно полезны для саморазвития и продолжения обучения.
Более полный список технических конференций можно найти на:
- Технические конференции (Qlearly)
- Все технические конференции
- TechCon.io (медленно собирая все вместе. Помогите мне!)
Ресурсы для интервью
Недавно я написал еще одну статью о ресурсах для собеседований для инженеров-программистов:
Эти ресурсы находятся в верхней части известных веб-сайтов и ресурсов для отработки задач программирования:
Еще одна инновационная компания - TripleByte - вы можете пройти онлайн-тестирование и автоматическое собеседование, а отличная производительность гарантирует собеседование на месте с ведущими технологическими компаниями.
Отзывы и мнения
У меня есть собственное мнение, которое я обязательно включу. Но я также включил избранные цитаты и мысли других, настоящих инженеров отрасли.
Отказ от ответственности: все мнения принадлежат цитируемым людям и не отражают взгляды их работодателей.
Мне больше всего нравится быть [инженером-программистом] тем, что мы здесь, чтобы решать проблемы ... это применимо ко всем отраслям промышленности. В какой бы области вы ни работали, разработка программного обеспечения может вам помочь.
Больше всего меня беспокоит то, что я не вижу достаточного разнообразия.
- Притхви К, SDE II @ Microsoft
Думаю, мне нравится тихое пространство, чтобы решать головоломки с помощью языка и делать это как можно проще.
Что мне не нравится, так это то, что отрасль может быть токсичной. Люди превозносят тяжелые интервью и долгие часы.
- Э (просил оставаться анонимным)
Занимаюсь им с 70-х годов. Все еще прекрасно проводишь время…
В этой работе есть еще много чего, чем просто печатать на клавиатуре. Как и вы, решение проблем - вот что меня движет.
- reddilada на Reddit
Мой отец был программистом много лет, и сколько я себя помню, у него, как всегда, был плохой баланс между работой и личной жизнью, то есть он работал по 12 часов в день, работал в выходные / праздничные дни, недавно работал в отпуске по болезни. Это сильно повлияло на мои отношения с ним и в целом в семье.
- theholybellows на Reddit
Кроме того, я написал несколько других статей по различным вопросам. В этом разделе описаны некоторые преимущества и преимущества работы с программным обеспечением:
В качестве альтернативы в этой статье рассматриваются несколько недостатков программного обеспечения:
Вывод
Я что-то упустил? Буду признателен за ваш отзыв!
Хотите, чтобы вас цитировали? Расскажите мне, что вы любите и ненавидите в разработке программного обеспечения, и есть шанс, что я добавлю это в эту историю!
Заинтересованы в изучении программного обеспечения? Ознакомьтесь с первым курсом Static Void Academy для начинающих!