Художник — Надежда Коткина, позировал — cyber_roach
Кто это?
За термином «программист» могут скрываться узкопрофильные программисты, разработчики программного обеспечения, инженеры, системные аналитики и т.д. Тем не менее, всех программистов объединяет одно — умение облечь человеческие требования в машинный код, чтобы сделать труд или развлечение автоматизированным, удобным, простым. Программист создаёт инструкции для компьютера, в результате выполнения этих инструкций получается какой-то целевой результат.
Вам стоит задуматься, не будущий ли программист вы, если…
… ваша мотивация исходит изнутри, вам нравится процесс управления компьютером, вы хотите не просто использовать программу (игру, приложение), но и знать, как она работает, модифицировать её.
… вы не ожидаете бешеных доходов и не думаете о том, что программирование — новый рок-н-ролл, первично именно желание творить магию: превращать идеи в код.
… вы знаете, как сделать лучше любую программу, любой сайт, любое мобильное приложение. Вы точно знаете, что можно хотеть от программы и мечтаете научиться делать совершенный код.
Где нужен?
Сегодня программисты нужны везде и я не думаю, что этот тренд изменится в ближайшие 10-15 лет. Программисты нужны в промышленности, науке, космосе, бизнесе, медицине, транспорте и даже не в ИТ-компаниях (шутки шутками, а вы знаете, как трудно найти отличного программиста 1С или разработчика для интернет-магазина на 1С-Битрикс?!). В общем, даже в институте церкви и благотворительности есть спрос на программистов. И это здорово, потому что вы можете не просто выбрать профессию программиста, но и соотнести её со своим увлечением: химией, биологией, механикой, связью и даже историей и лингвистикой. Более того, если вы будете сочетать в себе навыки разработки ПО и основы профильной деятельности, ваша цена на рынке здорово вырастет, а конкуренция изменится.
Поэтому вам нужно понять не столько, где работать, сколько что именно из разработки вам ближе.
- Мобильная разработка — создание приложений для мобильных устройств (смартфоны, планшеты, носимая электроника, научное оборудование, датчики IoT и т.д.). Отличается непрерывным развитием и постоянным интенсивным самообучением.
- Веб-разработка (фронтенд и бэкенд или фуллстек) — создание всевозможных веб-приложений для любых целей и задач, разработка сайтов, интернет-магазинов и проч. Весь мир сейчас в WEB, поэтому вы можете найти абсолютно любую задачу.
- Системное программирование — разработка низкоуровневого ПО, взаимодействие с железом. Требует исключительной логики, инженерного склада мышления, внимания и досконального подхода к мелочам.
- Научная работа — широкая сфера для развития, когда на первый план выходит базовая специальность, на второй — программирование (телемедицина, медицинская кибернетика, аналитические системы для химиков и биологов и т.д.). Крайне перспективное направление с большим заделом возможности работы в лучших международных компаниях и командах.
- Анализ данных, статистика и математика — для тех, кто любит покопаться в больших данных и найти большие идеи. Для тех, кто усидчив, умеет видеть взаимосвязи и закономерности. В общем, если вы пытались построить свой прогноз по COVID-19, вам сюда :-)
- Нейронные сети и компьютерное зрение (распознавание образов и элементов) — растущее направление, которое требует исключительного понимания математики. Нейронные сети скоро будут едва ли не на каждом утюге, спрос на специалистов будет только расти.
- DevOps/DevSecOps — для тех, кому скучно в рутинном программировании и кто тяготеет к системному администрированию и управлению разработкой. На данный момент на рынке труда ситуация «девопсов много, ни одного не найти», потому что к настоящему DevOps путь не так прост, как его видят любители Докера.
- Прикладная разработка и бизнес ПО — отдельный мир разработки, где можно писать десктоп на Delphi и зарабатывать миллионы, знать COBOL и быть самым сманиваемым специалистом на рынке, прошариться в Java и быть на главных ролях в коммьюнити и т.д. Это рисковый путь развития, в основном, для опытных разработчиков, но если вам случилось влюбиться в С/С++/Java или какой-то из «латыней от программирования» — почему нет?
Опять же, я перечисляю основные направления, но на самом деле на их стыке образуются новые перспективные сферы, например, обработка естественных языков (NLP), AR/VR, разработка игр, автоматизация тестирования и проч.
Важно понимать ещё одно разделение.
- Программисты в ИТ-компании решают сложные технические задачи, связанные с адаптацией к разным платформам, работой под нагрузкой, рефакторингом и оптимизацией, удобством UI/UX и т.д. Это сложные профессиональные задачи, без решения которых невозможен ни один релиз на продакшене (кому я вру?:-))
- Программисты в не-ИТ-компании решают все задачи сразу, но основные сводятся к автоматизации процессов и работы с чужим прикладным ПО: работа с корпоративным порталом, доработка CRM, ERP, биллинга, формирование отчётов по запросу, настройка и поддержка сайта, интернет-магазина, 1С и т.д. И, кстати, иногда программист-многостаночник из неайтишной компании может развить больше скиллов за счёт того, что он работает в комплексе, с системами целиком.
В ходе обучения программированию вы обязательно столкнётесь со всеми сферами и задачами понемногу, поэтому буквально спустя полгода с начала обучения у вас сформируется представление о том, в какую сторону вы собираетесь двигаться. Например, у меня есть знакомый, который не хотел заниматься ничем, кроме того, что связано с программной начинкой читалок. В итоге он прошёл Barnes&Noble, работал с проектами Google и сейчас работает в Китае (доволен, здоров, фанатеет от жизни в стране). У каждого свой путь.
Базовые требования к профессионалу
Само по себе написание кода — это не самая сложная задача, гораздо сложнее понять требования, интерпретировать их и перевести в понятный машине язык. Работать с заказчиком кода (здесь мы имеем в виду и клиента, и коллег, и работодателей и т.д.) это всегда нервы и приключения, потому что они сами не знают, что хотят, мыслят упрощённо и считают технологии всемогущими. Но если вы претендуете на то, чтобы быть профессиональным программистом, вам необходимо не только хмуро бить по клавишам, но и активно работать с людьми, с техническими заданиями, требованиями и т.д. Это отличает программиста от простого кодера.
- Критическое мышление — умение выделять главное в требованиях, подходить к своему и чужому коду с точки зрения постоянной оптимизации и улучшения; навыки поиска лучших путей решения задач.
- Ориентированность на работу с деталями — в программировании не бывает мелочей. Даже если вы не написали ни строчки кода, вы наверняка слышали шутки про то, как отступ или потерянная точка с запятой отнимают часы в поисках бага и причин ошибок при компиляции. Невнимательный программист — нонсенс.
- Сосредоточенность, усилие, терпение — нередко приходится писать большие фрагменты кода, глубоко погружаться в поиск решения задачи. Любой отвлекающий момент растянет эти процессы надолго, поэтому программист должен иметь явно выраженный навык «свинцовой задницы», позволяющей дотошно разобраться в проблеме.
- Склонность к переработкам — вас сейчас возмутит этот пункт, особенно если вы выпускник или студент. Как так, переработка?! Только платно, по ТК РФ и вообще! Но нет, поработав немного, особенно на удалёнке, вы заметите, что с радостью отдаёте работе гораздо больше часов жизни, чем ей положено. Кстати, не замечал, чтобы кто-то активно боролся с этим явлением. Например, я пишу эту статью, на моих часах 00:09, а впереди ещё много текста и размышлений + основная работа ;-)
- Навыки активного слушания и общения — вам придётся понимать, что вам хочет объяснить внешний или внутренний заказчик. Да, иногда их ТЗ звучат как описания товаров с Алиэкспресс, и вам придётся вытягивать детали в процессе тесного диалога и длительного обсуждения.
- Умение работать в команде — программист никогда не работает один и нужно уметь вписаться как в команду, так и в правила управления разработкой, методологии и code style вашей компании.
- Потребность в самообучении — именно потребность. Вы должны непрерывно и осознанно изучать новые фреймворки, библиотеки, SDK, API, языки программирования и прочие инструкции и материалы. Остановитесь — через 6-12 месяцев отстанете от поезда.
- Ответственность — программист всегда отвечает за качество кода, который он создал, за работу программы, за её стабильность и быстродействие. Если вы склонны валить вину на тестировщика, заказчика или коллегу-разработчика, вам лучше пойти в менеджеры проекта (очень злая шутка, простите). А если серьёзно, программист отвечает за программу не меньше, чем хирург за операцию или строитель за мост или здание.
Я убедительно прошу вас не верить в сказки про программистов-интровертов. Если хотите расти в программировании, то засуньте своего интроверта подальше. Если хотите быть интровертом, вы быстро упрётесь в потолок профессионального развития, потому что коммуникации по-прежнему необходимы в деятельности разработчика. Даже на удалёнке вам придётся общаться с коллегами, участвовать в митингах, ретроспективах и обсуждениях.
Необходимость знания иностранных языков
Можно ли обойтись в разработке без знания иностранного (в частности английского) языка? Можно. Достаточно выучить синтаксис и слова языка программирования, мыслить и общаться вы можете исключительно на русском языке. Незнание языка не будет помехой в карьерном росте, развитии, коммуникациях в очень многих компаниях.
Однако — что даёт знание иностранного языка?
- Возможность удалённой работы в международных командах и зарубежных проектах. Кроме престижа и интересных задач, это ещё и заработная плата в долларах или евро (при нашем курсе неплохая история).
- Возможность работы в международных заказных проектах.
- Доступность всех материалов по разработке, записей лекций, конференций, курсов и т.д. Фактически у вас исчезают ограничения в самообразовании, все ключевые материалы мира программирования становятся доступны.
- Возможность эмиграции при наличии такого желания.
- Возможность стажировок в крупнейших ИТ-компаниях.
- Дополнительный фактор карьерного роста.
На Хабре было много дискуссий по поводу достаточного комфортного уровня владения английским языком для работы в ИТ-отрасли. По моему убеждению, для того, чтобы не быть глухонемым, нужен минимум Upper-intermediate либо Intermediate с активным говорением (например, вы туговаты в грамматике, но хорошо прокачали язык на учебной программе, в личном общении или на стажировке).
Где учиться
В современных российских вузах есть масса программистских специальностей, есть бакалавриат и магистратура, есть форматы дополнительного образования. Если вы ещё только выбираете свой вуз, то, конечно, стоит идти на специальный факультет, либо на физику, математику и другие технические специальности.
Если программирование вам нужно как вспомогательный инструмент для основной специальности, то либо поищите смежный вариант (типа медицинской кибернетики и информатики), либо обучайтесь параллельно главной специализации.
Если у вас уже есть образование, то для вас есть самообразование, различные курсы, онлайн-школы, корпоративные университеты и т.д. Вы можете изучать программирование с помощью этих средств обучения либо полностью самостоятельно или даже с ментором. О дополнительном образовании можно почитать здесь.
Обращаю ваше особое внимание: высшее образование по-прежнему важно, поскольку оно имеет значение для работодателя, нужно при переезде в другую страну, а также даёт базу, основу, которая позволит быстро развиваться в любом новом направлении.
Более того, не столько важно, какой язык программирования вы освоите, сколько важно, что вы знаете о математике, алгоритмах, вычислениях, сетевом и серверном администрировании, принципах организации сетей, стеках и проч. А эту основу как раз неплохо дают в вузах.
Лучшие книги и средства обучения
Для каждой специальности есть свой набор книг и ресурсов для обучения, но есть вещи, которые стоит прочитать всем.
- «Искусство программирования», Дональд Кнут
- «Жемчужины программирования», Джон Бентли
- «Путь программиста», Джон Сонмез
- «Чистый код. Создание, анализ и рефакторинг», Роберт К. Мартин
- «Алгоритмы. Построение и анализ», Томас Х. Кормен
- «Сам себе программист. Как научиться программировать и устроиться в Ebay?», Кори Альтхофф
- «Карьера программиста», Г. Лакман Макдауэлл
- «Идеальный программист. Как стать профессионалом разработки ПО», Роберт Мартин
- «Рефакторинг. Улучшение существующего кода», Мартин Фаулер и другие
- «Совершенный код», Стив Макконнелл
- «Кодеры за работой. Размышления о ремесле программиста», Питер Сейбел
- «Мифический человеко-месяц», Фредерик Брукс
- «Программист-прагматик. Путь от подмастерья к мастеру», Дейв Томас, Энди Хант
Эти книги не только содержат практически полезные знания, но и здорово мотивируют, формируют мышление и мировоззрение программиста. И я вас призываю: читайте, чтение развивает мышление, память и делает вас непобедимыми на любом собеседовании.
Из любимых ресурсов:
- Codecademy — универсальная интерактивная платформа для обучения языкам программирования. Лычки, ачивки, геймификация — сплошная мотивация.
- Udacity — англоязычный ресурс для обучения программированию.
- Codewars — огромный сборник тестовых задач для тренировки навыков по любому языку программирования.
- Coursera — без комментариев, просто лучшая лекционная «солянка».
- MIT OpenCourseware — море курсов от Массачусетского технологического института.
Вот тут неплохой обзор курсов, собранный другим автором, больше конкретики по русскоязычным курсам.
Ещё одна огромная и свежая подборка полезного онлайна для программистов.
Совет: даже если вам иногда лень заниматься, слушайте лекции хотя бы фоном, так вы погрузитесь в терминологию, обратите внимание на какие-то незаметные при напряжённом изучении моменты.
Мифы профессии
Про программистов ходит очень много мифов и слухов: про характер, грубость, неумение строить личную жизнь и т.д. Но это частные случаи, которые можно найти в профессии. Например, я был одно время близок к сфере медицины и могу сказать, что там тоже немало замужних за работой и женатых на работе, немало суровых интровертов и грубых, но профессиональных ребят (скорее, задолбанных). Да и вообще сложно представить «анклав» счастья в какой-то определённой сфере.
А если программист ещё и геймер… Всегда можно найти пару ;-)
Поэтому я разберу четыре самых популярных мифа.
- Программисты гребут деньги лопатой. Нет. С одной стороны, заработные платы в ИТ-сфере действительно выше других отраслей и, как показала эта чумачечая весна, ИТ ещё и более защищена, приспособлена к активной удалённой работе. Однако чтобы пройти путь до зарплаты выше рынка, нужно получить более низкую зарплату, а иногда так даже пройти бесплатную стажировку — не ради денег, а ради знаний, навыков и связей. На высоких позициях заработные платы действительно могут достигать 500 тыс. рублей в месяц, и к этому нужно стремиться. Но если вы на первом своём собеседовании на должность программиста пренебрежительно закидываете ногу за ногу и просите «сотню на руки» в столице или «сороковник» в регионах, вы проиграли. Лучше устроиться, показать результат и попросить повышение: эффективным программистам редко отказывают.
- Программисты часто болеют. Увы, отчасти это правда. Сидячая работа, руки на мышке и клавиатуре, ненормированные режимы сна и питания зачастую играют злую шутку и вместе с опытом и карьерным ростом приходят лишний вес, одышка, сахарный диабет, гипертония, заболевания ЖКТ, заболевания опорно-двигательной системы, туннельный синдром и даже психические расстройства. Но это случается только с теми, кто полностью погружается в работу и забывает о себе. Регулярный спорт, правильное и регулярное питание, перерывы (не перекуры и не перекусы!), грамотно организованное рабочее место, подобранные добавки и витамины, активное общение с коллегами, сообществом, друзьями и семьёй, чтение — полезные привычки, которые сохранят ваше здоровье и, что немаловажно, обеспечат отличное функционирование мозга.
- Программист имеет низкий потолок в карьере. Нет, любой программист имеет возможности горизонтального и вертикального роста. Программист может расти как внутри программирования, так и в управлении разработкой до тимлида, CTO, CIO и т.д. При наличии хорошей идеи талантливый программист и хороший управленец может открыть своё дело и расширить горизонт навыков на максимальную величину.
- Программистов заменят роботы. Буду краток. А кто роботов будет программировать? ;-)
Главный совет
Если вы учитесь быть программистом, однажды вам обязательно захочется бросить это всё, потому что путь покажется слишком длинным. Вы устанете от однообразных тренировочных задач, каждая неудачная компиляция будет вызывать тупое, болезненное отчаяние, вам будут сниться указатели, рекурсии и принципы ООП (ну или неудачные вызовы функций). Вся эта возня покажется безумного далёкой не только от вашего первого самостоятельного проекта, но и от первого корпоративного мержа…
Желание бросить — первый признак того, что вы идёте верным путём, что вы действительно напрягаетесь, а не мастрячите какой-то код методом копипаста из Google (даже не с GitHub!). Только когда вы настолько натренируетесь на простых задачах, что они вам станут противно скучными, вы сможете уверенно перейти на новый этап с отличной базой знаний.
Совет простой: не бросайте. Отвлекитесь, переспите с этими мыслями, забросьте обучение на неделю и вернитесь. Вы сами не заметите, как в голове что-то «щёлкнет» и всё встанет на свои места и вот он, первый мерж, первое код ревью, первый коммит в open source, первое выступление на митапе, свой пет-проект, первые задачи на должности миддла. Не останавливайтесь — всё будет!
Gornich
отличная статья! Спасибо, Автор!