Большинство современных программистов получили образование в вузах. Со временем это изменится, но сейчас дела обстоят так, что хорошие кадры в IT-компании все равно приходят из университетов. В этом посте Станислав Протасов, директор Acronis по связям с университетами, рассказывает о своем видении особенностей вузовской подготовки будущих программистов. Преподаватели, студенты и те, кто их нанимает, могут даже найти под катом пару полезных советов.
Последние 10 лет я преподаю математику, алгоритмы, языки программирования и машинное обучение в различных вузах. Сегодня помимо своей должности в Acronis я также являюсь заместителем заведующего кафедрой теоретической и прикладной информатики в МФТИ. Из опыта работы в хороших российских (и не только) университетах я вынес некоторые наблюдения о подготовке студентов по компьютерным дисциплинам.
Я уверен, что вы сталкивались с правилом 30 секунд, которое гласит, что программист должен понять назначение функции после беглого взгляда на ее код. Его придумали давно, с тех пор появилось множество операционных систем, языков, железа и алгоритмов. Я пишу код уже 12 лет, но относительно недавно я видел исходники одного продукта, которые и на первый взгляд показались мне магическими заклинаниями. Сегодня если вы не погружены в предметную область, то правило 30 секунд перестает работать. В противном случае вам не хватит не только 30, но и 300 секунд, чтобы разобраться, что к чему.
Например, если вам хочется писать драйверы, нужно будет нырнуть в эту сферу, прочитать тысячи строк специфичного кода. При таком подходе к изучению предмета у специалиста появляется “чувство flow”. Как в рэпе, когда ощущение хорошей рифмы и правильного ритма появляется без специальной рационализации. Так же и хорошо подготовленный программист может легко узнать неэффективный или просто плохой код, не вдаваясь в детальное изучение того, где произошло нарушение стиля или был использован неоптимальный подход (а вот объяснить это ощущение бывает весьма сложно).
Специализация и растущая сложность приводят к тому, что образование бакалавра уже не дает возможности изучить все направления достаточно глубоко. Но как раз на этом уровне образования нужно приобретать кругозор. Уже после, в магистратуре или на работе, нужно будет потратить некоторое время на погружение в проблематику и специфику предметной области, изучить сленг, языки программирования и код коллег, почитать статьи и книги. Мне кажется, только так с помощью университета можно “накачать перекладину” для будущих T-shaped специалистов.
К моей радости преподаватели университетов уже отказались от поиска правильного ответа на вопрос: “На чем лучше программировать?”. Споры, что лучше — C# или Java, Delphi или С++ — фактически сошли на нет. Появление множества новых языков программирования и накопление педагогического опыта привели к тому, что в академической среде устоялось понимание: для каждого языка есть своя ниша.
Проблема преподавания с использованием того или иного языка программирования перестала быть первоочередной. Не важно, на каком языке ведется курс. Главное — достаточная выразительность языка. Книга “The Art of Multiprocessor Programming” — хорошая иллюстрация этого наблюдения. В этом уже ставшем классическим издании все примеры приведены на Java — языке без указателей, но с Garbage Collector. Вряд ли кто-нибудь будет спорить, что Java далека от оптимального выбора при написании высокопроизводительного параллельного кода. Но для объяснения концептов, изложенных в книге, язык оказался подходящим. Другой пример — классический курс машинного обучения Эндрю Ына, преподаваемый на языке Matlab в среде Octave. Сегодня можно было бы выбрать другой язык программирования, но какая, в сущности, разница, если важны идеи и подходы?
Одновременно с этим за последние годы в университетах стало намного больше практиков. Если раньше российские вузовские программы активно критиковали за то, что они оторваны от реальности, то сегодня так про IT-образование сказать уже нельзя. 10 лет назад в университетах почти не было преподавателей с реальным опытом работы в индустрии. Сейчас все чаще на профильной кафедре занятия ведут не штатные преподаватели по компьютерным наукам, а практикующие IT-специалисты, которые читают только 1-2 курса в свободное от основной работы время. Такой подход оправдывает себя с точки зрения качественной подготовки кадров, актуализации курсов и, конечно же, поиска потенциальных сотрудников в компании. Не думаю, что раскрою секрет, сказав, что мы поддерживаем базовую кафедру в МФТИ и выстраиваем отношения с другими вузами в том числе для того, чтобы подготовить студентов, которые могли бы начать свою карьеру в Acronis.
Холивары, которые раньше разворачивались вокруг языков программирования, перешли в философское русло. Теперь друг с другом спорят условные “программисты” и “математики”. В принципе, эти школы могли бы выделиться в две образовательные программы, но индустрия все еще плохо разделяет такие тонкости, и от вуза к вузу мы имеем похожее образование с немного разным уклоном. А значит, что и студенту, и компании, в которой он будет дальше работать, придется дополнять пазл знаний недостающими кусочками.
Появление в вузах практиков, которые пишут промышленный код на разных языках дает студентам более качественный навык разработки. Будучи хорошо знакомыми с имплементациями стандартных библиотек, фреймворками и приемами программирования, программисты-практики воспитывают в студентах стремление писать хороший код, делать это быстро и качественно.
Этот полезный навык, тем не менее, иногда приводит к появлению любителей изобретать велосипед. Студенты-программисты думают так: “что мне стоит написать еще 200 строчек хорошего кода, который в лоб решит поставленную задачу?”.
Получившие классическое математическое образование преподаватели (например, матфак или прикладная математика), чаще работают в околонаучной среде, или в области моделирования и анализа данных. “Математики” иначе видят проблемы в сфере Computer Science. Они в первую очередь оперируют не кодом, а алгоритмами, теоремами, формальными моделями. Важный плюс математического подхода — четкое принципиальное понимание того, что можно и что нельзя решить. И как это решать.
Соответственно, педагоги-математики рассказывают о программировании с уклоном в сторону теории. Студенты, которые приходят “от математиков”, чаще предлагают хорошо продуманные и теоретически более совершенные решения, но, как правило, неоптимальные с точки зрения языка и, зачастую, просто неаккуратно написанные. Такой студент считает, что его основная цель — продемонстрировать умение решать подобные задачи в принципе. А вот реализация может хромать.
Ребята, которых в школе или на первых курсах воспитывали программисты, приносят с собой “очень красивый велосипед”, который, тем не менее, обычно работает не слишком эффективно асимптотически. Они, напротив, не ставят перед собой задачи глубоко теоретизировать и обращаться к учебникам в поисках оптимальных решений, отдавая предпочтение красивому коду.
В разных вузах на собеседованиях студентов я обычно вижу, какая “школа” лежит в основе его образования. И я почти не сталкивался с идеальным балансом в базовом образовании. В детстве в моем городе можно было готовиться к олимпиадной математике, но кружков по программированию не было. Теперь же в кружках дети учатся программировать на “модных” Go и Python. Поэтому уже на уровне поступления в вузы есть расхождения в подходах. Я считаю, что в университете важно поддерживать оба навыка, иначе в компанию придет работать либо специалист с недостаточной теоретической базой, либо человек, не научившийся и не желающий писать хороший код.
Понятно, что в таких условиях студент просто выбирает то, что ему больше нравится. Преподаватель же просто транслирует точку зрения, которая ему ближе. Но все выиграют, если и код будет написан красиво, и с точки зрения алгоритмов все будет четко, обоснованно и эффективно.
Углубить свои знания в теории можно, обратившись к специализированной литературе и онлайн-курсам. Подтянуть умение обращаться с языками программирования можно на Coursera, Udacity или Stepik, где представлено очень много разных курсов. Также студенты часто начинают смотреть хардкорные курсы по языкам, если чувствуют, что преподаватель по алгоритмам хорошо знает математику, но не может ответить на сложные вопросы в области реализации. Не все со мной согласятся, но в моей практике хорошо себя зарекомендовала специализация по C++ от Яндекса, на которой последовательно разбираются все более сложные фишки языка. В целом, выбирайте курс с высокими оценками, от авторитетных компаний или вузов.
Приходя из вуза на работу в любую компанию, от стартапа до большой корпорации, студенты даже топовых университетов оказываются плохо адаптированы к реальной рабочей среде. Дело в том, что сегодня вузы много “нянчатся” со студентами. Даже пропустив массу занятий, не подготовившись вовремя к контрольным и зачетам, проспав, опоздав на экзамен, каждый может сдать и еще раз пересдать — и в итоге все равно получить диплом.
Тем не менее, сегодня есть все условия для того, чтобы студентов готовили ко взрослой жизни и самостоятельной профессиональной деятельности. Им придется не только программировать, но и коммуницировать. И этому тоже нужно обучать. В вузах существуют различные форматы прокачки этих навыков, но, увы, часто им не уделяется достаточного внимания. Тем не менее, у нас в арсенале есть множество возможностей получить навыки эффективной работы в команде.
Одним из поводов к написанию этого поста стала статья, опубликованная на сайте ТюмГУ. Автор статьи фокусируется только на недостатках российских студентов, замеченных иностранными преподавателями. Практика моего преподавания в разных вузах говорит о том, что российское школьное и высшее образование дает хорошую базу. Российские студенты подкованы в математике и алгоритмах, с ними проще выстраивать профессиональную коммуникацию.
В случае с зарубежными студентам, напротив, ожидания российского преподавателя иногда могут оказаться завышенными. Например, на уровне базовой подготовки по уровню математики встреченные мною индийские студенты похожи на российских. Однако им иногда не хватает специальных знаний на выходе из бакалавриата. Хорошие европейские студенты скорее будут иметь менее сильную математическую подготовку на школьном уровне.
И если вы учитесь или работаете в вузе, можно уже сейчас выстраивать работу над коммуникативными навыками (своими или студентов), расширять фундаментальную базу и практиковаться в программировании. Для этого в системе российского образования предусмотрены все возможности — нужно только правильно ими воспользоваться.
Я буду рад, если в комментариях к посту вы поделитесь своими ссылками на курсы и методы, которые помогают выровнять баланс в образовании, а также другими способами прокачать soft skills во время учебы в вузе.
Последние 10 лет я преподаю математику, алгоритмы, языки программирования и машинное обучение в различных вузах. Сегодня помимо своей должности в Acronis я также являюсь заместителем заведующего кафедрой теоретической и прикладной информатики в МФТИ. Из опыта работы в хороших российских (и не только) университетах я вынес некоторые наблюдения о подготовке студентов по компьютерным дисциплинам.
Правило 30 секунд больше не работает
Я уверен, что вы сталкивались с правилом 30 секунд, которое гласит, что программист должен понять назначение функции после беглого взгляда на ее код. Его придумали давно, с тех пор появилось множество операционных систем, языков, железа и алгоритмов. Я пишу код уже 12 лет, но относительно недавно я видел исходники одного продукта, которые и на первый взгляд показались мне магическими заклинаниями. Сегодня если вы не погружены в предметную область, то правило 30 секунд перестает работать. В противном случае вам не хватит не только 30, но и 300 секунд, чтобы разобраться, что к чему.
Например, если вам хочется писать драйверы, нужно будет нырнуть в эту сферу, прочитать тысячи строк специфичного кода. При таком подходе к изучению предмета у специалиста появляется “чувство flow”. Как в рэпе, когда ощущение хорошей рифмы и правильного ритма появляется без специальной рационализации. Так же и хорошо подготовленный программист может легко узнать неэффективный или просто плохой код, не вдаваясь в детальное изучение того, где произошло нарушение стиля или был использован неоптимальный подход (а вот объяснить это ощущение бывает весьма сложно).
Специализация и растущая сложность приводят к тому, что образование бакалавра уже не дает возможности изучить все направления достаточно глубоко. Но как раз на этом уровне образования нужно приобретать кругозор. Уже после, в магистратуре или на работе, нужно будет потратить некоторое время на погружение в проблематику и специфику предметной области, изучить сленг, языки программирования и код коллег, почитать статьи и книги. Мне кажется, только так с помощью университета можно “накачать перекладину” для будущих T-shaped специалистов.
Какой язык программирования лучше преподавать в университете?
К моей радости преподаватели университетов уже отказались от поиска правильного ответа на вопрос: “На чем лучше программировать?”. Споры, что лучше — C# или Java, Delphi или С++ — фактически сошли на нет. Появление множества новых языков программирования и накопление педагогического опыта привели к тому, что в академической среде устоялось понимание: для каждого языка есть своя ниша.
Проблема преподавания с использованием того или иного языка программирования перестала быть первоочередной. Не важно, на каком языке ведется курс. Главное — достаточная выразительность языка. Книга “The Art of Multiprocessor Programming” — хорошая иллюстрация этого наблюдения. В этом уже ставшем классическим издании все примеры приведены на Java — языке без указателей, но с Garbage Collector. Вряд ли кто-нибудь будет спорить, что Java далека от оптимального выбора при написании высокопроизводительного параллельного кода. Но для объяснения концептов, изложенных в книге, язык оказался подходящим. Другой пример — классический курс машинного обучения Эндрю Ына, преподаваемый на языке Matlab в среде Octave. Сегодня можно было бы выбрать другой язык программирования, но какая, в сущности, разница, если важны идеи и подходы?
Практичнее и ближе к реальности
Одновременно с этим за последние годы в университетах стало намного больше практиков. Если раньше российские вузовские программы активно критиковали за то, что они оторваны от реальности, то сегодня так про IT-образование сказать уже нельзя. 10 лет назад в университетах почти не было преподавателей с реальным опытом работы в индустрии. Сейчас все чаще на профильной кафедре занятия ведут не штатные преподаватели по компьютерным наукам, а практикующие IT-специалисты, которые читают только 1-2 курса в свободное от основной работы время. Такой подход оправдывает себя с точки зрения качественной подготовки кадров, актуализации курсов и, конечно же, поиска потенциальных сотрудников в компании. Не думаю, что раскрою секрет, сказав, что мы поддерживаем базовую кафедру в МФТИ и выстраиваем отношения с другими вузами в том числе для того, чтобы подготовить студентов, которые могли бы начать свою карьеру в Acronis.
Математик или программист?
Холивары, которые раньше разворачивались вокруг языков программирования, перешли в философское русло. Теперь друг с другом спорят условные “программисты” и “математики”. В принципе, эти школы могли бы выделиться в две образовательные программы, но индустрия все еще плохо разделяет такие тонкости, и от вуза к вузу мы имеем похожее образование с немного разным уклоном. А значит, что и студенту, и компании, в которой он будет дальше работать, придется дополнять пазл знаний недостающими кусочками.
Появление в вузах практиков, которые пишут промышленный код на разных языках дает студентам более качественный навык разработки. Будучи хорошо знакомыми с имплементациями стандартных библиотек, фреймворками и приемами программирования, программисты-практики воспитывают в студентах стремление писать хороший код, делать это быстро и качественно.
Этот полезный навык, тем не менее, иногда приводит к появлению любителей изобретать велосипед. Студенты-программисты думают так: “что мне стоит написать еще 200 строчек хорошего кода, который в лоб решит поставленную задачу?”.
Получившие классическое математическое образование преподаватели (например, матфак или прикладная математика), чаще работают в околонаучной среде, или в области моделирования и анализа данных. “Математики” иначе видят проблемы в сфере Computer Science. Они в первую очередь оперируют не кодом, а алгоритмами, теоремами, формальными моделями. Важный плюс математического подхода — четкое принципиальное понимание того, что можно и что нельзя решить. И как это решать.
Соответственно, педагоги-математики рассказывают о программировании с уклоном в сторону теории. Студенты, которые приходят “от математиков”, чаще предлагают хорошо продуманные и теоретически более совершенные решения, но, как правило, неоптимальные с точки зрения языка и, зачастую, просто неаккуратно написанные. Такой студент считает, что его основная цель — продемонстрировать умение решать подобные задачи в принципе. А вот реализация может хромать.
Ребята, которых в школе или на первых курсах воспитывали программисты, приносят с собой “очень красивый велосипед”, который, тем не менее, обычно работает не слишком эффективно асимптотически. Они, напротив, не ставят перед собой задачи глубоко теоретизировать и обращаться к учебникам в поисках оптимальных решений, отдавая предпочтение красивому коду.
В разных вузах на собеседованиях студентов я обычно вижу, какая “школа” лежит в основе его образования. И я почти не сталкивался с идеальным балансом в базовом образовании. В детстве в моем городе можно было готовиться к олимпиадной математике, но кружков по программированию не было. Теперь же в кружках дети учатся программировать на “модных” Go и Python. Поэтому уже на уровне поступления в вузы есть расхождения в подходах. Я считаю, что в университете важно поддерживать оба навыка, иначе в компанию придет работать либо специалист с недостаточной теоретической базой, либо человек, не научившийся и не желающий писать хороший код.
Как все-таки “накачать перекладину” для будущих T-shaped специалистов?
Понятно, что в таких условиях студент просто выбирает то, что ему больше нравится. Преподаватель же просто транслирует точку зрения, которая ему ближе. Но все выиграют, если и код будет написан красиво, и с точки зрения алгоритмов все будет четко, обоснованно и эффективно.
- ИТ-кругозор. Выпускник бакалавриата в области Computer Science — это уже готовый специалист с развитым техническим кругозором, который, вероятно, выбрал свой профиль. Но на младших курсах мы не знаем, чем он или она займется. Может пойти в науку или аналитику, а может, наоборот, писать огромное количество кода каждый день. Следовательно, студенту нужно показать все аспекты работы в IT-сфере, познакомить со всеми инструментами. Идеально, если преподаватели с теоретических курсов будут показывать связь с практикой (и наоборот).
- Точка роста. Не допускать скатывания в крайности — в интересах самого студента. Понять, кто вы — “математик” или “программист” — не сложно. Достаточно прислушаться к первому порыву при решении задачи: что вам хочется сделать — заглянуть в учебник в поисках оптимального подхода или написать пару функций, которые потом точно пригодятся? Исходя из этого можно строить дальнейшую комплементарную траекторию своего обучения.
- Альтернативные источники знаний. Бывает так, что программа хорошо сбалансирована, но “Системное программирование” и “Алгоритмы” ведут совершенно непохожие люди, и одним студентам ближе первый преподаватель, а другим — второй. Но даже если вам не нравится профессор, это не повод забивать на одни предметы в пользу других. Сами бакалавры заинтересованы в том, чтобы найти в себе волю работать с источниками знаний и ни в коем случае не доверять радикальным мнениям, таким как “математика — царица наук, главное — знать алгоритмы” или “хороший код компенсирует все остальное”.
Углубить свои знания в теории можно, обратившись к специализированной литературе и онлайн-курсам. Подтянуть умение обращаться с языками программирования можно на Coursera, Udacity или Stepik, где представлено очень много разных курсов. Также студенты часто начинают смотреть хардкорные курсы по языкам, если чувствуют, что преподаватель по алгоритмам хорошо знает математику, но не может ответить на сложные вопросы в области реализации. Не все со мной согласятся, но в моей практике хорошо себя зарекомендовала специализация по C++ от Яндекса, на которой последовательно разбираются все более сложные фишки языка. В целом, выбирайте курс с высокими оценками, от авторитетных компаний или вузов.
Soft skills
Приходя из вуза на работу в любую компанию, от стартапа до большой корпорации, студенты даже топовых университетов оказываются плохо адаптированы к реальной рабочей среде. Дело в том, что сегодня вузы много “нянчатся” со студентами. Даже пропустив массу занятий, не подготовившись вовремя к контрольным и зачетам, проспав, опоздав на экзамен, каждый может сдать и еще раз пересдать — и в итоге все равно получить диплом.
Тем не менее, сегодня есть все условия для того, чтобы студентов готовили ко взрослой жизни и самостоятельной профессиональной деятельности. Им придется не только программировать, но и коммуницировать. И этому тоже нужно обучать. В вузах существуют различные форматы прокачки этих навыков, но, увы, часто им не уделяется достаточного внимания. Тем не менее, у нас в арсенале есть множество возможностей получить навыки эффективной работы в команде.
- Письменная деловая коммуникация. К сожалению, большинство специалистов на выходе из вуза не имеют понятия об этикете переписки. Специфика общения в мессенджерах в обмене сообщениями ночью и днем и использовании разговорного стиля и неформальной лексики. Однако тренировать письменную речь можно было бы при общении студента с кафедрой и университетом.
На практике менеджеры часто сталкиваются с тем, что нужно провести декомпозицию большого проекта на мелкие задачи. Для этого нужно хорошо описать каждую задачу и ее составляющие, чтобы младшие разработчики поняли, что от них требуется. Плохо поставленная задача часто приводит к необходимости что-то переделывать, и поэтому опыт в письменной коммуникации помогает выпускникам работать в распределенных командах. - Письменная презентация результатов своей работы. Для презентации своих учебных проектов студенты старших курсов могут писать посты на Хабр, научные статьи, а также просто отчеты. Для этого есть много возможностей — уже со второго курса в некоторых вузах начинаются курсовые работы. Также можно использовать эссе как форму контроля — обычно они по форме ближе к публицистической статье. Такой подход уже реализован в НИУ ВШЭ.
Если компания практикует гибкий подход в разработке, представлять результаты своего труда приходится более мелкими порциями, но зато чаще. Для этого важно уметь кратко доносить результат работы одного специалиста или всей команды. Также во многих компаниях сегодня проводятся “ревью” — ежегодные или полугодовые. Сотрудники обсуждают результаты и перспективы работы. Успешное ревью является главной причиной карьерного роста, премий, например, в Microsoft, Acronis или Яндексе. Да, вы можете хорошо программировать, но “сидя в углу” даже крутой специалист всегда проиграет тому, кто умеет хорошо презентовать свой успех. - Academic Writing. Отдельно стоит выделить academic writing. Студентам полезно познакомиться с правилами написания научных текстов, использования аргументов, поиска информации в различных источниках и оформления ссылок на эти источники. Желательно делать это на английском языке, так как в международном академическом сообществе гораздо больше хороших текстов, а для различных дисциплин уже есть устоявшиеся шаблоны представления научных результатов. Конечно, навыки академического письма нужны и при подготовке русскоязычных публикаций, но примеров хороших современных статей на английском намного больше. Получить эти навыки можно в рамках соответствующего курса, который сейчас входит во многие образовательные программы.
- Ведение встреч. Большинство студентов не умеет готовиться ко встречам, вести протокол и обрабатывать данные. Но если развивать этот навык в вузе, например, участвуя в коллективных проектах, мы сможем избежать пустой траты времени на рабочем месте. Для этого нужен контроль над проектной работой студентов, чтобы научить их эффективно проводить встречи. На практике это стоит каждой корпорации кучу денег — ведь если сразу несколько человек, получающих большую зарплату, проводят час рабочего времени на митинге, хочется, чтобы от него была соответствующая отдача.
- Публичное выступление. Многие студенты сталкиваются с необходимостью выступить публично только на защите дипломной работы. И далеко не все оказываются готовы к этому. Я видел много студентов, которые:
- стоят спиной к слушателям,
- раскачиваются, пытаясь ввести комиссию к транс,
- ломают ручки, карандаши и указки,
- ходят кругами,
- смотрят в пол.
Это нормально, когда человек выступает впервые. Но с этим стрессом нужно начинать работать раньше — с защиты курсовых работ в дружественной атмосфере, среди однокурсников.
К тому же стандартная практика в корпорациях — дать возможность сотруднику предложить идею, получить на нее финансирование, позицию или выделенный проект. Но, если задуматься — это такая же защита курсовой работы, просто на более высоком уровне. Почему же не тренировать такие полезные карьерные навыки во время учебы?
Что я упустил?
Одним из поводов к написанию этого поста стала статья, опубликованная на сайте ТюмГУ. Автор статьи фокусируется только на недостатках российских студентов, замеченных иностранными преподавателями. Практика моего преподавания в разных вузах говорит о том, что российское школьное и высшее образование дает хорошую базу. Российские студенты подкованы в математике и алгоритмах, с ними проще выстраивать профессиональную коммуникацию.
В случае с зарубежными студентам, напротив, ожидания российского преподавателя иногда могут оказаться завышенными. Например, на уровне базовой подготовки по уровню математики встреченные мною индийские студенты похожи на российских. Однако им иногда не хватает специальных знаний на выходе из бакалавриата. Хорошие европейские студенты скорее будут иметь менее сильную математическую подготовку на школьном уровне.
И если вы учитесь или работаете в вузе, можно уже сейчас выстраивать работу над коммуникативными навыками (своими или студентов), расширять фундаментальную базу и практиковаться в программировании. Для этого в системе российского образования предусмотрены все возможности — нужно только правильно ими воспользоваться.
Я буду рад, если в комментариях к посту вы поделитесь своими ссылками на курсы и методы, которые помогают выровнять баланс в образовании, а также другими способами прокачать soft skills во время учебы в вузе.