Часть серии 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) и основать свою собственную компанию.

Примечание. Более крупные компании, как правило, имеют больше уровней / различий.

Здесь множество вариантов, независимо от того, чем вы хотите заниматься. Есть место для роста как по вертикали, так и по горизонтали. Это занятие мечты для тех из нас, кому посчастливилось его полюбить.

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

Самая важная часть - поговорить с вашим менеджером о ваших целях, чтобы они могли помочь вам в их достижении.

В качестве примеров ознакомьтесь со следующими ресурсами:

Коучинг

Естественно, лучший способ получить опыт и научиться - работать над реальными проектами с другими старшими инженерами.

Однако, помимо повседневной работы, также может быть полезно получить коучинг по множеству разных вещей, от программирования до лидерства и других нематериальных активов.

Образовательные ресурсы

Обучение и общее образование

Вернитесь к разделу Требуемые знания выше, чтобы получить общий обзор тем, которые вам следует знать как разработчику программного обеспечения.

Я написал отдельную статью с подробным описанием различных бесплатных и платных ресурсов для обучения:



Кроме того, я создал подробный план обучения (в настоящее время только интерфейс и бэкэнд). В настоящее время я работаю над подробными сопутствующими статьями со ссылками на ресурсы.



Технические конференции

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

Есть конференции, посвященные конкретным инструментам, языкам и областям, например, DockerCon (для Docker), KubeCon (для K8s), PyCon (Python), Devnexus, JSConf, GopherCon и т. Д.

Есть также крупные многопрофильные конференции, которые организуются или спонсируются технологическими гигантами. Эти конференции будут охватывать широкий спектр знаний и инструментов, и, как правило, собирают тысячи участников и докладчиков. Примеры включают Microsoft Ignite, AWS re: Invent, Google I / O, Mobile World Congress (мобильные устройства), E3 (видеоигры) и многие другие.

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

Более полный список технических конференций можно найти на:

Ресурсы для интервью

Недавно я написал еще одну статью о ресурсах для собеседований для инженеров-программистов:



Эти ресурсы находятся в верхней части известных веб-сайтов и ресурсов для отработки задач программирования:

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



Отзывы и мнения

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

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

Мне больше всего нравится быть [инженером-программистом] тем, что мы здесь, чтобы решать проблемы ... это применимо ко всем отраслям промышленности. В какой бы области вы ни работали, разработка программного обеспечения может вам помочь.

Больше всего меня беспокоит то, что я не вижу достаточного разнообразия.

- Притхви К, SDE II @ Microsoft

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

Что мне не нравится, так это то, что отрасль может быть токсичной. Люди превозносят тяжелые интервью и долгие часы.

- Э (просил оставаться анонимным)

Занимаюсь им с 70-х годов. Все еще прекрасно проводишь время…

В этой работе есть еще много чего, чем просто печатать на клавиатуре. Как и вы, решение проблем - вот что меня движет.

- reddilada на Reddit

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

- theholybellows на Reddit

Кроме того, я написал несколько других статей по различным вопросам. В этом разделе описаны некоторые преимущества и преимущества работы с программным обеспечением:



В качестве альтернативы в этой статье рассматриваются несколько недостатков программного обеспечения:



Вывод

Я что-то упустил? Буду признателен за ваш отзыв!

Хотите, чтобы вас цитировали? Расскажите мне, что вы любите и ненавидите в разработке программного обеспечения, и есть шанс, что я добавлю это в эту историю!

Заинтересованы в изучении программного обеспечения? Ознакомьтесь с первым курсом Static Void Academy для начинающих!