Написать пост

Какие навыки программиста никогда не устареют и будут всегда востребованы — отвечают эксперты

Аватар Никита Прияцелюк

Навыки и умения, которые наверняка пригодятся любому программисту и ещё долго будут востребованы у большинства работодателей

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

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

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

Среди технических навыков, на мой взгляд, наиболее важно не знание конкретных инструментов и фреймворков (освоить нужный при необходимости можно довольно быстро), а развитое концептуальное мышление. Для этого необходимо изучать самые разные подходы к разработке. Например, освоить не только JavaScript, но и Haskell, а может быть даже Erlang или Prolog. Прочитать не только про SOLID, но и про Domain-driven design и Event sourcing. Уверенное владение различными концепциями позволит создавать эффективные, масштабируемые и поддерживаемые решения.

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

В первую очередь это качество и чистота кода. Автор книги «Совершенный код» Стив Макконнелл говорил: «Пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте». Во-вторых, это философия упрощения. Программирование — это бесконечный поиск решений для устранения проблем. Желание упростить что-либо всегда будет вам на руку. Зачем изобретать велосипед, если можно воспользоваться библиотекой? Зачем изображать «мыслителя» Родена, если можно сделать декомпозицию задач?

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

Софт-скиллы — the must! Время, когда можно было в одиночку разработать «космолёт», давно прошло. Если вы хотите трудиться над большим и интересным проектом, вам придётся работать в команде. Все известные нам методологии разработки программного обеспечения нацелены на отладку эффективного взаимодействия внутри команды проекта. Умение слушать и слышать, конструктивно доносить свою точку зрения, помогать другим и уметь просить помощи, делиться опытом, идеями, умение договариваться — одни из самых важных навыков для любого программиста. Также не стоит забывать, что для того, чтобы попасть на работу мечты, вам необходимо будет пройти этап общения с рекрутером. HR не сможет познакомить вас с нанимающим, если с вами тяжело выстроить коммуникацию, даже когда ваш код блестящ.

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

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

Очень важно не изобретать «велосипеды» там, где это не нужно. Многие начинают писать свои БД, веб-серверы, блокчейн и т. д., не проанализировав, что из уже готового можно использовать.

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

Наконец, для поддержания навыков «в тонусе» необходимо не зацикливаться на одной области, а постоянно расширять свой кругозор (учить новые языки, работать с разными СУБД и т. д.). Но при этом важно соблюдать баланс: не стоит распылять силы, постоянно переключаюсь с одного на другое. Лучше методично «прокачивать» то направление, в котором вы являетесь профессионалом, чтобы знания из новых областей подкрепляли общий вектор.

Из-за быстрого развития технологий все технические навыки (hard skills) рано или поздно устаревают: за 2–3 года стек меняется на 50%, за 5 лет — почти полностью. А вот умение взаимодействовать в команде, анализировать информацию и другие soft skills остаются востребованными всегда. Я бы выделил следующие навыки, которые нужно развивать программисту на протяжении всего профессионального пути:

Умение анализировать задачи и разбираться в предметной области

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

Умение находить информацию, когда её недостаточно, договариваться с контрагентами

Протоколы взаимодействия инфосистем зачастую неполны или противоречивы, но доработать их бывает невозможно (например, при работе с госорганами), и тогда приходится искать обходные решения. Однажды разработчики нашей торговой сети столкнулись с проблемой передачи данных по алкогольной продукции в Единую государственную автоматизированную информационную систему, ЕГАИС. В протоколе был определён набор данных для регистрации продажи товара, но возвраты и обмены предусмотрены не были. Можно было либо изменить бизнес-процессы магазинов под протокол (на что бизнес, конечно же, никогда бы не пошёл), либо придумать, как обойти ограничения протокола. Решили проблему следующим образом: убедили разработчиков ЕГАИС анализировать знак минус в поле «Цена» — если там отрицательное значение, то это возврат товара.

Умение выбирать адекватные ресурсам и срокам решения

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

Стрессоустойчивость

Работа программиста связана с постоянным стрессом (приближение дедлайна, внезапно открывшиеся дефекты в продуктивной системе и пр.), но при этом она же творческая и требующая сосредоточения, поэтому крайне важно научиться правильно относиться к своей работе. Нужно принять тот факт, что ты не можешь быть всегда прав, перестать считать клиента и коллег своими противниками и научиться к ним прислушиваться. Это принесёт комфорт и спокойствие, которые дадут возможность продуктивно работать.

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

Индустрия разработки ПО развивается феноменальными темпами, и требования к продуктам непрерывно растут. Для разработки продукта уже недостаточно программиста-многостаночника, занимающегося всем в одиночку. За любым проектом, будь то open-source веб-сервер или коммерческая CRM, стоит команда специалистов, за каждым из которых закреплена своя зона компетенций.

Само собой, каждый технический специалист должен обладать научно-технической базой для понимания работы всей системы в целом. В эти навыки входит как понимание работы ОС, сетевого стека, принципы работы баз данных, так и математический аппарат, лежащий в основе любого алгоритма или протокола. Однако сами по себе эти навыки не смогут быть полезны, если они не будут интегрированы в общий процесс разработки. Таким образом, всё более и более очевидной становится потребность в развитии soft skills. Умение вместе добиваться поставленной задачи — это то, что технические специалисты часто упускают. Бывает, что и вопросам коммуникации не уделяют должного внимания. Улучшение коммуникативных навыков происходит не только за счёт изучения материалов на эту тему, но и требует ежедневной практики и изменения своих уже привычных паттернов поведения.

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

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

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

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

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

В полезные навыки я добавлю:

  • постоянное обновление знаний по технологическому стеку;
  • расширение знаний о смежных направлениях (например, если ты бэкенд, сделай pet-проект на фронтед и наоборот);
  • умение быстро находить информацию;
  • общение с единомышленниками (митапы, хакатоны, open-source проекты, конференции и т. д.).
  • работа в команде и шаринг знаний, например парное программирование и code-review. Именно умение делать code-review, а не только валидация code-style или того хуже написание необоснованных комментариев и холивары. Во-первых, от этого зависит не только набор компетенций в команде, но и прокачка своих компетенций. Во-вторых, формирует культуру разработки;
  • математический аппарат — достаточно универсальные знания не только для программиста, но и для инженера вообще;
  • не только написание кода но и:организация сборки в том числе автоматической (системы автосборки, такие как CMake, контейнерная виртуализация Docker, сборка пакетов для последующей поставки), несмотря на то что появилась такая специальность, как devops;документирование кода с самых ранних этапов (HLD, LLD) и в дальнейшем (например, Doxygen);Unit tests — повышение качества кода;
  • понимание принципов работы ЭВМ, операционных систем и сетевого взаимодействия. Данные навыки очень ценны отдельно от языков программирования, например математический аппарат;
  • системное мышление, которое подразумевает не только мышление вширь и вглубь, но и обобщение (композиция) и детализацию (декомпозиция). Такой подход помогает спроектировать архитектуру ПО, а также в значительной мере способствует прогнозированию и планированию;
  • системы хранения данных (SQL, NoSQL);
  • умение вникнуть в первоначальную задачу, решаемую программой, и быстро получить базовые знания в этой области. Часто бывает, что разработчики делают выбор в пользу какого-то решения исходя исключительно из того, как это удобнее и/или «красивее» реализовать;
  • умение и желание читать документацию. Привычка делать «наугад» и потом чинить, если не заработало, стоит дорого;
  • использовать подходящие инструменты, а не привычные. Это касается любого инженера.

Как развивать?

  1. Транслировать культуру новичкам, поясняя, как работает команда программеров.
  2. Наставничество — каждого новичка, каким бы продвинутым он ни был, поначалу должен вести опытный член команды, помогая влиться, адаптироваться.
  3. Шаринг полезных ссылок, новинок и т. д.

Скорость, с которой меняются технологии, постоянно растёт. Поэтому говоря о навыках программиста, которые никогда не устареют, имеет смысл сфокусироваться на soft skills, развитие которых позволит программисту стать хорошим программистом, а хорошему программисту — отличным программистом:

Навыки коммуникаций. Есть выраженная корреляция между навыками разработки и способностями к коммуникации. Отличный программист способен чётко понять проблему, разбить её на гипотезы и предложить решение. Отличные программисты быстро осознают концепции или задают правильные вопросы для их осознания и не требуют, чтобы всё было описано в деталях внутри спецификации. Отличные программисты, занимающиеся оффшорной разработкой, часто владеют несколькими иностранными языками и без проблем работают с документацией на английском языке. Английский язык является де-факто общепринятым для документации и при взаимодействии внутри международных команд разработки.

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

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

Сочетание технической эрудиции и глубины знаний. Отличные программисты имеют достаточно продолжительный практический опыт с некоторыми технологиями, чтобы стать в них экспертами. Но при этом они компетентны и во многих других областях. За счёт комбинации когнитивных способностей и технической эрудиции отличные программисты способны быстрее находить решение задачи. Отличный программист хорошо знаком с распространёнными лучшими практиками и методологиями (такими, как agile), средствами управления задачами (Jira, Trello и т. д.), средствами контроля версий (Git и т. п.), а также имеет опыт работы с различными окружениями. Учитывая растущее проникновение DevOps, отличный программист должен понимать особенности эксплуатации информационных систем, в том числе в мультиоблачном окружении, соблюдать баланс между производительностью и эксплуатируемостью системы и извлекать максимум возможного из k8s и IaC.

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

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

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

Сегодня IT-индустрия стремительно развивается. Следить за обновлениями, новинками и событиями становится все сложнее. Это задаёт новые требования к разработчикам. Если раньше было важно знать как можно больше инструментов и иметь большой опыт работы с ними, то сегодня ключевым навыком является скорость. Скорость поиска подходящего решения, скорость изучения новой библиотеки, скорость решения поставленной бизнес-задачи. Во многих проектах чистый код и использование паттернов становятся минусом. Часто время жизни кода слишком мало, и его проще переписать с нуля на новой технологии, чем поддерживать что-то старое. Переход к микросервисам, конкурентная среда бизнеса и количество новых решений, появляющихся каждый день — всё это привело к тому, что скорость стала важнее качества. Иногда полезнее выкатить код с багами, чем упустить время, работая над созданием выверенного рабочего решения. Действует принцип: кто первый выпустил продукт, тот первый «застолбил» рыночную нишу. Стоит учесть, что так происходит не на всех проектах. Например, для заказчиков из банковской сферы важно высокое качество предлагаемых решений уже в первой версии продукта. В этих случаях баги могут быть слишком дороги, а спешка выйдет боком.

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

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

На мой взгляд, кроме действительно глубоких технических знаний, для IT-специалистов всё более актуальными и всегда востребованными становятся коммуникативные навыки. Работает ли программист один, в команде или руководит собственным стартапом, ему приходится взаимодействовать с другими людьми: коллегами, пользователями, клиентами. И часто успех проекта зависит от чётких и грамотно выстроенных коммуникаций между сторонами.

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

  1. Программисту необходимо знать алгоритмы и структуры данных — в этом состоит отличие настоящего программиста от кодера, способного писать программу только по чужому плану.
  2. Нужно знать не только свой язык программирования, но также интересоваться другими языками. Например, для программиста Python полезно знать хотя бы примерно, как устроен C/C++.
  3. Необходимо знать принципы работы баз данных и быть знакомым с двумя-тремя СУБД. И, конечно, нужно хотя бы на среднем уровне уметь писать запросы SQL. Отдельный ценный навык, который может пригодиться при обработке больших данных, — умение работать с NoSQL базами данных.
  4. В отдельный пункт можно выделить soft skills и способность работать в команде — без этого невозможно наладить рабочий процесс.
  5. Способность гибко планировать свою работу — в том числе в рамках Agile, Scrum и других методологий. При этом нужно не жалеть времени на планирование, иначе возникнет хаос в работе, а это означает, что и задачи не будут выполнены, и время будет потрачено. Для ведения задач нужно освоить Asana, YouTrack, Trello, Favro или любой подобный трекер командных задач. Неважно, насколько сложен трекер, главное — дисциплина. Гибкость в планировании также нужна — любой план можно корректировать в процессе выполнения.

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

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

В частности:

  • Знание не одного, а нескольких языков программирования. Но как минимум в одном из них нужно быть гуру и экспертом. Это позволяет мозгу не зацикливаться на одном и искать решение задачи во многих плоскостях.
  • Умение правильно писать комментарии (в нужных местах и в нужное время), чтобы дать возможность «падаванам» впоследствии «боготворить» тебя и вникать в твою логику.
  • Видеть не только свою задачу, но и знать, что делает весть продукт в целом. Системное мышление — это умение, которое делает из Junior → Senior.
  • Владение навыками тестирования и использование его при работе. Это поможет уменьшить количество ошибок впоследствии и даст вам «плюсы» в карму.
  • Умение обращаться за советом к «старшим» товарищам. Так вы не потратите время на построение «своего велосипеда» при имеющихся работающих решениях.
  • Абсолютно точно необходимо знание английского языка как общего языка в сфере IT. Это не запрещает знать и другие языки, но английский язык — в первую очередь.
  • Уметь видеть рутину в работе и автоматизировать ее. Положительный эффект — уменьшение времени, тратящегося впустую, ведь его можно потратить на другие важные задачи.
  • Навык оптимизации кода (алгоритма), избегание повторения рутинных операций.
  • Умение концентрироваться на поставленной задаче и решить её несмотря ни на что.

Все вышеперечисленные знания можно получить как из Интернета, так и из IT-форумов, вебинаров, конференций. Сейчас это не трудно ввиду доступности сети почти на всей территории мира. За эксклюзивные знания (такие как сертификаты Citrix, Microsoft и т. д.), конечно, приходится платить, но в этом может помочь заинтересованный в вас работодатель.

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

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

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

Умение читать чужой код

Сложно? Да. Важно? Очень. Чужой код может быть написан плохо, неряшливо, однако его всё равно нужно понимать. В наши дни редко создается что-то с нуля, акцент ставится на дальнейшей проработке уже имеющегося «бэкграунда». Когда у книги остался только эпилог, нет нужды начинать писать новую.

Навык отладки

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

Умение работать в команде

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

Искусство планирования

Меньше строчек — больше пользы. Получив задачу, разработчик не должен в омут с головой бросаться в написание кода. Ему нужно выяснить как можно больше про конечный продукт, узнать его особенности, пообщаться с менеджером проекта, а затем чётко продумать структуру программы ещё до того, как он начнет программировать.

Готовность постоянно изучать что-то новое

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

Английский язык — всё более обязательный навык для программиста: переводы документации и книг на русский язык часто запаздывают на годы и появляются, когда технологии уже неактуальны. Топовые онлайн-курсы и конференции остаются непереведёнными. Да и в коде совершенно неприлично писать что-то вроде var peremennaya = 1.

Также очень важно понимание потребностей бизнеса. Продуманнейшая архитектура и утончённые инженерные практики не нужны при создании прототипа, цель которого максимально быстро проверить гипотезу. И наоборот, писать «ароматный код» (code smell) и не адаптировать практики в долгоживущих проектах — недопустимо.

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

Любите свою работу и непрерывно развивайтесь!

Наиболее ценными на рынке специалистов в области ИТ делают не только их навыки программирования и погружение в технологии, востребованность которых с каждым годом меняется, но и (а, возможно, и в первую очередь) soft skills. Это надпрофессиональные качества, развитие которых помогает нам коммуницировать друг с другом, быстро принимать решения, нести ответственность за них, работать на результат или уходить в процессы и уделять внимание мелочам, уметь слышать и слушать других людей. Помимо увеличения эффективности в рабочих процессах, soft skills помогают эффективно прокачать технические компетенции.

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

Кроме того, сегодня жизнь каждого из нас связана с мобильными устройствами и различными экосистемами в них. Сайты почти всех компаний интегрированы с мобильным приложением. iOS- и Android-разработчики по этой причине не теряют актуальности на рынке труда.

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

Навыки, которые традиционно относят к hard skills

  • В первую очередь — навыки построения и анализа алгоритмов. Этот навык формируется изучением стандартных алгоритмов, анализом их сложности и практической имплементацией подходов к построению алгоритмов.
  • Рядом с алгоритмами идут структуры данных. Предмет, который изучают, так и называется «Алгоритмы и структуры данных». Понимание, умение строить и применять различные структуры данных базируется на изучении принципов работы компьютеров как таковых.
  • Умение применять паттерны проектирования, переключаться между разными парадигмами программирования. Никогда не знаешь, завтра увидишь объектно-ориентированный или функциональный код, но спроектировать решение всё равно нужно.
  • Навык и стремление к автоматизации. Программист должен уметь и хотеть избавляться от рутины. Если часто начинаешь писать одно и то же — пора создавать фабрику.
  • Навык анализа чужого кода. Программы редко создают в одиночку, нужно приобрести сноровку для быстрого понимания работы коллег, чтобы интегрировать системы.
  • Навык работы с документацией. Нужно уметь понимать технический текст других разработчиков и писать свой. Чем сложнее система, которую вы создаете, тем больше работы с документацией.
  • Навык «копнуть глубже». Если используете готовое решение или чужую технологию, нужно быть готовым «заглянуть под капот» и что-то переделать под себя. Такое, кажется, было и будет всегда.

Навыки, которые относят к soft skills

  • Навык работы с задачей. Включает уточнение и декомпозицию задачи.
  • Умение оценивать свое время. При разработке всё всегда связно со сроками. Близкие к реальности оценки будут в цене всегда.
  • Умение сконцентрированно работать. Чем легче программист впадает в ощущение «не могу отвлечься, пишу код», тем он производительнее и эффективнее.
  • Умение правильно задать вопрос. Правильно — означает, поискав ответ самостоятельно, а не найдя ответа, сформулировав все вводные для ответа коллегами или сообществом.
  • Навык вовремя предупредить свои или чужие ошибки. Вовремя почувствовать отклонение от дедлайна и сказать об этом, заметить, что коллега в предыдущем коммите пошёл по пути, который вызовет проблемы, и обсудить — очень ценный навык.
  • Умение учиться. Это навык. Учиться придётся всегда, индустрия динамичная, такой она будет всегда.
  • Умение признать ошибку и изменить подход. Нормальное отношение к работе — это принятие, что рефакторинг вездесущий и неизбежный.
  • Фокус на задаче, а не на технологии. Легко очароваться модными фреймворками, о которых говорят на митапах. Но важна на самом деле задача. Навык выбора технологии, соответствующей вводным, — путь сильных.
  • Быть хорошим человеком. Это тоже навык. Мы не заперты в клетке и работаем с людьми: проводим ревью, обсуждаем решения, делимся знаниями, узнаём новое от других. Люди с готовностью будут идти вам навстречу, если научиться быть добрым и открытым.

Главный навык — готовность постоянно учиться. Сейчас это актуально для всех профессий, но программистам, если они хотят быть востребованными, важно держать руку на пульсе технологического развития, изучать новые языки программирования. Кроме того, всё более важным становятся так называемые soft skills и умение работать в команде. Эти качества отлично прокачиваются в рамках различных командных соревнований и хакатонов. К примеру, на соревнованиях по спортивному программированию у команды из 3 человек всего один компьютер. Им надо правильно распределить роли, время, учиться работать в немного экстремальных условиях и т. д. И готовя наши команды, мы, безусловно, уделяем этому внимание. Нарабатывать практику талантливым ребятам из разных уголков мира мы помогаем в международном образовательном проекте Moscow Workshops. Ребята не только вовлекаются в соревновательную атмосферу и показывают высокие результаты на чемпионатах, но потом гораздо комфортнее чувствуют себя на работе в стрессовых ситуациях и как следствие — более эффективны. И всё же надо не забывать, что soft skills должны быть надстройкой при хорошем знании алгоритмов.

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

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

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

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

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

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

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

Не менее важны soft skills разработчика: умение понятно излагать свои мысли устно и на бумаге, грамотно планировать своё время, уметь работать в команде.

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

Прежде всего, давайте определимся, что значит «всегда востребованы»? Язык COBOL уже давно не топовый, но программисты на COBOL всё ещё встречаются.

Говоря о востребованности, можно подразумевать два разных момента:

  1. Возможность легко найти работу по профессии.
  2. Возможность профессионального развития.

С первым пунктом всё достаточно просто. Любая из десяти наиболее востребованных технологий так или иначе прокормит вас следующие лет 10–20. И тут надо определить, что такое «всегда». Давайте решим, что «всегда» — это до построения первого настоящего МИ и, соответственно, до наступления сингулярности. После этого события, очевидно, никаких программистов уже не будет. Наступит это, как мне кажется, нескоро, но давать прогноз более, чем на 10–20 лет, я всё же остерегусь.

Со вторым пунктом сложнее. Тут я не готов выдать чёткий список, но, если говорить об общих принципах, обычно хорошо развиваются профессионально те программисты, которые хорошо понимают, из каких элементов состоит система, как они работают, как связаны друг с другом. Что-то вроде «вот страница в браузере, она использует JS, CSS, HTML, они работают вот так, доставляются они в браузер по http — протокол устроен вот таким образом, он базируется на сетевом протоколе TCP с такими-то особенностями, браузер — это процесс, выполняемый операционной системой, процесс отличается от нитей вот таким образом». И так далее.

Эти знания не помогают писать код немедленно, надо ещё знать конкретные технологии, но это здорово помогает при решении проблем и построении надёжной архитектуры системы. И это ценится всегда. А технологии легко изучаются по мере необходимости. Улучшать эти навыки можно, задавая себе вопросы: а как эта штука работает, откуда берутся эти буковки на экране, какие есть альтернативные пути решения задачи?

В первую очередь, программист обязательно должен иметь профессиональные компетенции (так называемые hard skills), соответствующие поставленным задачам. Однако нельзя забывать про универсальные навыки (soft skills): любому специалисту нужно уметь находить общий язык с коллегами и задавать правильные вопросы при получении задачи. В противном случае и трудозатраты, и результат могут существенно отличаться от ожиданий заказчика: иногда программисты строят настоящую «Звезду Смерти», когда нужно создать лишь практичный летательный аппарат.

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

Умение писать чистый код и прочие важные навыки приобретаются в процессе работы. И зачастую диктуются сроками и условиями труда.

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

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

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

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

Один из самых важных soft skills навыков, которые необходимо развивать, — это умение работать в команде. Талантливые интроверты больше никому не нужны, Agile и Less практики появились не просто так, и в дальнейшем роль межличностного общения будет только усиливаться. Программист должен продуктивно взаимодействовать с тимлидами, дизайнерами, тестировщиками, другими программистами, руководителями бизнес-направлений. Поэтому важно развивать коммуникабельность, умение договариваться, адаптивность, эмоциональный интеллект. Рекомендую пройти курс эффективных переговоров и публичных выступлений, чаще запрашивать от коллег обратную связь, читать специализированную литературу, например, «Сначала скажите «нет». Секреты профессиональных переговорщиков» (Джим Кэмп).

Актуальность в работе программиста не теряют аналитическое и критическое мышление. Удивительно, что разработчики могут часами ломать голову на тему оптимальности алгоритмов или потребления памяти, но совершенно не задаются вопросом: «А зачем поставлена задача, какую боль бизнеса она закрывает, можно ли решить её иным способом?». В контексте командной работы умение анализировать информацию, интерпретировать данные, оценивать и приоритезировать вводные — особенно важно. Прежде чем внедрить ту или иную фичу, воспользуйтесь минимальным алгоритмом критических вопросов и соберите максимально полную картину: какую проблему мы планируем с её помощью решить, насколько эта проблема критична, что будет, если не реализовывать её совсем и т. д.

Конечно, всё это не отменяет наличие «технической базы» программиста и его постоянное совершенствование с учётом развития рынка и новых технологий. В целом, главный навык нашего времени — умение быстро и качественно осваивать новую информацию, готовность всегда учиться новому. Ставьте долгосрочные и краткосрочные цели для собственного профессионального развития (например, разобраться с Kubernetes), делите их на более мелкие шаги (для начала нужно узнать, как работает Docker и что такое контейнеризация), регулярно выделяйте время для проработки. И, конечно, следите за трендами, посещайте конференции, общайтесь с коллегами по цеху, ходите на собеседования — это поможет держать руку на пульсе, понимать, какие технологии сейчас востребованы. И помните фразу Альберта Эйнштейна: «Интеллектуалы решают проблемы, гении предотвращают их».

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

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

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

Сегодня для этого масса инструментов: плагины-трекеры времени к средам разработки, расширения к хрому, фитнес-браслеты с напоминалками и т. д.

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

Все «отвлекающие» действия (поболтать, попить кофе, посмотреть ролики в ютюбе) тоже нужно учитывать. Если становится понятно, что вы неэффективно распределяете свои рабочие часы, можно использовать методы pomodoro или подобные техники управления временем.

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

В дополнение к системному мышлению и умению писать чистый код, я бы ещё выделил:

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

Умение понимать других людей. Это уже из разряда soft skills, но один из наиболее полезных навыков для программиста. «Другие люди» — это и пользователи, и коллеги по команде разработки (аналитики, тестировщики). Важно понимать не только что нужно другому человеку, но и зачем ему это нужно. Для развития полезно чаще общаться с людьми смежных специальностей, интересоваться их работой.

Умение планировать работу, в т. ч. оценивать сложность отдельных задач и возможные риски. Развивается с опытом, но именно с опытом, а не просто стажем работы. Важно фокусироваться на этих вопросах при планировании и после выполнения — проводить ретроспективу и анализировать причины расхождений.

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

Итак, какие навыки программиста всегда будут актуальны?

Конечно же, это практические навыки в написании кода:

  • применение паттернов проектирования и алгоритмов;
  • комментирование кода;
  • умение писать чистый код и покрывать его тестами;

В области soft skills всегда будет полезно уметь:

  • правильно задать вопрос;
  • общаться с людьми и работать в команде;

Не устареют и навыки самодисциплины и саморазвития:

  • желание учиться, постоянно развиваться и быстро находить информацию;
  • корректная оценка времени выполнения работ;
  • умение концентрироваться на работе;

И ещё не будет лишним:

  • понимание принципов работы компьютерного «железа» и операционных систем;
  • системное мышление.

Напоминаем, что вы можете задать свой вопрос экспертам, а мы соберём на него ответы, если он окажется интересным. Вопросы, которые уже задавались, можно найти в списке выпусков рубрики. Если вы хотите присоединиться к числу экспертов и прислать ответ от вашей компании или лично от вас, то пишите на experts@tproger.ru, мы расскажем, как это сделать.

Следите за новыми постами
Следите за новыми постами по любимым темам
24К открытий24К показов