Почему люди проваливают собеседования по алгоритмам и структурам данных в крупных компаниях?
Компьютерные науки — это область с огромными возможностями. Миллионы студентов всего мира мечтают построить карьеру в этой сфере. Но возникает неожиданная проблема: несмотря на то, что существует огромное количество обучающих ресурсов, большинству студентов не удаётся стать хорошими специалистами и удачно пройти собеседование. Опираясь на свой опыт работы более чем с тысячей учеников, в этой статье я хотел бы обратить внимание на пять основных трудностей в изучении компьютерных наук.
«Умение решать задачи есть искусство, приобретающееся практикой, подобно, скажем, плаванию. Мы овладеваем любым мастерством при помощи подражания и опыта », — Дьёрдь Пойа.
Но перед тем, как перейти к трудностям, я хотел бы поведать вам одну историю.
До поступления в Индийский институт технологий я ни разу не использовался компьютерами. На первом курсе я получал низкие оценки по курсу языков программирования. Тогда я попросил о помощи старшекурсников, но они не смогли мне понятно все объяснить. Я заставил себя смириться с тем, что точно не смогу работать в области компьютерных наук. Но, как говорил Стив Джобс:
«Ты не можешь соединить ключевые точки своей жизни наперёд; но можешь всё связать воедино, оглядываясь назад».
На третьем курсе один из моих друзей объяснял рекурсивный алгоритм нахождения n-ного числа Фибоначчи. Он сказал, что рекурсия в этом случае — не лучший метод, так как при больших значениях n компьютеру могут понадобиться годы на вычисление.
Я сказал: “Правда? Как так?”
Он ответил: “Сложность этого алгоритма — экспоненциальная функция от n”. Мой друг сразу же объяснил мне, что такое сложность алгоритма и привел доказательство.
Я удивился и спросил: “Почему тогда на экзамене на первом курсе студенты писали именно этот код?”
Друг улыбнулся и ответил: “Потому что они просто запомнили его и даже не думали о его производительности”. Затем он объяснил мне более эффективный метод решения с использованием динамического программирования.
Я впервые приблизился к пониманию значимости алгоритмов. В тот момент они меня настолько заинтересовали, что я изучил книгу “Алгоритмы: построение и анализ” дважды за сто дней!
Решение задач при помощи алгоритмов и структур данных — моя страсть. Я верю в то, что персональный подход к каждому ученику поможет в преодолении сложностей в обучении и достижении успехов. И вот, наконец: пять сложностей, которые я выявил за четыре года преподавания:
- Отсутствие структурированного обучения: обучение программированию должно проходить согласно определённому плану, в котором темы идут последовательно: от простых к сложным. Студенты часто путаются из-за непоследовательности тем и сложных примеров, затрагивающих ещё не пройденные материалы. В конце концов, они просто зубрят решения рассмотренных задач, что оказывается совершенно бесполезным на собеседованиях.
- Необходимость применения различных навыков: учащиеся должны уметь понимать условие задачи, разрабатывать подходящий алгоритм для каждого случая и писать его реализацию. Кстати, понимание применения алгоритма в реальной жизни способствует выработке долгосрочного интереса к его изучению.
- Предубеждения: большое количество учащихся уверено в том, что решение задач на применение алгоритмов — это сложно. Такое мнение передаётся по цепочке. Таким образом складывается ложное впечатление о сложности предмета.
- Недостаток взаимопомощи: в самом начале обучения учащиеся не могут понять, какие вопросы стоит задавать знакомым, уже разбирающимся в этой теме, и нужно ли их вообще задавать.
- Неопределённый план карьеры: обучение программированию помогает получить высокооплачиваемую работу, однако большинство учащихся во время обучения не задумываются о том, какие умения нужны для их будущего карьерного роста. Поэтому немаловажно найти заранее конкретную компанию и позицию для того, чтобы определить индивидуальный план обучения необходимым навыкам.
Знание этих проблем может помочь вам их избежать. Удачи в обучении и прохождении собеседований!