Под моим комментарием получился неожиданный ажиотаж, из которого было очевидно, что народ сильно волнует тема курсов, обещающих быстрое вхождение в профессию разработчика и золотые горы для новоиспечённого гуру программирования. Народ требовал зрелищ и ненависти в адрес таких курсов - как говорится, получайте, что просили :)
Об авторе: разработчик и интервьюер Google с историей стажировок в Google, Microsoft и JetBrains, образование - матмех СПбГУ, кафедра системного программирования.
Чего ожидать от поста: очень личное мнение с точки зрения интервьюера топ IT-компании о том, что не так с быстрыми IT-курсами и о пробелах в знаниях их выпускников; советы в общих чертах, как же всё-таки войти в это самое АйТи. Пост ограничен профессией разработчика ПО ввиду жизненного опыта автора.
Поехали?
Что значит "войти в АйТи"?
В данном контексте под вхождением в профессию мы будем понимать трудоустройство на позицию Junior-разработчика или хотя бы на оплачиваемую стажировку, а также успех в соответствующей должности. Успех стажировки определяется предложением постоянной работы, успех Junior-разработчика - повышением до позиции Middle-разработчика.
Чего работодатели ждут от кандидатов?
Рекламируемая цель курсов - подготовить их клиентов к интервью и работе в качестве разработчика ПО, так что давайте определимся с требованиями к соискателям, до того как оценивать эффективность курсов в достижении этой цели.
Для осознания минимального необходимого набора навыков давайте посмотрим, что ожидается от кандидата на стажировку (оплачиваемую, и временами весьма неплохо):
* Умение более-менее свободно общаться на английском;
* Культура мысли - кандидат должен уметь разбить несложную задачу на элементарные составляющие, следовать базовым законам матлогики в своих рассуждениях, построить формальное доказательство утверждения;
* Базовые алгоритмы и структуры данных - кандидат должен уметь определить адекватные задаче алгоритм и организацию данных, оценить вычислительную сложность решения;
* Концепции программирования - например, динамическое программирование, принцип "разделяй и властвуй", жадные алгоритмы, графы;
* Низкоуровневые концепции - архитектура компьютера и операционные системы, виртуальная память, кэши и алгоритмы их организации, прерывания;
* Понимание организации сетей, сетевых протоколов;
* Понимание параллелльного программирования и многопоточности;
* Принципы трансляции программного кода в исполняемый код;
* Понимание концепций и синтаксиса какого-нибудь популярного языка программирования и умение применять их для решения учебной задачи;
* Владение терминами информатики и адекватное их применение в процессе решения задачи;
* Понимание принципов тестирования и их разумное применение к поставленной задаче;
* Знание принципов объектно-ориентированного программирования;
* Умение внятно превращать мысли в слова.
От стажёров не требуется опыт работы по специальности, но желательно иметь несколько небольших проектов: учебные проекты и курсовые, pet-projects, участие в опен-сорсе.
Junior-разработчик, помимо означенных выше качеств, должен также:
* Иметь опыт разработки на стажировке в крупной компании и/или в качестве разработчика в небольшой или не широко известной компании;
* Быть способным реализовать поставленную хорошо очерченную задачу без постоянного надсмотра со стороны более старших разработчиков (часто при наличии готового плана реализации, разработанного старшими товарищами);
* Уметь разбить небольшую систему на компоненты, спроектировать интерфесы между ними, облегчая тестирование, поддержку кода, расширение системы.
Вы ещё здесь?
Отметим также, что это список на "общее программирование". Нишевые области, такие как геймдев, машинное обучение, мобильная разработка и т.д. добавят своих требований в общую кучу.
Учат ли этому "вайтишные" курсы?
После прочтения списка сверху в вас уже должны были зародиться сомнения в правдивости рекламы, обещающей освоение профессии за несколько месяцев, смотря лекции пару часов в неделю и тратя ещё пару часов на домашние задания.
И это не зря. Каждый пункт из списка - это как минимум полугодовой курс с объёмными теоретическими и практическими заданиями - и это не говоря уже о математической базе, необходимой для понимания многих из этих тем.
Так что как бы ни хотелось поверить молодым-активным-хипстеровато-выглядящим парням, завлекающих рассказами об очередях хэдхантеров к выпускникам их контор, увы, это такой же нонсенс, как и заявление, что к работе хирурга в элитной клинике можно подготовиться, зарезав пару кур в деревне.
Что же там тогда происходит?
Я посмотрела один широко рекламируемый курс по Java и попыталась систематизировать увиденное. Систематизировать оказалось немного. Плакала только горько, вина бутылку выпила.
И вот что я там увидела:
1. Материал подаётся в каше, запутанно. С первых же уроков используются сложные для новичка концепции ("клиент-серверная архитектура"). Всё происходит в консоли (которую ученик, скорее всего, никогда до этого в глаза не видел). Сложные понятия вводятся напрямую, а не строятся на более простых (например, "String - это класс, length - это метод класса String" без объяснения, что такое класс и метод, да и хотя бы ООП в общих чертах, ну и как можно в принципе Джаву давать без хотя бы одной лекции по ООП - это отдельный вопрос). Сложилось ощущение, что основная цель - показать, какой лектор умный и сколько разных слов он знает, а не действительно помочь ученику разобраться.
2. Сложно о простом. Чтобы объяснить условные операторы, совсем не нужно заводить программу на 100 строк, которая не влезает на экран и где сам лектор путается в логике. Зачем? Или это ещё один приём, чтобы вызвать у ученика ощущение себя как бесполезной воши, неспособной ничего достичь без богоподобного лектора курса?
3. Отсутствие внятных практических заданий. В задании обычно даётся готовый код, где нужно поменять пару строк. Ученику не даются задания, которые действительно заставят его думать и осознанно применять новые концепции, чтобы решить задачу с нуля.
4. Даются разрозненные, бессистемные знания синтаксиса языка, но никаких объяснений принятых практик программирования, организации мысли, разбиения задачи на подзадачи, хорошего тона для определения границ классов и методов. Грубо говоря, научили, как писать буквы, а про грамматику, пунктуацию, и орфографию забыли, не говоря уже об изложении мысли и структурированию текстов.
5. Лектор читает уставшим, скучающим тоном. Всем своим видом он показывает, как низко он опускается, передавая светоч знаний всяким идиотам. Я не знаю, даёт ли этот курс возможность общаться с преподавателями, но лично мне было бы крайне стрёмно задавать вопросы из страха вызвать своей никчёмной глупостью пренебрежительное закатывание глаз или смешки. Фактически, новичка отталкивают от идеи общаться о программировании с коллегами и просить помощи у более опытных товарищах, что является самым важным навыком любого программиста, особенно новичков!
Подытожим результат. Если вам сильно повезёт с курсом, то, может быть, за три месяца вас по верхам научат синтаксису языка - без единой возможности понять, как этот синтаксис применять, без понимания, как написанный код фактически исполняется машиной, без систематического обучения базе и без внятных возможностей получить практический опыт.
Часто курсы фокусируются на изучении конкретной технологии вместо фундаментальных концепций. К примеру, курс с названием вроде "Программируем с помощью Django" или "Разработка приложений с MongoDB") - это мгновенный красный флаг. 99% такой курс состоит из заучивания 10-20 стандартных решений без понимания концепций фреймворка или механизмов его работы.
К чему это приводит?
Это приводит к миллионам резюме, написаным под копирку: "знания языков X, Y, фреймворков A, B, баз данных L, M" - внушительный список технологий при абсолютно пустом списке проектов и достижений. Это приводит к кандидатам, требующим позицию синьора, потому что ну вот же они обучались у такого великолепного преподавателя. Это приводит к печальным интервью, где человек со своими впечатляющими резюме и амбициями мнётся полчаса у доски, неспособный банально развернуть список.
Работодателю плевать, что вы приблизительно знаете синтаксис языка X или пару библиотек фреймворка A. Все эти языки и библиотеки меняются и уходят в небытие чаще, чем мгновение ока. Что действительно интересно крупным, стабильным игрокам IT-рынка - так это кандидаты, владеющими непоколебимыми понятиями информатики и способными адаптироваться к разным языкам, фреймворкам и технологиям, думать в реальном времени и эффективно общаться в другими разработчиками и с клиентами, генерировать идеи для решения задач - как проектирования, так и алгоритмических - а также организовывать работу (свою и других разработчиков) для выпуска качественного продукта в разумные сроки.
Вы скажете: "Да рядовому программисту это всё не нужно! За мои over 9000 лет в разработке мне никогда не приходилось писать сортировку самому!" Это может быть правдой...
Во-первых, без этих знаний в настоящее время новичок банально не пройдёт собеседование в более-менее приличной конторе, так что какая разница, что вам там приходилось или не приходилось.
Во-вторых, даже если самому алгоритмы писать не придётся, то их почти наверняка придётся использовать в качестве библиотек, и, например, правильный выбор между std::unordered_map и std::map - это именно тот случай, где базовые знания подчёркивают разницу между квалифицированным специалистом и "ненуачо компилица жи роботает жи".
Наконец, если человек не обладает банальной профессиональной грамотностью, мы не можем ожидать, что он будет эффективен, когда нужно будет вынуть мозг через ухо и решить что-то нестандартное, что не вкладывается в типовые трафареты очередного фреймворка-однодневки.
Любая инновация стоит на плечах гигантов. Выпускники курсов - увы! - стоят максимум на шаткой табуретке посреди болотной топи.
Если не курсы, тогда что?
Ох, боюсь навлечь на себя праведный гнев вайтишников... Но была не была - есть в жизни вещи поважнее рейтинга на Пикабу :)
Моё профессиональное мнение состоит в том, что нацеленную программу образования превзойти практически невозможно. Адекватный факультет/кафедра пройдутся ровно по списку навыков, обозначенному выше, но мякотка даже не в этом, а в том что у топ-факультетов имеются связи в хороших компаниях, благодаря чему они могут рекомендовать вас на стажировки (которые, кстати, обычно тоже предлагаются только студентам, а не любым новичкам).
На отдельных кафедрах есть культура летних школ - неоплачиваемых (или оплачиваемых по грантам) проектов, предназначенных исключительно для предоставления среды студентам, где они могут набраться практического опыта, набить шишки перед более серьёзными соисканиями и заполнить своё первое резюме ссылками на реальные проекты.
Значит ли это, что тёплого местечка в Гугле вам не видать, не просидев предварительно 4-6 лет за партой в пыльном универе? Отнюдь нет.
Индустрия жадна до (высококлассных) специалистов, и никому нет дела, каким образом навык был достигнут. Но навык при этом должен быть. Самостоятельно достичь его можно, но, интуитивно, это будет сложнее, дольше, и потребует гораздо большей дисциплины и самоотдачи, чем обучение на кафедре.
И это не говоря уже о том, что при самообучении у вас не будет доступа к опытным специалистам, которым можно задавать разные дурацкие вопросы, а так же к связям кафедры, так что придётся позиции искать самостоятельно и без рекомендательных писем, что на практике часто означает, что рекрутер просто выбросит ваше резюме, если в нём нет строчки об обучении по специальности в адекватном вузе.
Как промежуточный вариант между самообразованием и полноценной вышкой существуют "школы курсов". Они не дают официальных дипломов об образовании, но они полностью бесплатны, преподают в них (да, снова связи...) лучшие преподаватели вузов (знаю некоторых лично, потому что они и в СПбГУ преподают) и инженеры приличных компаний (Яндекс, JetBrains), а часть обучения составляют обязательные практические проекты.
В чём подвох? Чтобы поступить, нужно сдать экзамен на математику уровня примерно второго курса столичного вуза.
Я в курсе двух таких школ, которые к тому же сотрудничают между собой: Школа Анализа Данных (упор на машинное обучение) и Computer Science Center (более широкий спектр предметов). Готовьтесь потратить 2-3 года на обучение в любой из них (сравните с 4 годами полноценного бакалавриата, которые включают в себя также и математику, требуемую обеими школами на входе).
Я всё еще не знаю, как мне быть - можно поподробнее?
Можно! Вместить в один пост всю информацию о том, как освоить профессию, да ещё и требующую глубоких теоретических и приладных знаний, заведомо невозможно. Если вам пришлась по душе эта статья, вас могут заинтересовать следующие темы:
* Разделы математики, полезные разработчику ПО (со списком литературы);
* Темы информатики, с которыми должен быть знаком любой программист (со списком литературы);
* Список алгоритмов и структур данных, наиболее полезных на интервью и в разработке;
* Как выглядит типичный процесс собеседования на программиста в топ западные компании;
* Составляем резюме грамотно;
* Один день из жизни разработчика ПО, или что вы не знали о профессии программиста.
Голосуйте за наиболее интересные темы в комментариях или предлагайте свои, и не стесняйтесь задавать вопросы :) Будет достаточно голосов - напишу больше статей :)