Русский
Русский
English
Статистика
Реклама

Блог компании образовательные проекты jetbrains

Из студентов в преподаватели интервью с выпускниками магистерской программы JetBrains ИТМО. Часть 2

01.03.2021 18:19:29 | Автор: admin
Продолжаем знакомить вас с выпускниками магистратуры JetBrains и ИТМО Разработка программного обеспечения, которые по завершении обучения пополнили преподавательский состав программы. Во второй части интервью ребята рассказывают подробнее о своих задачах, подходах к преподаванию и дают советы абитуриентам. Первая часть интервью.



Есть ли что-нибудь, что вас раздражает в работе преподавателя?

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

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

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

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

Влад К.: Меня по-настоящему раздражает выкладывать файлики на вики. Да, очень. Любая опечатка или неточность, которую надо поправить, и понеслось правишь TeX, компилируешь, скачиваешь, находишь нужный файл на вики (самое сложное!) и кидаешь туда новую версию. Наверно, это можно как-то автоматизировать, но у нас такого курса не было!

Рома: Пожалуй, отчетность была самым раздражающим фактором. Заполнение табличек редко приносит радость. Еще мне тяжело давалось составление задач, это было для меня своеобразным творческим стрессом.

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

Не нравятся студенты, которые не стараются (по моим субъективным ощущениям). Это не вызывает раздражения, скорее просто отбивает охоту с ними взаимодействовать. Не стараться значит не проявлять активность на занятиях, не сдавать задачи или сдавать в последний момент, делать абы как, не исправлять замечаний.

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

А что радует и мотивирует больше всего?

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

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

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

Влад К.: Как и любого человека, которому нравится то, о чем он рассказывает, меня радует, когда кто-нибудь из студентов говорит, что решение задачи красивое.

Расскажите, как именно вы участвуете в преподавании?

Влад Т.: Я проверяю работы на нескольких практических курсах и веду практику на курсе Software Engineering. Раньше я участвовал в собеседованиях приемной комиссии и в оценке научно-исследовательских работ.

Дима Х.: Третий год я веду практические занятия и проверяю домашние задания по функциональному программированию и математической логике. В прошлом году вел практики по курсу Unix и скриптовые языки, но оказалось, что мне больше по душе связанная с языками программирования эзотерика. С текущего весеннего семестра провожу практики по формальным языкам.

Дима Н.: Веду семинары и проверяю домашние задания в курсе по программированию на Java и других JVM-языках.

Леша: Основная моя деятельность в магистратуре лекции и практики по Python, практики по Java и домашние задания по Software Engineering. Еще я периодически читаю аналогичные курсы, но на других, обычно непрофильных программах.

Артем: Помогаю с курсом по С++, который преподается у ребят в магистратуре и CS центре. В основном я занимаюсь всем, что связано с домашними заданиями (проверка, помощь в подготовке условий, автотесты). У нас на курсе процесс проверки решения состоит из двух этапов: автоматические тесты и код-ревью. Студенты далеко не с первого раза успешно проходят второй этап. Преподаватель оставляет комментарии, задает вопросы, а студенты должны исправить решения. Таким образом происходит непрерывный диалог, что, на мой взгляд, очень круто!

Саша: Проверяю у ребят домашние задания по Python. Но если мне наконец предложат прочитать курс лекций по Haskell, я с радостью переключусь на эту деятельность.

Влад К.: Я принимаю участие в проведении двух курсов Алгоритмы и структуры данных и Дискретная математика. И там и там веду практические занятия и проверяю домашние задания. Дополнительно я отвечаю за информационное взаимодействие со студентами и стараюсь отвечать на все возникающие вопросы.

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

Рома: Два учебных года я вел практические занятия на курсе по C++. В мои обязанности входила подготовка материалов для семинаров, их проведение, работа со студентами, проверка заданий, помощь в проведении экзамена. Практически все время я работал в паре с еще одним коллегой, поэтому составлением и проверкой задач я занимался не в одиночку.

Сколько времени в неделю у тебя уходит на преподавание?

Влад Т.: Сейчас где-то 5 часов. Вероятно, будет больше.

Дима Н.: Полтора часа непосредственно на пару, часов пять-восемь на проверки, еще пара часов на подготовку к занятиям.

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

Саша: На проверку домашек у половины группы уходит примерно один рабочий день.

Осенний семестр в магистратуре проходил полностью онлайн. Как вы относитесь к этому формату?

Влад Т.: Вполне хорошо. На мой взгляд, это очень подходящий формат для IT-программ. Возможно, даже более подходящий, чем очное обучение.

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

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

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

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

Влад Т.: Заранее оценить свои силы, не бояться нового и быть готовыми погрузиться в учебу с первых дней. Ну и удачи!

Дима Х.: Откладывайте работу и все свои дела. Если не можете себе этого позволить, то поступайте не сейчас, а тогда, когда сможете. Интенсивность обучения здесь требует полного погружения в процесс.

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

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

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

Саша: Я бы посоветовал четко решить для себя, готовы ли вы еще два года целиком и полностью посвятить учебе. Если ответ положительный клево, ждем вас на собеседованиях! Если отрицательный, тоже хорошо: в ближайшие пару лет проблем со сном по причине горящих дедлайнов по домашкам у вас не предвидится. :)

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

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

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

Ну и дерзкий совет: не планируйте поступать просто берите и поступайте!
Подробнее..

Научное программирование в МФТИ

13.05.2021 16:14:30 | Автор: admin

Привет, это Александр Нозик, и этот пост посвящен еще одной "интересной" магистерской программе (на этот раз на физтехе, совместно с JetBrains, Таврида Электрик и целым списком научных организаций). Про интересность вы решите сами, но программа в этот раз действительно уникальная (пока по крайней мере). Называется она Научное программирование (официальное название "Разработка и применение программного обеспечения в физических исследованиях") и расположена на ФПМИ и ЛФИ в МФТИ. Посвящена не отдельно физике, не отдельно программированию, не отдельно computer science, а стыку всего этого.

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

Если нет, то читаем дальше.

Зачем это?

Комната в CERN, где был изобретен интернетКомната в CERN, где был изобретен интернет

Дело в том, что все аспекты нашей современной жизни так или иначе связаны с компьютерами и программированием, наука и инженерия не исключение. Ученые и инженеры существенную часть своего рабочего времени посвящают работе с компьютерами. Если мы говорим про науку, то все начинается со стадии проектирования эксперимента. Мы делаем большие объемы математического моделирования, чтобы понять, что вообще можно измерить и как это лучше сделать. В конце концов, мы не можем работать методом тыка. Современные эксперименты очень дороги, и делать их, не зная заранее, что там можно измерить, очень невыгодно. Дальше нам надо собрать данные, для этого используются разнообразные автоматизированные системы управления. Эти данные нужно хранить (а данных может быть очень много, петабайты). К данным нужно обеспечить удобный доступ, организовать резервное хранение, сервисы по индексации и визуализации. В конце концов данные нужно обработать. А тут уже нужно задействовать весь арсенал современных компьютерных методов работы с данными от параллельных и распределенных вычислений до машинного обучения.

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

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

Как это?

Как вы, наверное, уже догадались, тут как раз и включается наша магистерская программа. Она организована на стыке областей, и наша цель научить физиков (и вообще "предметников") программировать, а программистов понимать предметную область. Разумеется, невозможно знать все одинаково хорошо. Но тем не менее мы и наши партнеры верим в то, что в будущем профессия физик-программист (или химик-программист, или биолог-программист), то есть тот, кто не просто может написать скрипт на Python, а умеет создавать и поддерживать прикладное программное обеспечение в предметной области, будет весьма востребована.

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

  • Вычислительные методы

  • Анализ данных

  • Научная этика

  • Научный семинар

Остальные предметы выбираются студентом совместно с научным руководителем. Научный руководитель в нашей программе играет ключевую роль, потому что мы пытаемся охватить очень широкую область со множеством узких специализаций, и именно научный руководитель (и компания или институт, стоящие за ним) являются "направляющей", по которой студент будет двигаться. По этой причине руководителя нужно выбрать заранее и убедиться в том, что он (или она) вам подходит и вы подходите ему (или ей). В качестве бонуса от такой процедуры вы можете получить гарантированное поступление в магистратуру МФТИ. Наши промышленные партнеры (JetBrains и Таврида Электрик) готовы оплатить обучение для ограниченного количества студентов, которые прошли собеседования с руководителями, но по какой-то причине не прошли по конкурсу.

Направления работы

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

Математическое моделирование в физике частиц

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

Максим Долгоносов из ИКИ РАН и ВШЭ представляет широкое направление, связанное с моделированием космических детекторов и высокоэнергетических процессов в атмосфере (с заходом в физику плазмы). Над этой проблемой сейчас также работает очень активная группа в МФТИ под руководством Егора Стадничука и Екатерины Свечниковой из ИПФ РАН.

Художественное видение реакторной модели возникновения наземных гамма-всплесков. Автор: Екатерина СвечниковаХудожественное видение реакторной модели возникновения наземных гамма-всплесков. Автор: Екатерина Свечникова

Игорь Анатольевич Пшеничнов из ИЯИ РАН является ведущим мировым специалистом по фотоядерным реакциям, физике ядер-спектаторов и моделированию на платформе Geant4 как для экспериментов в физике частиц, так и для прикладных исследований, например медицинской физики. Ученики Игоря Анатольевича работают в МФТИ.

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

В лаборатории Nuclear Physics Methods JetBrains Research мы Александр Нозик и Roland Grinis также занимаемся разработкой новых экспериментальных инструментов для моделирования процессов (в основном на Kotlin и с использованием разных новых технологий.

Моделирование на сетках

Айно Константиновна Скасырская является уникальным специалистом по сеточным расчетам разного рода (гидродинамика, термодинамика, расчет механических напряжений, электромагнитные поля). Для таких расчетов нужно не только хорошо разбираться в решении дифференциальных уравнений на сетках, но и владеть современными коммерческими пакетами, такими как ANSYS и COMSOL. Ученики Айно Константиновны чрезвычайно востребованы в промышленности.

Анализ данных в астрофизике и физике космических лучей

На данный момент этой задачей занимаются сразу две не связанные между собой группы, сотрудничающие с нашей магистерской программой: Олег Евгеньевич Калашев из ИЯИ РАН и Дмитрий Костюнин из DESY (Германия). Обе группы занимаются анализом данных с крупных международных экспериментов, таких как Telescope Array, Tunka-rex и HESS, с использованием современных компьютерных методов, включая машинное обучение.

Иллюстрация из сборника "Физики шутят"Иллюстрация из сборника "Физики шутят"

Программное обеспечение для крупных проектов

Лев Шагалов курирует широкий спектр задач от крупной коммерческой компании Таврида Электрик одного из наших основных партнеров. Среди этих задач есть как разработка высоконагруженных распределенных систем последнего поколения для управления электросетями, так и разработка и внедрение "умных" алгоритмов в энергетической отрасли.

Константин Герценбергер является главой группы программного обеспечения в эксперименте BM@N на коллайдере NICA и занимается разработкой и поддержкой всех программных систем эксперимента. Петр Климай в рамках этой же коллаборации занимается системами хранения, индексации и визуализации больших объемов данных.

Игорь Хохряков входит в коллаборацию TANGO-controls и вместе со мной занимается разработкой распределенных гетерогенных систем сбора данных нового поколения и системами визуализации для них (кому интересно, пойдите посмотрите тут и тут.

Разработка инструментов для научных вычислений

Ильмир Усманов из JetBrains (отделение в Мюнхене) входит в команду Kotlin language research и занимается проектированием и оптимизацией элементов компилятора Kotlin, нужных в том числе для высокопроизводительных вычислений.

Roland Grinis в плотном сотрудничестве с лабораториями JetBrains Research и Kotlin scientific community занимается разработкой и интеграцией инструментов для высокопроизводительных тензорных вычислений и их использованием для реализации прикладного моделирования.

Еще?

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

Демонстрация библиотеки VisionForge. Визуализация трэков мюонов в подземном эксперименте Muon MonitorДемонстрация библиотеки VisionForge. Визуализация трэков мюонов в подземном эксперименте Muon Monitor

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

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

Как к нам попасть?

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

Более подробная и актуальная информация есть на сайте.

Задать вопросы и обсудить разные аспекты научного программирования можно в телеграм-группе нашей лаборатории

Подробнее..

В разработчики пойду, пусть меня научат. Бакалаврские программы при поддержке JetBrains

02.06.2021 14:09:29 | Автор: admin

JetBrains поддерживает образовательные программы для разработчиков в лучших университетах страны. Мы предоставляем экспертную и финансовую помощь разным направлениям в НИУ ВШЭ, Университете ИТМО, СПбГУ, МФТИ, НГУ и ЛЭТИ. Но несколько программ особенные, они реализуются в тесном партнерстве с компанией. JetBrains участвует в формировании учебного плана, подбирает преподавателей, выплачивает студентам спонсорские стипендии, помогает с организацией практик и стажировок.

В преддверии приемной кампании в вузы рассказываем о наших самых ближайших партнерах бакалаврских программах Современное программирование в СПбГУ и Прикладная математика и информатика в петербургском кампусе НИУ ВШЭ.

Занятие у Александра ХраброваЗанятие у Александра Храброва

Современное программирование появилось на рынке образования Петербурга в 2018 году. Прикладная математика и информатика формально открылась в Питерской Вышке также в 2018 году, но фактически переехала из Академического университета, где реализовывалась с 2014 года.

Программы имеют довольно много общего:

1. Тесное партнерство с индустрией

В реализации обеих программ принимают участие ведущие IT-компании. Учебные планы регулярно обновляются в соответствии с потребностями индустрии. Программистские курсы читают разработчики, а математические действующие ученые и заслуженные преподаватели: Денис Москвин, Александр Храбров, Даниил Березун, Богдан Бугаев и др.

2. Индивидуальный подход

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

3. Проектная деятельность

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

4. Обратная связь

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

5. Кураторы

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

6. Стипендии

JetBrains выплачивает студентам спонсорские стипендии до 15 тысяч рублей в месяц. Также с этого года будут введены дополнительные стипендии для студентов-участников школьных международных олимпиад IOI и IMO. Так, члены сборных получат по 10 тысяч рублей в месяц, а медалисты от 15 до 25 тысяч рублей в месяц в зависимости от уровня награды. Стипендия присуждается на два года первый и второй курсы университета.

Если обе программы такие классные, как же тогда выбрать, куда поступать? Расскажем про особенности каждой из программ.

Программа Современное программирование МКН СПбГУ

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

Вторая особенность программы тесное слияние с практикой разработки и живой наукой. Преподаватели МКН не только преподают, они работают в той области, о которой рассказывают и ставят студентам актуальные задачи на практических занятиях и в семестровых проектах. Прямо на факультете проходит много научных событий, в которых можно участвовать по желанию: семинары, встречи со специалистами, воркшопы и конференции. Студенты участвуют ассистентами в проведении олимпиад (ММО 2020 и 2021), на программах МКН в Сириусе (зимняя научная школа и майская проектная смена), и при желании смогут оказаться в самом центре Всемирного конгресса математиков 2022.

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

Программа СП делает акцент на преподавание различных языков и стилей программирования, что позволяет студентам свободно себя чувствовать в любой сфере ИТ и не бояться выйти за пределы традиционных подходов. В обязательных дисциплинах программы студенты изучают и используют такие языки программирования как Kotlin, Python, C/C++, Assembler, Haskell, Prolog, Go, а в рамках дисциплин по выбору также имеют возможность познакомиться с языками Java, Scala, C#, Rust, Javascript и PHP. Поближе познакомиться с учебным планом программы можно здесь.

Преподаватели: Александр Куликов, Виталий Брагилевский, Евгений Линский, Михаил Сенин и другие. Плейлист с представлениями всех курсов первого семестра от лекторов по ссылке.

Как поступить: Для абитуриентов доступны две траектории поступления:

  1. По ЕГЭ. Нужно сдать математику на 76 и более баллов, информатику на 75 и более, русский язык на 55 и более баллов. Учитываются индивидуальные достижения, подробнее о правилах приема: joinmkn.ru/rules.

  1. Без вступительных испытаний по результатам олимпиад: Всероссийской олимпиады школьников по математике, информатике, физике и астрономии, а также олимпиад РСОШ из списка, доступного по ссылке.

Количество мест: 30 бюджетных и 5 платных.

Где проходят занятия: Все пары проходят в центре Санкт-Петербурга на Васильевском острове. Общежитие квартирного типа (Дом студента) расположено там же, в двадцати минутах ходьбы.

Полезные ссылки:

Факультет математики и компьютерных наук СПбГУ объединяет три бакалаврские программы: кроме СП, это программа Математика, возникшая на базе исследовательской лаборатории им. П.Л. Чебышева, а также программа Науки о данных, поддерживаемая компанией Яндекс. Студенты разных направлений часто пересекаются за время учебы, помогая друг другу формировать широкий кругозор и изучать разные варианты карьеры.

Программа Прикладная математика и информатика в НИУ ВШЭ Санкт-Петербург

Особенности программы: Первый принцип подготовки на ПМИ обучение только той математике, которая ориентирована на практику. Современному программисту прежде всего необходимы прикладные навыки для дальнейшей карьеры. Если преподаватель математики не может объяснить, зачем тот или иной раздел его курса нужен программистам, то лучше его не читать.Второй принцип обучение программированию с первого курса, причем

не в теории, а на практике. В первый же год студенты проходят двухсеместровый курс по C++, семестровый курс по Python и Unix, большую часть полуторагодового курса по алгоритмам и структурам данным. Также с самого начала обучения студентов погружают в проектную деятельность. На первом курсе все работают над учебными проектами на С++, на втором пишут на Java или Kotlin. О некоторых проектах можно почитать в блоге факультета на Хабре: анализатор C++, приложение для визуализации аттракторов, гексагональные шахматы, футболка с контролем осанки.

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

Следующая особенность программы это специализации на старших курсах. Сейчас студенты могут выбрать одно из пяти направлений: машинное обучение, промышленное программирование, теоретическая информатика, теория языков программирования и биоинформатика. В каждой специализации есть обязательные дисциплины (например, для машинного обучения это Базы данных, Методы оптимизации, Численные методы, Deep learning, Обработка естественного языка, Анализ изображений и Глубокое обучение с подкреплением), но часть предметов студент выбирает самостоятельно или вместе с научным руководителем. Полный список дисциплин есть на странице.

Еще одна особенность, характерная для всей Высшей школы экономики майноры. Если кратко, это дополнительное направление обучения, которое не должно совпадать с мейджером основным направлением (в нашем случае, это прикладная математика и информатика). Майнор изучается на втором и третьем курсе бакалавриата, состоит из четырех последовательных дисциплин. Например, студенты могут изучать предпринимательство, UX-дизайн или бизнес-коммуникации. Со следующего года все майноры в Вышке станут общекампусными, т.е. студенты могут учиться у ведущих преподавателей из Москвы, Нижнего Новгорода или Перми. Многие майноры читаются на английском языке. Полный каталог майноров для 2020/2021 года.

И последняя, но одна из самых приятных особенностей: набор в Питерской Вышке больше, чем в СПбГУ, что делает программу более доступной для абитуриентов, поступающих по результатам ЕГЭ. Если же все бюджетные места займут абитуриенты с БВИ, Вышка традиционно добавляет 25% мест за счет собственных средств для поступающих по ЕГЭ.

Преподаватели: Александр Омельченко, Сергей Копелиович, Егор Суворов, Тимофей Брыксин, Алексей Шпильман, Иван Ямщиков и др.

Как поступить: Тут также две траектории поступления:

  1. По ЕГЭ. Нужно сдать математику и информатику на 75 и более баллов, русский язык не менее, чем на 60 баллов. Проходной балл в 2020 году 297 за три экзамена.

  2. Без вступительных испытаний по результатам олимпиад. Подробная информация о льготах, доступных олимпиадникам, есть на странице.

Количество мест: 60 бюджетных и 40 платных.

Где проходят занятия: Все занятия проходят в новом корпусе университета по адресу ул. Кантемировская, д.3А, в десяти минутах на транспорте от Петроградской. Студенческое общежитие расположено на улице Герасимовской, в получасе езды от корпуса университета.

Полезные ссылки:

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

Подробнее..

Полезные материалы для разработчика

19.03.2021 12:22:16 | Автор: admin

Существует много полезных инструментов, которые помогают автоматизировать рутинную работу и тем самым облегчить жизнь разработчика.

Выпускнику и преподавателю Computer Science Center, Равилю Галееву, пришла идея собрать такие инструменты и технологии в один курс и познакомить студентов с ними. За пример такого курса были взяты The Missing Semester of Your CS Education от MIT, Software Carpentry и cs50.

В этом посте мы собрали видеолекции курса Практический минимум и материалы к занятиям. Благодарим Равиля за подборку!

Содержание

Введение в Linux

Командная строка Linux

Система контроля версий git

Языки разметки и XML

Регулярные выражения

Взаимодействие с сетью

Протокол HTTP

Контейнеризация

Архитектура приложений

Тестирование приложений

Опасность в приложениях

Билд-системы

Кодировки, даты, локали

Дебаг

Набор в Computer Science Center 2021

Введение в Linux

  • Буквально пара слов о том, что такое ядро

  • Набор исторических фактов (от Unix к Linux)

  • Файловая система

  • Пользователи

  • Файлы

  • Процессы

  • Unix way

Слайды

Статьи

Wikipedia History of Unix

Книги

Видео

Курсы

Командная строка Linux

  • bash как REPL

  • Unix way

  • Шебанг

  • make

Слайды

Статьи

Книги

Ian Miell Learn Bash the Hard Way

Видео

Слайды/Презентации

Bash-скрипты из реального мира

Система контроля версий git

  • git

    • commit

    • branch

    • merge

  • git flow

  • github

Слайды

Статьи

Книги

  • Scott Chacon and Ben Straub Pro Git

Видео

Потренироваться

Языки разметки и XML

  • groff

  • LaTex

  • XML, JSON, YAML

  • Markdown, AsciiDoc

  • GraphViz, PlantUML

Слайды

Статьи

Книги

К. В. Воронцов LATEX в примерах

Видео

Слайды и другие материалы

Markdown cheatsheets

Разное

Регулярные выражения

  • Регулярки

  • grep

  • sed

  • awk

Слайды

Статьи

Видео

Слайды и другие материалы

Взаимодействие с сетью

  • Разбираемся как работает посылка пакетов

  • Рассматриваем простейшие утилиты работы с сетью

  • Знакомимся с DNS, CDN, VPN и другими словами на три буквы

  • Пишем сервер на сокетах

Слайды

Материалы

Протокол HTTP

  • HTTP

  • REST

Слайды

Статьи

Видео

Разное

Контейнеризация

  • chroot

  • Docker

  • Docker compose

Слайды

Статьи

Видео

Курсы

Разное

Архитектура приложений

  • ООП

  • Паттерны

  • Многослойная архитектура

Слайды

Статьи

Книги

Курсы

Видео

Тестирование приложений

  • Тестирование

  • Логгирование

Слайды 1

Слайды 2

Статьи

Видео

Опасность в приложениях

  • Хеширование, контрольные суммы

  • Авторизация vs Аутентификация; JWT

  • Обмен ключами Диффи-Хеллман

  • RSA

  • TLS

  • Двухфакторная аутентификация

Слайды

Статьи

Видео

Книги

Билд-системы

  • от make к TravisCI

  • dockerhub

Слайды

Статьи

Видео

Разное

Anatomy of a Continuous Integration and Delivery (CICD) Pipeline

Кодировки, даты, локали

Разбираемся, почему /dev/random печатает краказябры

Слайды

Статьи

Видео

Дебаг

  • Исключения

  • Дебаг

Слайды

Статьи

Книги

Видео

Курсы

Кирилл Кринкин Основы программирования для Linux

Разное


Делитесь в комментариях своими рекомендациями материалов, которые пригодились вам.

Набор в Computer Science Center 2021

Помимо лекций и материалов студентам CS центра на курсе доступны домашние задания. Если вы хотите проходить ещё больше курсов по разным направлениям, приходите поступать.

CS центр это вечерние курсы по математике и программированию. Занятия проходят в Санкт-Петербурге и в Новосибирске. Жители других городов могут поступить на обучение в удалённом формате.

Чтобы поступить:

заполните анкету на сайте до 10 апреля,

решите задания онлайн-теста до 11 апреля,

участвуйте в онлайн-экзамене в конце апреля-начале мая,

пройдите собеседование в мае-июне.

Для тех, кто успешно справится со вступительными испытаниями, занятия начнутся в сентябре. Будьте готовы тратить на учёбу хотя бы 15 часов в неделю в течение двух или трёх лет. Если вы увлечены компьютерными науками или программированием, хотите развиваться в этих областях, любите учиться, то осваивать курсы и работать над проектами будет интересно и полезно.

Задать вопросы про набор можно в телеграм канале или по почте info@compscicenter.ru.

Подробнее..

Computer Science Center открыл приём заявок на новый учебный год

24.03.2021 16:21:32 | Автор: admin

До 10 апреля продолжается набор на вечерние курсы по математике и программированию в CS центре. Computer Science Center это совместный проект Школы анализа данных Яндекса, JetBrains и Computer Science клуба при ПОМИ РАН. Курсы проходят очно в Санкт-Петербурге и Новосибирске, жители других городов могут заниматься дистанционно. Обучение в Computer Science Center бесплатное.

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

Большинство наших студентов учатся в вузах или работают, поэтому расписание составлено так, чтобы занятия можно было совмещать с основной деятельностью. Однако будьте осторожны: на учёбу в Computer Science Center придется тратить не менее 15 часов в неделю. Если у вас недостаточно времени (или мотивации), советуем начать с онлайн-курсов на платформе Stepik.

Длительность обучения два или три года по выбору студента. За это время нужно пройти не менее 12 курсов: часть из них обязательная, часть вы выбираете сами. Обязательные курсы зависят от направления обучения. Для поступающих в 2021 году будут открыты три направления (позже вы сможете выбрать одно из них или даже несколько сразу):

  • Computer Science,

  • Data Science,

  • Software Engineering.

Подробнее обо всех направлениях на сайте. Для выпуска студенты проходят три семестра практики или научно-исследовательской работы (примеры есть на этой странице).

Чтобы стать студентом или студенткой CS центра, нужно справиться с вступительными испытаниями:

  • заполните анкету на сайте до 10 апреля,

  • решите задания онлайн-теста до 11 апреля,

  • участвуйте в онлайн-экзамене в конце апреля-начале мая,

  • пройдите собеседование в мае-июне.

Для кандидатов, которые успешно прошли отбор, занятия начнутся в сентябре 2021 года.

Если вы еще не решили, стоит ли ввязываться в эту авантюру, посмотрите на отзывы выпускников:

Станислав Гордеев, разработчик игрового движка в People Can Fly (Варшава), выпускник 2018 года направления Software Engineering:

Когда-то давно, в сентябре 2014, будучи ещё студентом-физиком, я случайно наткнулся на хабро-статью про онлайн-курсы на Stepik, заинтересовался и прошёл курсы по C++ и алгоритмам, кроме того, узнал о CSC. На тот момент у меня помимо интереса появилась довольно амбициозная цель попасть в большой gamedev. Поступление оказалось совсем не лёгким и до последнего дня с письмом о зачислении я не верил, что всё получится. Моё обучение началось в 2016, и с тех пор я семимильными шагами приближался к своей цели. А все из-за неповторимой атмосферы знаний, амбиций, дружелюбия, которая не позволяет сидеть на месте, которая заставляет поверить в себя. Сейчас я с уверенностью могу сказать, что моя цель осуществилась в первую очередь благодаря CS центру, потому что это больше, чем просто курсы. Старайтесь, и у вас всё получится.

Анна Атаманова, разработчица в Яндексе, выпускница 2016 года направления Data Science:

Почему СS центр это дико круто:

курсы! (всё новое и интересное по основным направлением центра тут-тут-тут);

увлечённые своим делом преподаватели (таких людей в любом случае приятно слушать);

мотивированные, заинтересованные студенты (да у них можно узнать чуть ли не больше, чем на паре);

проекты! стажировки! (опыт, реальные задачи);

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

Артемий Пестрецов, разработчик в JetBrains, преподаватель CS центра, выпускник 2019 года направлений Data Science и Software Engineering:

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

Все отзывы можно посмотреть на этой странице.


Для тех, кто нашел в себе силы дочитать до этого места, бонус! Перед тестом вы можете потренироваться и порешать задачи прошлых лет. Но помните, что 10 апреля тренажёр превратится в тыкву, так что лучше не откладывать.

Ну и самое последнее: 31 марта состоится День открытых дверей для поступающих в CS центр. Кураторы подробно расскажут про направления и формат обучения и ответят на все ваши вопросы. Зарегистрироваться можно здесь.

Ждем будущих студентов Computer Science Center!

Подробнее..

PM-школа от CS центра итоги первого года в онлайне глазами выпускников

14.06.2021 20:18:14 | Автор: admin

Два года назад Computer Science Center провел экспериментальный запуск курса по управлению продуктами, о результатах которого мы рассказывали ранее. Эксперимент удался, и в 2020-21 учебном году прошла уже полноценная годовая программа повышения квалификации с поправкой на новые идеи и вынужденный онлайн-формат. Сегодня выпускники нашей программы поделились своими историями: почему они решили развиваться в продакт-менеджменте, как совмещали учебу и работу и с какими результатами вышли с курса.

До 20 июня открыт набор на третий поток обучения по направлению Product Management с преподавателями и наставниками из ведущих мировых IT-компаний. Подробнее о школе смотрите в записи Дня открытых дверей онлайн и на нашем сайте.

До и После: зачем вы изначально подавали заявку на конкурс и что получилось в результате?

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

Я дважды пытался запустить стартап и дважды спотыкался о собственную некомпетентность. Профессия Product Manager предполагает, что ты знаешь как из пункта А привести продукт в пункт Б. Когда я увидел, что на продакта будут учить в Computer Science Center, я сразу подал заявку: все мои знакомые, которые проходили курсы в CS центре, говорили о лучшем опыте обучения в своей жизни.

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

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

Я хотел изменить карьерную траекторию это очень значимое для меня решение. Раньше я работал в сфере ядерной энергетики: занимался как инженерными задачами, так и развитием бизнеса. Понимал, что хочу качественных изменений: новых знаний и практики для старта в IT. Обучение в школе по управлению продуктами от CS центра было для меня этой возможностью. С одной стороны, что-то близкое и знакомое (менеджмент, инженерия и бизнес-анализ), с другой новая сфера инженерии (цифровые продукты).

Результат сейчас обучение завершено. Закрыв одну дверь, я открыл две новые: Business Аnalysis и Product Management. Сейчас я работаю в IT-компании и двигаюсь по треку управляющего цифровыми проектами, потому что мне нужен базовый опыт. После перейду в управление продуктами. Рассчитываю совершить карьерный маневр в течение этого года.

Сначала был конкурс: первое впечатление от знакомства и советы бывалых будущим абитуриентам.

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

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

Самое сложное в отборе ответить на три довольно глобальных вопроса в двухминутном видео. Съемка этого видео заняла у меня пару часов: хотелось сделать что-то задорное, но информативное о себе и моем опыте. В итоге все получилось: благодаря видео я попала на собеседование, а после него и на курс. Если у вас совсем нет знаний о работе IT-продуктов, для подготовки к интервью рекомендую послушать лекции из Школы менеджеров Яндекса.

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

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

В процессе: как справлялись с учебной нагрузкой и какие изменения происходили с вами в течение учебного года?

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

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

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

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

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

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

Второй семестр был менее динамичным, однако тут настало время прохождения индивидуальной практики в компаниях. Мне повезло попасть к хорошему ментору Матвею Брыксину, Product Lead в Arrival. Нагрузка была умеренной, в этот раз я успевал делать задачки хорошо, а не в режиме стартапера, которому нужно было вчера. Работая для корпорации, я получил совершенно другой опыт. Мне было интересно заниматься реальной проблемой бизнеса.

Атмосфера на курсе: ощущения от взаимодействия с организаторами, преподавателями и друг другом.

Когда я рефлексирую на тему школы, то слово, которое приходит на ум это живой. Люди на курсе живые и очень разные, как преподаватели/кураторы, так и студенты. Благодаря этому в рамках курса создается очень благоприятная и дружелюбная атмосфера получения новых знаний. Все готовы делиться друг с другом опытом, информацией, фидбэком. Даже сама программа школы специально подстраивается под поток.

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

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

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

Что дальше: что вы будете делать с полученными знаниями, опытом и связями после выпуска?

Весь полученный багаж знаний и связей я буду максимально применять в карьерном росте. Искать возможность приложить свои знания на текущем месте работы. Стараться смотреть на принимаемые решения в компании новыми глазами. Думать, как я могу открывать свои проекты.

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

Знания, которые я получил в процессе обучения, помимо собственно понимания, какие процессы и фреймворки существуют в области создания продуктов, значительно расширили мой профессиональный и общий кругозор. Хоть я и не планирую в ближайшее время переходить на позицию продакт-менеджера, многое я смогу применить в роли Lead-engineer. Большая часть вопросов относительно ожиданий бизнеса и прогнозирования хода проекта стали разрешимы с меньшим объемом коммуникаций. Да и возможность видеть что-либо на большем уровне абстракции само по себе прекрасно и интересно.

Курс был однозначно полезен, и я рад, что смог дойти до конца и получить такие ценные знания!

Новые идеи для работы и жизни

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

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

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

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


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

Заявки принимаются до 20 июня на https://pmcsc.ru/ ;)

Подробнее..

Курсы Computer Science клуба теперь онлайн

12.10.2020 20:04:57 | Автор: admin
В связи с эпидемией COVID-19 курсы Computer Science клуба теперь проходят онлайн. В весеннем семестре мы успели провести два оффлайн-курса: Вероятностные алгоритмы (И. А. Михайлин, UCSD) и Классическая теория кодирования и новые приложения (В. Скачек, университет Тарту). Оба курса доступны в записи, а остальные курсы пришлось отменить.

Вместо отменённых курсов мы организовали несколько открытых онлайн-лекций:

  1. Генераторы случайных чисел: теория и практика (А. Шень, LIRMM, Монпелье)
  2. SANNS: Scaling Up Secure Approximate k-Nearest Neighbors Search (И. Разенштейн, Microsoft Research),
  3. Машинное обучение и приватность данных (И. Миронов, Facebook AI),
  4. Решётки и упаковки шаров (В. Клепцын, CNRS, Университет Ренна).

Теперь я расскажу о том, какие крутые курсы проходят в этом семестре.


В сентябре мы запустили два полноценных курса в клубе.

  1. Обзорный курс по теоретической информатике. Лекции читает Дмитрий Ицыксон (ПОМИ РАН), семинары ведёт Святослав Грязнов (ПОМИ РАН).
  2. Fine-grained complexity. Лекции читает Иван Михайлин (UCSD).

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

В октябре Константин Макарычев (Northwestern University) начал публиковать видеокурс Алгоритмы: дополнительные главы (примерно по программе своего курса для аспирантов, но на русском языке). Видео выкладываюся на сайте курса и на сайте клуба. В дополнение к видеолекциям проводятся семинары. Семинары ведут Александр Шень (LIRMM) и Илья Разенштейн (Microsoft Research). Курс организован так: видеолекции появляются в понедельник, а их обсуждение проходит в пятницу. Запись слушателей, рассылка новостей, публикация домашних заданий и отправка решений организованы через сайт клуба. В конце предполагается online экзамен для желающих.


Кроме того, мы планируем продолжать устраивать открытые лекции по на различные темы. В это воскресенье прошла открытая лекция Модели памяти языков программирования: проблемы, решения и направления развития от Антона Подкопаева (MPI-SWS, JetBrains Research, ВШЭ).


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

Жадные гипотезы в задаче о кратчайшей надстроке

18.12.2020 16:04:56 | Автор: admin
В задаче о надстроке по входному набору строк требуется найти кратчайшую строку, которая содержит каждую из них в качестве подстроки. Данная задача возникает в разных приложениях, например, в сборке генома или сжатии данных. Эта задача NP-трудная, поэтому рассчитывать на эффективный алгоритм поиска точного решения не приходится.

Максим Николаев аспирант ПОМИ РАН, преподаватель Computer Science Center и СПбГУ, учитель математики в лицее 533 в Санкт-Петербурге. В 2019 году он окончил CS центр по направлению Современная информатика. В статье ниже Максим рассказывает о своей исследовательской работе во время обучения по поиску приближенных решений задачи о надстроке.



Жадная гипотеза


Как и в других NP-трудных задачах, в задаче о надстроке представляют интерес и активно изучаются приближенные алгоритмы, которые достаточно быстро находят достаточно точное решение. Наилучший известный на сегодняшний день полиномиальный алгоритм находит надстроку не более, чем в $2\frac{11}{23}$ раза более длинную, чем точное решение.

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

Более подробно о задаче и возникающих в ней гипотезах можно узнать в замечательной открытой лекции CS центра. Далее будет изложена краткая выжимка из неё и описание моих результатов.

Иерархический граф и надстроки


В попытке подобраться к решению жадной гипотезы и к разработке более качественных приближенных алгоритмов группой Александра Куликова был разработан теоретико-графовый подход, который позволяет в удобной форме изучать структуру пересечений исходных строк друг с другом. Для этого вводится так называемый иерархический граф, в котором вершинами являются исходные строки и всевозможные их подстроки, а ориентированные ребра идут из префикса каждой строки в эту строку и из строки в ее суффикс. Под префиксом и суффиксом строки понимаются строки, которые получаются при выкидывании последней и первой её буквы соответственно. Вершины графа удобно расположить по уровням в зависимости от длины соответствующих строк, поэтому граф и называется иерархическим. На рисунке ниже показан иерархический граф для исходного набора строк {aaa, cae, aec, eee}, которые изображаются в прямоугольниках. Пустая строка обозначается через $\varepsilon$.


Где же здесь надстроки? Надстрокам в этом графе соответствуют циклы, проходящие через $\varepsilon$ и все исходные вершины. По каждому такому циклу можно восстановить надстроку, и наоборот. Например, на рисунке ниже отмечен цикл, соответствующей надстроке aaaecaeee. В этой надстроке исходные строки встречаются в порядке aaa $\rightarrow$ aec $\rightarrow$ cae $\rightarrow$ eee, и именно в таком порядке их обходит упомянутый цикл.


Нетрудно показать, что длина надстроки всегда равна количеству идущих вверх стрелок в соответствующем цикле (в примере их 9). Это значит, что задача поиска кратчайшей надстроки превращается в задачу поиска кратчайшего цикла в иерархическом графе.

Greedy Hierarchical Algorithm и Collapsing Algorithm


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

Первый из них, Greedy Hierarchical Algorithm (GHA), является, по-видимому, самым простым способом построить цикл, проходящий через исходные вершины и который бы мог претендовать на хорошее приближение точного решения. Как следует из названия, он является жадным и кратко может быть описан так: пройдем по уровням графа сверху вниз, а внутри уровня по всем вершинам в лексикографическом порядке; для каждой из вершин, во-первых, обеспечим равную входящую и исходящую степень (чтобы решение было циклом) за счет добавления подходящего количества ребер между текущим уровнем и более низким, а во-вторых, если вершина является исходной или если она является последней в лексикографическом порядке вершиной некоторой уже построенной циклической компоненты (ребра которой лежат выше данного уровня), то мы выпускаем из неё два ребра в её префикс и суффикс. Работа алгоритма для нашего датасета из предыдущих примеров отражена на рисунке ниже. Нетрудно видеть, что на второй картинке ребра из aa и ee были выпущены, чтобы обеспечить связь исходных строк aaa и eee с $\varepsilon$, а ребра из ca и ec чтобы сбалансировать соответствующие вершины.


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

Второй алгоритм в некотором смысле противоположен первому. Он называется Collapsing Algorithm (CA), и если GHA стартует с пустого графа и добавляет ребра только в случае необходимости, то CA стартует с некоторого решения и пытается убрать из него лишние ребра. Убирание лишних ребер происходит следующим образом: алгоритм движется по графу сверху вниз, на каждом уровне обходя вершины в лексикографическом порядке; если для некоторой вершины $\mathtt{v}$ на в цикле имеется галка $\mathtt{pref(v)} \rightarrow \mathtt{v} \rightarrow \mathtt{suff(v)}$, то алгоритм старается её обвалить (поэтому и Collapsing), заменив её на галку $\mathtt{pref(v)} \rightarrow \mathtt{pref(suff(v))} \rightarrow \mathtt{suff(v)}$, но только если это не нарушит связность цикла. Если же $\mathtt{v}$ находится на первом уровне, то эта галка просто удаляется. Таким образом алгоритм старается сбросить все лишние пары ребер вниз, после чего удалить. Пример работы CA на удвоенном оптимальном решении (удвоенность нужна, чтобы были лишние ребра) можно увидеть на рисунке ниже.


Разные гипотезы


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

Гипотеза Collapsing Conjecture возьмите любое решение, удвойте в нем ребра и подайте на вход CA. Полученный результат не зависит от изначального решения!

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

Гипотеза Greedy Hierarchical Conjecture граф, получающийся после обвала любого удвоенного решения, это в точности граф, который строит GHA!

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

Гипотеза Weak Greedy Hierarchical Conjecture GHA является 2-приближенным.

Даже если предыдущие две гипотезы неверны, то GHA все равно может быть 2-приближенным.

Моя работа


Первое, что меня заинтересовало: как связан GHA с обычным жадным алгоритмом? На некоторых примерах GHA строит более короткое решение, но всегда ли это происходит? Можем ли мы показать, что GHA не хуже жадного? Как в терминах иерархического графа описать жадный алгоритм? Как в иерархическом графе увидеть момент склейки двух строк в одну?

В процессе работы над всеми этими вопросами я выяснил, что GHA на самом деле является частным случаем обычного жадного алгоритма! Дело в том, что жадный алгоритм является недетерминированным: в его описании не оговаривается, что происходит, если есть несколько пар строк с максимальным пересечением. Предполагается, что алгоритм может выбрать произвольную пару, а значит, вообще говоря, даже на одном и том же датасете он может выдавать различные решения. GHA по своей сути является некоторой детерминацией алгоритма в его определении заложено, в каком именно порядке будут объединяться пары строк, таким образом по данному набору исходных строк всегда строится одно и то же решение. Данное свойство означает, что из жадной гипотезы следует 2-приближенность GHA, поэтому, строго говоря, доказать Weak Greedy Hierarchical Conjecture должно быть проще, чем жадную гипотезу.

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

Следующий этап моего исследования был посвящен более подробному изучению работы GHA на датасете, в котором длина всех строк ограничена некоторой константой. Если эта константа 2, то GHA является точным, а сама задача, стало быть, из класса P, а начиная с максимальной длины 3 задача становится NP-полной и для этого случая уже было неясно, насколько приближенным является GHA.

Для случая строк длины не больше 3 я показал, что GHA является 1.5-приближенным и эта оценка является асимптотически точной, т. е. для любого $\delta > 0$ можно привести датасет, на котором GHA построит решение в $1.5 \delta$ раз более длинное, чем точное.

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

Во-первых, после работы над строками длины не больше 3 я решил попробовать разобраться с Greedy Hierarchical Conjecture для этого случая, и мне это удалось. Причем был доказан даже более сильный результат: для того, чтобы все обвалилось, в GHA не нужно удваивать всё решение достаточно добавить к решению произвольное покрытие исходных вершин циклами (которые уже не обязаны образовывать один связный цикл).

Во-вторых, я выяснил, что если в общем случае к решению, полученному GHA, приклеить произвольный набор циклов (к примеру, подходит само решение GHA), а потом все обвалить, то снова получится GHA. Это означает, что из Collapsing Conjecture следует Greedy Hierarchical Conjecture. Так как обратное следствие очевидно, то выходит, что эти две гипотезы равносильны.

Конференция APPROX 2019


Все полученные результаты, кроме 1.5-приближенности, были включены в статью Collapsing Superstring Conjecture, которая была принята на конференцию APPROX 2019 и опубликована в ее трудах. Эта одна из ведущих конференций по приближенным алгоритмам, что свидетельствует об актуальности темы и интересе к ней у научного сообщества, несмотря на то, что ни одна из гипотез доказана или опровергнута не была.

Дальнейшая работа


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

Видео курсов Computer Science клуба

05.01.2021 18:18:32 | Автор: admin

Computer Science клуб это открытые лекции по компьютерным наукам в Санкт-Петербургском отделении Математического института РАН. Филиалы CS клуба действуют в Новосибирске и Казани. В связи с эпидемией все лекции осеннего семестра проходили онлайн и были доступны всем желающим вне зависимости от их местонахождения. Видеозаписи этих курсов выложены на сайт клуба и в канал на ютубе.

В осеннем семестре читались следующие курсы:

Кроме курсов, состоящих из нескольких лекций, в клубе проходят доклады Computer Science семинара - это открытые лекции от действующих учёных, популярно рассказывающие о какой-то теме. В этом семестре у нас были следующие доклады:

Также на базе Computer Science клуба проходили семинаре по курсу "Алгоритмы: продвинутые главы" от Константина Макарычева. Константин записал видеолекции на русском для курса, который он читает в Northwestern University в США. На семинарах были очень подробные и интересные обсуждения. Семинары вели Александр Шень (LIRMM, Монпелье) и Илья Разенштейн (Microsoft Research). В качестве приглашённого лектора выступал Григорий Ярославцев (Indiana University).

Более того, на сайте вы можете найти материалы и видеозаписи большинства курсов, которые когда-либо читались в клубе. Список курсов.

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

Подробнее..

Шаблоны и концепты в С20

15.04.2021 14:13:15 | Автор: admin

Привет, Хабр!

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

Важное уточнение: эта лекция не попытка объять необъятное, а краткий экскурс по полезным возможностям C++ для членов олимпиадного сообщества: от извлечения кода в класс до внутренних механизмов работы лямбда-функций и щепотки ограничений (constraints) из C++20. Если интересно, приглашаем к просмотру.

Подробные таймкоды

00:53 Что нужно знать перед просмотром лекции

02:00 Особенности С++

03:10 Хорошие источники знаний и практик в C++

04:45 Классы. Стек с минимумом

06:21 Создание своей структуры

09:03 Запрещаем прямой доступ

09:53 Упрощаем отладку

10:29 Шаблоны классов

11:24 Статический полиморфизм в разных языках

12:03 Оптимизация

12:27 Ошибки компиляции и инстанцирование

13:40 Ограничения (С++20)

15:01 Шаблоны функций

15:27 Автовывод параметров

16:21 Class Template Argument Deduction (CTAD, С++17)

16:56 Ошибки компиляции и инстанцирование

17:47 Обобщенное программирование

19:12 Вложенные типы

20:10 Продвинутые техники

20:33 Функторы

21:00 Функциональные объекты

21:56 Как параметр шаблона

22:30 Функторы с состоянием

23:26 Функторы с состоянием для контейнеров

24:42 Лямбда-выражения

25:38 Расшифровка лямбды

26:28 Сохранение в переменную

27:27 Рекурсия не поддерживается

27:56 Захваты по значению и ссылке

29:18 Захват с инициализатором

30:29 Комбинированные захваты

31:16 Применение функторов

32:15 IIFE

33:18 Вектор лямбд и стирание типов (type erasure)

34:36 Функтор как параметр функции

35:51 Функтор как поле класса

37:45 Более сложные структуры данных (декартово дерево, дерево отрезков)

38:34 За кадром: лямбды-компараторы

39:48 За кадром: более сложные шаблоны

41:23 Студенческие проекты на C++ (в прошлом году рассказывали о проектах наших первокурсниках)

Если у вас остались вопросы, смело задавайте их в комментариях или лично Егору.

Подробнее..

Разбор вступительного теста этого года в корпоративную магистратуру JetBrains на базе Университета ИТМО

12.10.2020 14:18:52 | Автор: admin
Вступительное испытание на корпоративную магистерскую программу JetBrains на базе Университете ИТМО начинается с онлайн-теста. Летом мы опубликовали разбор нескольких математических задач из теста 2019 года, а сегодня представляем разбор одного из вариантов прошедшего набора.



Несколько слов о том, как устроен тест. Абитуриенты получают ссылку на закрытый курс на платформе Stepik.org. Далее у них есть несколько недель на то, чтобы приступить к решению. Тест состоит из 12 задач, на них отводится два часа. Решать задачи можно в произвольном порядке, за каждую из них начисляется один балл. Проходной балл меняется от года к году. В этот раз он был довольно низким задачи получились сложные. Кураторы программы сделали выводы и постараются к следующему набору подготовить задачи полегче.

Задача 1


Найдите уравнение касательной к кривой $xy=6\cdot\exp(2x-3y)$ в точке $(3, 2)$. Ответ запишите в виде $ax+by=c$, где $a, b, c$ целые несократимые числа и $a>0$ (без пробелов и скобок), например, $2x+3y=7$.

Когда в задаче спрашивается про касательную к графику функции, то это почти всегда связанно с вычислением производной. В данном случае требуется найти производную для неявно заданной функции. Будем считать, что $y$ это функция от $x$. Продифференциируем обе части равенства $xy=6\cdot\exp(2x-3y)$ по $x$. Получаем

$ y + xy' = (2 - 3y')\cdot 6\cdot \exp(2x - 3y).$

Это позволяет выразить производную $y'$ через $x$ и $y$.

$ y' = \frac{12\cdot \exp(2x - 3y) - y}{x + 18\cdot \exp(2x - 3y)}. $

Теперь можно вычислить значение производной $y'$ в точке $(3,2)$. Обозначим это значение $\alpha$.

$ \alpha = \frac{12\cdot \exp(0) - 2}{3 + 18\cdot \exp(0)} = \frac{10}{21}. $

Это значение задаёт тангенс угла наклона касательной к кривой в точке $(3,2)$. Осталось вспомнить, что уравнение прямой можно задать в виде $y=\alpha x + b$. Зная, что прямая должна проходить через точку $(3,2)$, мы можем вычислить $b$:

$2 = \frac{10}{21}\cdot 3 + b.$

Следовательно, $b=\frac{4}{7}$. Получаем, что уравнение искомой прямой имеет вид:

$y = \frac{10}{21}x + \frac{4}{7}.$

Приводим его к требуемой форме домножив на 21 и получаем:

$10x - 21y = -12.$


Задача 2


На плоскости нарисованы две кривые, заданные многочленами второй степени.


Найдите площадь замкнутой области, которая ограничена этими кривыми. Если такой области нет, то нужно вывести число 0.

Вход
На первой строке три целых числа $a_1$, $b_1$, $c_1$, задающие первую кривую $f(x) = a_1 x^2 + b_1 x + c_1$, на второй строке три целых числа $a_2$, $b_2$ и $c_2$, задающие кривую $g(x)=a_2x^2+b_2x+c_2$. Все числа по модулю не превосходят $10$.

Выход
Площадь замкнутой области, ограниченная $f(x)$ и $g(x)$.
Ответ должен быть вычислен с точностью 5 знаков после запятой.

Это задача на программирование, но с некоторой математической составляющей. Чтобы вычислить площадь искомой области, можно вычислить площадь под графиками функций $f(x)$ и $g(x)$ на отрезке между точками пересечения и вычесть одну из другой. Можно поступить проще: сразу рассматривать функцию $h(x) = f(x) - g(x)$ и вычислить площадь под графиком этой функции между её корнями. Это немного упростит задачу. Предлагается следующий алгоритм:

  1. вычисляем коэффициенты $h(x) = ax^2 + bx + c$,
  2. проверяем, что получился квадратный многочлен ($a\neq 0$), и что он имеет два различных корня (дискриминант больше нуля), если нет возвращаем ноль,
  3. вычисляем корни $r_1$ и $r_2$, $r_1<r_2$
  4. вычисляем площадь под графиком $h(x)$ между $r_1$ и $r_2$,

    $ \int\limits_{r_1}^{r_2} h(x)\,dx = (ax^3/3+bx^2/2+cx)\Big|_{r_1}^{r_2}. $

  5. возвращаем модуль этого значения, т.к. при $a>0$ интеграл будет отрицательным.

Далее идёт реализация этого алгоритма на Питоне

# считываем коэффициенты f(x) и g(x)a1, b1, c1 = map(int, raw_input().split())a2, b2, c2 = map(int, raw_input().split())# вычисляем коэффициенты h(x)a = a1 - a2b = b1 - b2c = c1 - c2# проверяем наличие корнейd = b * b - 4 * a * cif a == 0 or d <= 0:    print(0)    exit(0)# вычисляем корниr1 = (-b - math.sqrt(d)) / (2.0 * a)r2 = (-b + math.sqrt(d)) / (2.0 * a)# первообразная для h(x)def H(x):    return a*x*x*x/3.0 + b*x*x/2.0 + c*x# вычисляем определённый интеграл и выводим его модуль в требуемом форматеprint("{:.5f}".format(math.fabs(H(r2) - H(r1))))


Задача 3


В пространстве $\mathbb{R}^5$ задано стандартное скалярное произведение, $L$ подпространство, заданное как линейная оболочка векторов $a_1=(2,0,-1,-2,0)$, $a_2=(1,-1,0,1,-1)$, $a_3=(1,3,0,1,-1)$. Найти ортогональную проекцию вектора $x=(3,1,-1,2,0)$ на подпространство $L$ вектор $x_L$ и ортогональную составляющую $x_M$ этого же вектора ($x_L+x_M=x$).

В ответ напишите сумму координат вектора $x_M$ (например, для вектора $(1,2,3,2,1)$ сумма координат будет 9).

Ответ укажите с точностью до двух знаков после точки. При необходимости округлите по правилам математики.

Заметим, что вектора $a_1$, $a_2$ и $a_3$ ортогональны (это можно проверить вычислив попарные скалярные произведения), но не нормированы. Давайте найдём проекцию $x$ на каждый из трёх векторов.

$ \mathrm{proj}_{a_1}x = \frac{x\cdot a_1}{|a_1|} = \frac{3}{\sqrt{9}} = 1. $

$ \mathrm{proj}_{a_2}x = \frac{x\cdot a_2}{|a_2|} = \frac{4}{\sqrt{4}} = 2. $

$ \mathrm{proj}_{a_3}x = \frac{x\cdot a_3}{|a_3|} = \frac{8}{\sqrt{12}} = \frac{4\sqrt{3}}{3}. $

Таким образом

$x_L = 1\cdot \frac{a_1}{|a_1|} + 2\cdot \frac{a_2}{|a_2|} + \frac{4\sqrt{3}}{3} \cdot \frac{a_3}{|a_3|} = \frac{1}{3}\cdot a_1 + a_2 + \frac{2}{3} \cdot a_3. $

Осталось выразить $x_M$

$ x_M = x - x_L = x - \frac{1}{3}\cdot a_1 - a_2 - \frac{2}{3} \cdot a_3. $


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

$ 5 - \frac{1}{3}\cdot (-1) - 0 - \frac{4}{3} \cdot 4 = 5 + 1/3 - 8/3 = 8/3 \approx 2.67. $


Задача 4


Обозначим за $w(k)$ комлексный корень степени $k$ из единицы с минимальным положительным аргументом (аргумент = угол в полярной форме комплексного числа). Например, $w(4) = i$.

Найдите минимальное положительное целое $x$, являющееся решением следующего уравнения.

$ \left(w(28)\cdot w(14)\right)^x = w(7)^4. $


По определению $w(k)$ можно вывести явную формулу: $w(k) = e^{\frac{2\pi}{k}\cdot i}$ (тут мы используем показательную форму записи комплексного числа, это соответствует $w(k) = \cos(2\pi/k) + i\sin(2\pi/k)$). Подставляем это в уравнение и получаем:

$ \left(e^{\frac{2\pi}{28}\cdot i}\cdot e^{\frac{2\pi}{14}\cdot i}\right)^x = \left(e^{\frac{2\pi}{7}\cdot i}\right)^4 \quad\implies\quad e^{\frac{3x\pi}{14}\cdot i} = e^{\frac{8\pi}{7}\cdot i}. $

Остаётся решить уравнение на показатели. Тут нужно помнить, что $e^{2\pi i} = 1$. Поэтому, получаем уравнение

$ \frac{3x\pi}{14}\cdot i = \frac{8\pi}{7}\cdot i + 2\pi k\cdot i. $

Домножаем на $14$ и делим на $\pi i$. Получается следующее уравнение в целых числах, где нас интересует решение с минимальным положительным целым $x$.

$ 3x = 16 + 28k. $

Проверив $k=0,1,2$, находим ответ $x = 24$ при $k=2$.

Задача 5


Маленькому мальчику Ване на кружке по системам счисления задали следующую задачу: перевести число $X$ в системе счисления $s_1$ в систему счисления $s_2$. Недолго думая, он позвал на помощь своего лучшего друга Петю, который славился тем, что замечательно умел считать до $10$ на пальцах. После нескольких бессонных ночей ребята общими усилиями справились с задачей.

Однако, на следующем занятии Ване задали похожую задачу, где $X$, к сожалению, превышало $10$. Тогда ребята решили обратиться к старшей сестре Пети с просьбой написать универсальную программу, которая решает задачу для любых $X$, $s_1$ и $s_2$. Ваша цель выполнить просьбу Вани и Пети.

Входные данные
Во входных данных вашей программе дается три числа: исходное число $X$, основания систем счисления $s_1$ и $s_2$ ($2 \le s_1,s_2 \le 10$). Число $X$ в десятичной системе счисления не превышает $2 \times 10^9$.

Выходные данные
В выходных данных должно быть число $X$, записанное в системе счисления $s_2$, или $-1$, если входные данные некорректны (число $X$ во входных данных не является корректной записью числа в системе счисления $s_1$).

Это задача на перевод числа из одной системы счисления. Если нам дано число $x = \overline{a_{n-1}a_{n-2}\dotsc a_{0}}$ в системе счисления с основанием $s_1$, то его значение можно вычислить, как

$ x = a_{n-1}s_1^{n-1} + a_{n-2}s_1^{n-2} + \dotsb + a_0. $

Это же можно вычислить по схеме Горнера:

$ x = (\dotsc(a_{n-1}s_1 + a_{n-2})s_1 + \dotsb + a_1)s_1 + a_0. $

Для того, чтоб перевести $x$ в число $\overline{b_{n-1}b_{n-2}\dotsc b_{0}}$ в системе счисления по основанию $s_2$, нужно повторить эту процедуру в обратном порядке. Тогда цифра $b_i$ будет вычисляться по формуле

$ b_i = \lfloor x / s_2^i\rfloor \bmod s_2. $



Ниже представлена реализация этой идеи на Питоне.
# считываем входные данныеxstr, b, c = raw_input().split()s1 = int(b)s2 = int(c)# проверяем входные данные и преобразуем в числоx = 0for c in xstr:    if int(c) >= s1:        print(-1)        exit()    x = x * s1 + int(c)# переводим в заданную систему счисленияres = ""if x == 0:    res = "0"else:    while x > 0:        res = str(x % s2) + res        x = x // s2     print(res)


Задача 6


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

Какое максимальное число студентов на магистерской программе Software Engineering?

Задача на комбинаторику и теорию графов. Рассмотрим одного студента. Он сам дружит не более, чем с тремя студентами. Каждый его друг имеет не более 2 других друзей. Других студентов по условию быть не может. Получаем, что всего не более $1 + 3 + 3\cdot 2 = 10$ студентов. Осталось проверить, что такую граф существует, но это несложно сделать на листочке.


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

Задача 7


Сколько различных решений имеет следующее уравнение $x_1+x_2+x_3+x_4=50,$
если известно, что $x_1\in\{1,2,3,\dotsc\}$, $x_2\in\{2,3,4,\dotsc\}$, $x_3\in\{0,1,2,3,\dotsc\}$, $x_4\in\{0,1,2,3,\dotsc\}$?

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

count = 0for x1 in range(1,51):    for x2 in range(2,51):        for x3 in range(51):                if x1 + x2 + x3 <= 50:                    count = count + 1print(count)

Но писать программу необязательно, ответ не так сложно вычислить аналитически (на тесте такого требования не было). Для этого заметим, что исходная задача эквивалентна следующей.
Сколько различных решений имеет следующее уравнение $x_1+x_2+x_3+x_4=47,$
если известно, что $x_1,x_2,x_3,x_4\in\{0,1,2,3,\dotsc\}$?
(Мы вычли $1+2$ из правой части и добились того, чтобы все переменные начинались с нуля.)

Это уже типовая задача. Нам нужно разбить последовательность $n=47$ предметов на 4 части. Для этого нужно вставить $k = 3$ перегородки. По формуле для разбиения получаем

$\binom{n+k}{k} = \binom{50}{3} = \frac{50\cdot 49\cdot 48}{3!} = 50\cdot 49\cdot 8 = 1960.$



Задача 8


Найти длину кривой $x^{2/3}+y^{2/3}=9$, заключённой в первой четверти.

Ответ укажите с точностью до двух знаков после точки. При необходимости округлите по правилам математики.

Это задача на вычисление длины кривой. Длина кривой вычисляется через определённый интеграл

$ \int\limits_a^b \sqrt{1 + (y')^2}\, dx. $

В нашем случае, $a = 0$, $y = (9 - x^{2/3})^{3/2}$. Для вычисления $b$, точки пересечения с осью абсцисс, нужно подставить $y=0$: получаем $x = 9^{3/2} = 3^3 = 27$. Вычислим $y'$:

$ y' = -\frac{2}{3}\cdot \frac{3}{2}\cdot x^{-1/3}\cdot \sqrt{9 - x^{2/3}} = -\sqrt{9x^{-2/3} - 1}. $

Вычисляем интеграл:

$ \int\limits_0^{27} \sqrt{1 + 9x^{-2/3} - 1}\, dx = \int\limits_0^{27} \sqrt{9x^{-2/3}} \, dx = \int\limits_0^{27} 3x^{-1/3} \, dx = \left(\frac{9}{2}\cdot x^{2/3}\right)\Bigg|_0^{27} = 81/2 = 40.5 $


Задача 9


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

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

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

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

Выведите эту информацию в том порядке, в котором слова встречаются в тексте в первый раз.

Это чисто программистская задача на использование массивов, словарей и сортировок. Ниже представлено решение этой задачи на Питоне с комментариями.
# считываем входную строку и разбиваем на словаwords = raw_input().split()# заводим необходимые словариidx  = {}  # хранит номер последнего вхождения словаdist = {}  # хранит минимальное расстояние между повторениямиfirst = {} # хранит номер первого вхождения# проходим по словам и вычисляем минимальное расстояние для каждого словаfor i in range(len(words)):    if words[i] in idx:        if dist[words[i]] > i - idx[words[i]] - 1:            dist[words[i]] = i - idx[words[i]] - 1    else:        first[words[i]] = i        dist[words[i]] = 2 * len(words)  # замена +бесконечности    idx[words[i]] = i # массив для хранения слов, которые встречаются более одного разаgood = []for k in dist:    if dist[k] < len(words):        good.append((k, dist[k], first[k]))        # упорядочиваем массив по номеру первого вхожденияgood.sort(key=lambda t: t[2])# выводим результатfor t in good:    print("{}: {}".format(t[0], t[1]))


Задача 10


В студенческом общежитии ИТМО очень сложно устроена локальная сеть местный администратор не любит роутеры, потому сетевые кабели протянуты напрямую между некоторыми компьютерами (для этого в некоторые компьютеры пришлось установить дополнительные сетевые карты).

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

Какое минимальное количество вопросов необходимо задать чтобы гарантированно получить ответ, если всего в общежитии установлено 32 компьютера?

Задача на теорию графов. Тут нужно показать, что какую бы стратегию мы не выбрали, нам придётся перебрать все пары компьютеров, т.е. задать $32\cdot 31/2 = 496$ вопросов. До этого нетрудно догадаться, и для ответа на тест этого достаточно. Тем не менее, давайте постараемся разобраться, почему это так.

Довольно легко придумать следующую простую идею, которая всё объясняет: если мы про какую-то пару компьютеров не спросили, например, не спросим про пару $\{12,17\}$, то давайте рассмотрим сеть, в которой компьютер $17$ соединён только с компьютером $12$. Если не спросить про $\{12,17\}$, то мы не можем быть уверены, что $17$ соединён хоть к каким-то компьютером. Это рассуждение объясняет, почему нужно спросить про все пары компьютеров, и приводит к правильному ответу. Только вот это рассуждение не является корректным. Проблема заключается в том, что мы неявно предполагаем, что наши вопросы не зависят от ответов на предыдущие вопросы. Когда мы предлагаем рассмотреть сеть, в которой компьютер $17$ соединён только с компьютером $12$, то это уже другая сеть, нежели та, на которой мы не спросили про пару $\{12,17\}$. На разных сетях вопросы могут быть устроены по-разному. Другими словами, это рассуждение позволяет доказать, что не существует пары компьютеров $\{a,b\}$, про которую мы не спросим ни для какой конфигурации сети. При этом, если для каждой конфигурации сети существует какая-то пара, про которую мы не спрашиваем, то это не противоречит нашему рассуждению.

Корректное объяснение может выглядеть, например, так. Предположим, что вместо честного ответа на вопросы об устройстве сети, нам отвечают таким образом, чтобы заставить нас задавать как можно больше вопросов (такое доказательство называется рассуждением о противнике (adversary argument)). Как ему это сделать? Можно придерживаться следующей стратегии: отвечать Да только в том случае, если ответ Нет будет означать, что сеть несвязна. Давайте покажем, что при такой стратегии ответов нам всегда придётся спросить про все пары компьютеров. Рассмотрим граф, в котором вершины соответствуют компьютерам, а рёбра тем парам, для которых мы получили ответ Да. Заметим, что при такой стратегии ответов на вопросы получившийся граф будет ациклическим. Действительно, если в какой-то момент в графе появился цикл, то это означает, что мы получили ответ Да на вопрос про некоторую пару $\{a,b\}$, про которую можно было ответить Нет, ведь $\{a,b\}$ уже связаны другими рёбрами, т.е. ответ Нет на вопрос о $\{a,b\}$ не означает несвязность сети. Теперь предположим, что мы убедились в связности сети не спросив про все пары. Это значит, что полученный граф представляет собой дерево содержащее все 32 вершины. Пусть $\{a,b\}$ пара компьютеров, про которую мы не спросили. Давайте добавим ребро $\{a,b\}$ к дереву. Так как в дереве уже были пути между всеми парами вершин, то новое ребро добавит цикл.


Рассмотрим этот цикл и выберем на нём ребро, про которое мы спрашивали последним. Пусть это ребро $\{c,d\}$. Спрашивая про пару $\{c,d\}$ мы получили ответ Да. По нашей стратегии нам отвечают Да только, если ответ Нет означал бы несвязность графа. Но это противоречит тому, что про пару $\{a,b\}$ мы ничего не спрашивали: можно было бы ответить Нет на вопрос о $\{c,d\}$ и всё равно добиться связности графа за счёт ответа Да на вопрос об $\{a,b\}$. Это противоречит предположению о выбранной стратегии ответов на вопросы.

Задача 11


Школьник Ваня приболел, и его мама решила вызвать врача домой. У врача есть статистика по району, где живет Ваня. У $90\%$ больных детей этого района грипп, у остальных $10\%$ ветрянка. Других болезней в этом районе не зафиксировано.

Один из основных симптомов ветрянки это сыпь, она появляется в $95\%$ случаях заболевания ветрянкой. Однако, во время гриппа она тоже возможна и появляется в $8\%$ случаях.

Осмотрев Ваню, врач обнаружил сыпь. Какова вероятность того, что у Вани ветрянка?

Ответ укажите с точностью до двух знаков после точки. При необходимости округлите по правилам математики.

Это задача на теорию вероятностей и формулу Байеса. Обозначим следующие события: $A$ у Вани грипп, $B$ у Вани ветрянка.

$\Pr[A] = 0.9,\quad \Pr[B] = 0.1.$

Пусть $C$ это наличие сыпи. Известно, что

$\Pr[C\mid B] = 0.95,\quad \Pr[C\mid A] = 0.08.$


Нас просят оценить условную вероятность $\Pr[B\mid C]$. По теореме Байеса:

$\Pr[B\mid C] = \frac{\Pr[C\mid B]\cdot\Pr[B]}{\Pr[C]}.$

Вероятность выпадения сыпи можно вычислить по формуле полной вероятности:

$ \Pr[C] = \Pr[C\mid B]\cdot\Pr[B] + \Pr[C\mid A]\cdot\Pr[A] = 0.95\cdot 0.1 + 0.08\cdot 0.9 = 0.167. $

В результате получаем:

$\Pr[B\mid C] = \frac{0.95\cdot 0.1}{0.167} \approx 0.57.$


Заключение


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

PS. Внимательный читатель заметит, что в разборе 11 задач, а в тесте их должно быть 12. Одна из задач оказалась технически сложной, и мы решили её не разбирать, чтобы никого не пугать.
Подробнее..

Исследование возможных заимствований и нарушений условий лицензирования в Java-коде на GitHub

13.11.2020 20:09:06 | Автор: admin
Меня зовут Ярослав Голубев, я работаю в JetBrains Research, в лаборатории методов машинного обучения в программной инженерии. Некоторые мои коллеги уже писали здесь о своих проектах (например, о подсказках для онлайн-курсов). Общая цель нашей группы сделать работу программистов проще, удобнее и эффективнее, используя данные о том, что и как люди программируют. Однако процесс создания программных продуктов состоит не только из написания кода есть еще документация, комментарии, рабочие обсуждения и многое другое и со всем этим людям тоже можно и нужно помогать.

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

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

Введение в лицензирование кода


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

Мы с вами будем говорить только о лицензировании открытого (open-source) программного обеспечения. Во-первых, это связано с тем, что именно в такой парадигме мы можем легко найти много доступных данных, а во-вторых, сам термин открытое ПО способен ввести в заблуждение. Когда вы скачиваете и устанавливаете обычную проприетарную программу с сайта компании, вас просят согласиться с условиями лицензии. Разумеется, вы их обычно не читаете, но в целом понимаете, что это чья-то интеллектуальная собственность. В то же время, когда разработчики заходят в проект на GitHub и видят все исходные файлы, отношение к ним совсем другое: да, какая-то лицензия там есть, но она же открытая, и программное обеспечение это открытое, значит, можно просто брать и делать что хочешь, так? К сожалению, не все так просто.

Как же устроено лицензирование? Начнем с самого общего деления прав:



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

Так в чем же различие между разрешительными и копилефтными лицензиями? Как и все в нашей теме, этот вопрос достаточно специфический, и здесь есть исключения, но если упростить, то разрешительные лицензии не накладывают ограничений на лицензию измененного продукта. То есть можно взять такой продукт, изменить его и выложить в проект под другой лицензией даже проприетарной. Главным отличием от общественного достояния тут чаще всего является обязательство сохранять авторство и упоминание оригинального автора. Наиболее известными разрешительными лицензиями являются лицензии MIT, BSD и Apache. Многие исследования указывают MIT как наиболее распространенную лицензию открытого программного обеспечения вообще, а также отмечают значительный рост популярности лицензии Apache-2.0 с момента ее создания в 2004 году (например, исследование для Java).

Копилефтные лицензии чаще всего накладывают ограничения на распространение и модификацию побочных продуктов вы получаете продукт, имея определенные права, и обязаны запустить его дальше, предоставляя всем пользователям такие же права. Обычно это означает обязательство распространять программное обеспечение в рамках той же лицензии и предоставлять доступ к исходному коду. На основе такой философии Ричард Столлман создал первую и самую популярную копилефтную лицензию GNU General Public License (GPL). Именно она обеспечивает максимальную защиту свободы для будущих пользователей и разработчиков. Рекомендую почитать историю движения Ричарда Столлмана за свободное программное обеспечение, это очень интересно.

С копилефтными лицензиями есть одна сложность их традиционно делят на сильный и слабый копилефт. Сильный копилефт представляет собой ровно то, что описано выше, в то время как слабый копилефт предоставляет различные послабления и исключения для разработчиков. Наиболее известный пример такой лицензии GNU Lesser General Public License (LGPL): так же как и ее старшая версия, она разрешает изменять и распространять код только при условии сохранения данной лицензии, однако при динамическом линковании (использовании ее как библиотеки в приложении) это требование можно не выполнять. Иными словами, если вы хотите позаимствовать отсюда исходный код или что-то поменять соблюдайте копилефт, но если хотите просто использовать как динамически подключаемую библиотеку можете делать это где угодно.

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



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

Тут может возникнуть вопрос: а что, если у кода нет лицензии? Каким правилам следовать тогда? Такой код можно копировать? На самом деле это очень важный вопрос. Наверное, если код написан на заборе, то его можно считать общественным достоянием, а если он написан на бумаге в бутылке, которую прибило к необитаемому острову (без копирайта), то его можно просто брать и использовать. Когда же дело касается больших и устоявшихся платформ, таких как GitHub или StackOverflow, все не так просто, потому что, просто пользуясь ими, вы автоматически соглашаетесь с их условиями использования. Пока просто оставим об этом заметку в голове и вернемся к этому позже в конце концов, быть может, это редкость и кода без лицензии практически не бывает?

Постановка задачи и методология


Итак, теперь, когда мы знаем значение всех терминов, давайте точно сформулируем, что мы хотим узнать.

  • Насколько распространено копирование кода в открытом программном обеспечении? Много ли среди открытых проектов клонов в коде?
  • Под какими лицензиями существуют файлы? Какие лицензии наиболее распространены? Бывает ли в файле сразу несколько лицензий?
  • Какие возможные заимствования, то есть переходы кода из одной лицензии в другую, встречаются чаще всего?
  • Какие возможные нарушения, то есть переходы кода, запрещенные условиями оригинальной или принимающей лицензии, наиболее распространены?
  • Каково возможное происхождение отдельных фрагментов кода? Какова вероятность, что данный фрагмент кода был скопирован с нарушением?

Чтобы провести такой анализ, нам необходимо:

  1. Собрать датасет из большого количества открытых проектов.
  2. Найти среди них клоны фрагментов кода.
  3. Определить те клоны, которые действительно могут являться заимствованиями.
  4. Для каждого фрагмента кода определить два параметра его лицензию и время его последней модификации, которое необходимо, чтобы узнать, какой фрагмент в паре клонов старше, а какой младше, и следовательно кто мог потенциально скопировать у кого.
  5. Определить, какие возможные переходы между лицензиями являются разрешенными, а какие нет.
  6. Проанализировать все полученные данные, чтобы ответить на вышепоставленные вопросы.

Теперь разберем каждый шаг подробнее.

Сбор данных


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

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

За основу мы взяли существующий Public Git Archive, в начале 2018 года собравший воедино все проекты на GitHub, у которых было более 50 звездочек. Мы отобрали все проекты, в которых есть хотя бы одна строчка на Java и скачали их с полной историей изменений. После фильтрации проектов, которые переехали или более недоступны, получилось 23 378 проектов, занимающих примерно 1,25 ТБ места на жестком диске.

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

Поиск клонов


Для поиска клонов, то есть похожих кусков кода, тоже необходимо принять некоторые решения. Во-первых, нужно определиться, насколько и в каком качестве нам интересен похожий код. Традиционно выделяют 4 типа клонов (от самых точных до наименее точных):

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

Нас интересует именно копирование и модификация, поэтому мы рассматриваем только клоны первых трех типов.

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

Исходя из выбранных решений, для поиска клонов мы использовали SourcererCC инструмент, который ищет клоны методом мешка слов: каждый метод представляется как частотный список токенов (ключевых слов, имен и литералов), после чего такие множества сравниваются, и если больше определенной доли токенов в двух методах совпадает (такая доля называется порогом схожести), то такая пара считается клоном. Несмотря на простоту такого метода (существуют гораздо более сложные методы, основанные на анализе синтаксических деревьев методов и даже их графов программной зависимости), его главным преимуществом является масштабируемость: при таком огромном объеме кода, как у нас, важно, чтобы поиск клонов осуществлялся очень быстро.

Мы использовали различные пороги схожести, чтобы найти разные клоны, а также отдельно провели поиск с порогом схожести 100%, в котором определялись только идентичные клоны. Кроме того, был установлен минимальный исследуемый размер метода, чтобы отбросить тривиальные и универсальные фрагменты кода, которые могут не является заимствованиями.

Такой поиск занял целых 66 суток непрерывных вычислений, было определено 38,6 миллиона методов, из которых только 11,7 миллиона проходили минимальный порог по размеру, а из них 7,6 миллиона приняли участие в клонировании. Всего обнаружилось 1,2 миллиарда пар клонов.

Время последней модификации


Для дальнейшего анализа мы отобрали только межпроектные пары клонов, то есть пары похожих фрагментов кода, которые встречаются в разных проектах. С точки зрения лицензирования нас мало интересуют фрагменты кода в рамках одного проекта: повторять свой же код считается плохой практикой, но не запрещено. Всего межпроектных пар оказалось примерно 561 миллион, то есть приблизительно половина всех пар. Данные пары включали в себя 3,8 миллиона методов, для которых и нужно было определить время последней модификации. Для этого к каждому файлу (которых оказалось 898 тысяч, потому что в файлах может быть более одного метода) была применена команда git blame, которая выдает время последней модификации для каждой строки в файле.

Таким образом, у нас есть время последней модификации для каждой строки в методе, но как определить время последней модификации всего метода? Кажется, что это очевидно берешь самое недавнее из времен и используешь его: в конце концов, это действительно показывает, когда метод менялся в последний раз. Однако для нашей задачи такое определение неидеально. Рассмотрим пример:



Предположим, мы нашли клон в виде пары фрагментов, каждый по 25 строчек. Более насыщенный цвет тут означает более позднее время модификации. Допустим, фрагмент слева был написан за раз в 2017 году, а во фрагменте справа 22 строчки были написаны в 2015, а три модифицированы в 2019. Выходит, фрагмент справа был модифицирован позднее, однако если бы мы хотели определить, кто у кого мог скопировать, логичнее было бы предположить обратное: левый фрагмент заимствовал правый, а правый позднее незначительно поменялся. Исходя из этого, мы определяли время последнего изменения фрагмента кода как наиболее часто встречающееся время последнего изменения его отдельных строк. Если вдруг таких времен было несколько, выбиралось более позднее.

Интересно, что наиболее старый фрагмент кода в нашем датасете был написан аж в апреле 1997 года, на самой заре создания Java, и у него нашелся клон, сделанный в 2019!

Определение лицензий


Вторым и наиболее важным этапом является определение лицензии для каждого фрагмента. Для этого мы использовали следующую схему. Для начала с помощью инструмента Ninka определялась лицензия, указанная непосредственно в заголовке файла. Если таковая есть, то она и считается лицензией каждого метода в нем (Ninka способна распознавать и несколько лицензий одновременно). Если же в файле ничего не указано, либо указано недостаточно информации (например, только копирайт), то использовалась лицензия всего проекта, к которому относится файл. Данные о ней содержались в оригинальном Public Git Archive, на основании которого мы собирали датасет, и определялись с помощью другого инструмента Go License Detector. Если же лицензии нет ни в файле, ни в проекте, то такие методы отмечались как GitHub, так как в таком случае они подчиняются условиям использования GitHub (именно оттуда были скачаны все наши данные).

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

Главная особенность данного графика состоит в сильнейшей неравномерности распределения лицензий. На графике можно заметить три области: две лицензии с более чем 100 тысячами файлов, еще десять с 10100 тысячами и длинный хвост из лицензий с менее чем 10 тысячами файлов.

Рассмотрим сначала наиболее популярные, для чего представим первые две области в линейной шкале:



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

Следом за ней находится пресловутое отсутствие лицензии, и нам все же придется разобрать его подробнее, раз уж данная ситуация настолько часто встречается даже среди средних и крупных репозиториев (более 50 звезд). Данное обстоятельство очень важно, поскольку просто загрузка кода на GitHub не делает его открытым и если что-то практическое и нужно запомнить из данной статьи, то это оно. Загружая код на GitHub, вы соглашаетесь с условиями использования, которые гласят, что ваш код можно будет просматривать и форкать. Однако за исключением этого, все права на код остаются у автора, поэтому распространение, модификация и даже использование требуют явного разрешения. Получается, мало того, что не весь открытый код является полностью свободным, даже не весь код на GitHub является в полном смысле открытым! И так как такого кода много (14% файлов, а среди менее популярных проектов, не вошедших в датасет, скорее всего, и того больше), это может являться причиной значительного количества нарушений.

В пятерке мы также видим уже упомянутые разрешительные лицензии MIT и BSD, а также копилефтную GPL-3.0-or-later. Лицензии из семейства GPL разнятся не только значительным количеством версий (полбеды), но еще и припиской or later, которая позволяет пользователю использовать условия данной лицензии или ее более поздних версий. Это наводит еще на один вопрос: среди этих 94 лицензий явно встречаются подобные семейства какие из них самые большие?

На третьем месте как раз GPL-лицензии их в списке 8 видов. Именно это семейство самое значимое, потому что вместе они покрывают 12,6% файлов, уступая только Apache-2.0 и отсутствию лицензии. На втором месте, неожиданно, BSD. Кроме традиционной версии с 3 параграфами и даже версий с 2 и 4 пунктами, существуют очень специфичные лицензии всего 11 штук. К таким, например, относится BSD 3-Clause No Nuclear License, которая представляет собой обычную BSD с 3 пунктами, к которой снизу приписано, что данное ПО не должно применяться для создания или эксплуатации ничего ядерного:

You acknowledge that this software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility.

Самым разнообразным является семейство лицензий Creative Commons, о которых можно почитать тут. Их встретилось целых 13 и их тоже стоит хотя бы пробежать глазами по одной важной причине: весь код на StackOverflow лицензирован под СС-BY-SA.

Среди более редких лицензий есть некоторые примечательные, например, Do What The F*ck You Want To Public License (WTFPL), которая покрывает 529 файлов и позволяет делать с кодом именно то, что указано в названии. Есть еще, например, Beerware License, которая также разрешает делать что угодно и призывает купить автору пива при встрече. В нашем датасете мы также встретили вариацию этой лицензии, которую больше нигде не нашли Sushiware License. Она, соответственно, призывает купить автору суши.

Еще любопытна ситуация, когда в одном файле (именно в файле) встречается сразу несколько лицензий. В нашем датасете таких файлов всего 0,9%. 7,4 тысячи файлов покрываются сразу двумя лицензиями, и всего обнаружилось 74 разные пары таких лицензий. 419 файлов покрывается аж тремя лицензиями, и таких троек насчитывается 8. И, наконец, один файл в нашем датасете упоминает четыре разные лицензии в заголовке.

Возможные заимствования


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

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

Любопытно, что из оставшихся пар целых 11,7% составляют идентичные клоны с порогом схожести 100% возможно, интуитивно кажется, что абсолютно одинакового кода на GitHub должно быть меньше.

Все оставшиеся после данной фильтрации пары мы обрабатываем следующим образом:

  1. Сравниваем время последней модификации двух методов в паре.
  2. Если они совпадают с точностью до дня, игнорируем такую пару: нет смысла искать нарушения с такой точностью.
  3. Если же они не совпадают, берем пару их лицензий от старшего к младшему и записываем. Например, если у блока из 2015 года лицензия MIT, а у блока из 2018 Apache-2.0, то записываем такую пару как потенциальное заимствование MIT Apache-2.0.

В конце мы просуммировали количество пар для каждого потенциального заимствования и отсортировали их по убыванию:



Здесь зависимость еще более экстремальная: возможное заимствование кода внутри Apache-2.0 составляет более половины всех пар клонов, а первые 10 пар лицензий покрывают уже более 80% клонов. Важно также отметить, что вторая и третья самая частые пары имеют дело с нелицензированными файлами также явное следствие их частоты. Для пяти наиболее популярных лицензий можно изобразить переходы в виде тепловой карты:



Возможные нарушения лицензирования


Следующий шаг в нашем исследовании определить пары клонов, являющиеся потенциальными нарушениями, то есть заимствованиями, которые нарушают условия оригинальной и принимающей лицензий. Для этого необходимо разметить вышеупомянутые пары лицензий как разрешенные либо запрещенные переходы. Так, например, наиболее популярный переход (Apache-2.0 Apache-2.0), разумеется, разрешен, а вот второй (GitHub Apache-2.0) запрещен. Но их очень и очень много, таких пар тысячи.

Чтобы с этим справиться, вспомним, что визуализированные первые 10 пар лицензий покрывают 80% всех пар клонов. Благодаря такой неравномерности, оказалось достаточно вручную разметить всего 176 пар лицензий, чтобы покрыть 99% пар клонов, что показалось нам вполне приемлемой точностью. Среди этих пар, мы считали запрещенными пары четырех типов:

  1. Копирование из файлов без лицензии (GitHub). Как уже было сказано, такое копирование требует прямого разрешения от автора кода, и мы предполагаем, что в подавляющем большинстве случаев его нет.
  2. Копирование в файлы без лицензии также запрещено, потому что это есть по сути стирание, убирание лицензий. Разрешительные лицензии вроде Apache-2.0 или BSD разрешают переиспользовать код в других лицензиях (в том числе проприетарных), однако даже они требуют, чтобы сохранялось упоминание оригинальной лицензии в файле.
  3. Копирование из копилефтных лицензий в более слабые.
  4. Специфические несовместимости между версиями лицензий (например, Apache-2.0 GPL-2.0).

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

В итоге после разметки оказалось, что 72,8% заимствований представляют собой разрешенные заимствования, а 27,2% запрещенные. На следующих графиках представлены наиболее нарушаемые и наиболее нарушающие лицензии.



Слева представлены наиболее нарушаемые лицензии, то есть источники наибольшего количества возможных нарушений. Среди них первое место занимают файлы без лицензий, что является важным практическим замечанием нужно особенно пристально следить за файлами без лицензий. Можно удивиться, что в этом списке делает разрешительная лицензия Apache-2.0. Однако, как видно из вышепредставленной тепловой карты, ~25 миллионов запрещенных заимствований из нее это заимствования в файл без лицензии, так что это следствие ее популярности.

Справа представлены лицензии, в которые копируют с нарушениями, и здесь больше всего представлены все те же Apache-2.0 и GitHub.

Происхождение отдельных методов


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

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

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



Две из представленных конфигураций могут являть собой нарушение условий лицензирования:

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

Остальные конфигурации не являются нарушениями:

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

Итак, как же распределены методы в нашем датасете?



Можно заметить, что примерно треть методов не имеет клонов вообще, и еще треть имеет клоны только в связанных проектах. С другой стороны, 5,4% методов представляют слабое нарушение, а 4% сильное нарушение. Хотя такие цифры и могут показаться не очень большими, это все еще сотни тысяч методов в более-менее крупных проектах.

TL;DR


Учитывая, что в этой статье много эмпирических цифр и графиков, повторим наши основные находки:

  • Методы, у которых есть клоны, исчисляются миллионами, а пар между ними больше миллиарда.
  • Всего в нашем датасете, состоящем из Java-проектов с более чем 50 звездами, найдено 94 вида лицензий, которые распределены очень неравномерно: наиболее часто встречаются Apache-2.0 и файлы без лицензии. Возможные переходы также встречаются чаще всего между Apache-2.0 и файлами без лицензии.
  • Что касается запрещенных возможных переходов, то таких 27,2%, и наиболее часто нарушаются права авторов файлов без лицензии.
  • Из самих методов всего 35,4% не имеют клонов вообще, у 5,4% часть старших клонов запрещают возможное заимствование, а у 4% все старшие клоны таковы.

А к чему все это?


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

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

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

  1. Не стоит бояться юридического веса темы лицензирования и переживать из-за большого количества лицензий и их параметров. Для начала вполне достаточно понимать суть лицензий Apache-2.0, MIT, BSD-3-Clause, GPL и LGPL.
  2. Даже для этих лицензий достаточно понимания одного главного параметра: является ли лицензия разрешительной или копилефтной. Так что если вы вдруг встретите какую-то незнакомую редкую лицензию, не обязательно читать все пять мониторов ее текста, для начала можно просто отыскать в интернете именно это ее свойство.
  3. Наиболее пристального внимания требуют файлы на GitHub, для которых лицензия не задана. Такие файлы по умолчанию не являются открытыми и их заимствование требует разрешения автора. Вместе с тем отсутствие лицензии очень редко является намеренным выбором скорее, люди просто забывают об этом. В нашей лаборатории мы ввели следующую практику: когда кому-то надо позаимствовать код, не защищенный лицензией, мы просто пишем автору или создаем ишью, объясняя нашу заинтересованность, и просим добавить в проект лицензию. В подавляющем большинстве случаев разработчик добавляет лицензию, и сообщество открытого программного обеспечения становится чуточку лучше.

За понятными описаниями лицензий, а также за советами по выбору лицензии для своего нового проекта, можно обратиться к таким сервисам как tldrlegal или choosealicense.

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

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

Автоматическая генерация сообщений к коммитам

31.05.2021 20:20:52 | Автор: admin
Привет! Меня зовут Александра Елисеева, я студентка Computer Science Center. В рамках практики в осеннем семестре 2020 года я участвовала в проекте BERT for Source Code под руководством Тимофея Брыксина и Ярослава Соколова из JetBrains Research. Я исследовала решение задачи автоматической генерации сообщений к коммитам с помощью языковой модели BERT. Что получилось, а над чем еще предстоит поработать, расскажу в этом посте.



О проекте


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

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

Недавние работы (1, 2, 3) показали, что если обучить модель BERT на большом датасете программного кода, то она и в этой области неплохо справляется с несколькими задачами (среди них, например, локализация и устранение неправильно использованных переменных и генерация комментариев к методам).

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

О задаче


Почему мы выбрали эту задачу?

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

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

  • в существующих работах (4, 5, 6) данные собираются из открытых источников и требуют серьёзной фильтрации, поэтому примеров для обучения остаётся немного. Здесь может пригодиться способность BERT дообучаться на небольших датасетах;
  • state-of-the-art результат на момент работы над проектом был у модели архитектуры Transformer, которая достаточно специфичным способом предобучена на небольшом датасете (6). Нам интересно было сравнить его с моделью на основе BERT, которая предобучена по-другому, но на гораздо большем количестве данных.

За семестр мне нужно было сделать следующее:

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

Данные


Существует несколько открытых датасетов для этой задачи, я выбрала наиболее отфильтрованный из них (5).

Датасет собирался из топ-1000 открытых GitHub репозиториев на языке Java. После фильтрации из исходных миллионов примеров осталось около 30 тысяч.

Сами примеры представляют собой пары из вывода команды git diff и соответствующего короткого сообщения на английском языке. Выглядит это как-то так:



И изменения, и сообщения в датасете короткие не более 100 и 30 токенов соответственно.

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

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

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

BERT для sequence-to-sequence задач


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

Для решения подобных задач обычно используют архитектуру энкодер-декодер, состоящую из двух компонент:

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

Модель BERT основана на энкодере из архитектуры Transformer и сама по себе для такой задачи не подходит. Возможно несколько вариантов, чтобы получить полноценную sequence-to-sequence модель, самый простой - использовать с ней какой-либо декодер. Такой подход с декодером из архитектуры Transformer хорошо себя показал, например, для задачи нейронного машинного перевода (7).

Пайплайн


Для проведения экспериментов необходим был код для обучения и оценки качества подобной sequence-to-sequence модели.

Для работы с моделью BERT я использовала библиотеку HuggingFaces Transformers, а для реализации в целом фреймворк PyTorch.

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

В какой-то момент было решено заняться рефакторингом, практически переписав пайплайн. Структурировать код помогла библиотека PyTorch Lightning, позволяющая собрать всю основную логику модели в одном модуле и во многом автоматизировать её.

Эксперименты


В ходе экспериментов нам хотелось понять, позволяет ли использование предобученной на программном коде модели BERT улучшить state-of-the-art результат в этой области.

Среди обученных на коде моделей BERT нам подошла только CodeBERT (1), так как только у неё в примерах для обучения присутствовал язык программирования Java. Сначала, используя CodeBERT в качестве энкодера, я попробовала декодеры разных архитектур:

  1. Я предполагала, что с этим вариантом удастся быстро получить какой-нибудь базовый результат. GRU не так часто используют с архитектурой Transformer, поэтому было не до конца понятно, чего ожидать.
    В итоге какого-либо разумного качества получить не удалось даже после подбора нескольких влияющих на процесс обучения гиперпараметров.
  2. Я попробовала второй вариант, используя для этого предобученную на английском языке GPT-2 (8) модель на основе декодера из архитектуры Transformer, часто применяемую для задач генерации, а также её более маленькую версию distilGPT-2 (9).

На дальнейшие эксперименты времени в осеннем семестре не хватило, я продолжила их уже зимой. Мы рассмотрели несколько других способов представления входных данных: попробовали выравнивать последовательности до изменений и после, а еще просто подавать git diff.

Основные результаты экспериментов выглядят следующим образом:





Подводя итоги


В целом предположение о пользе применения CodeBERT к данной задаче не подтвердилось, во всех случаях обучаемая с нуля модель Transformer показала качество выше. Лучшим методом в этой области остаётся модель CoreGen6: это тоже Transformer, но дополнительно предобученный с использованием предложенной авторами целевой функции.

Для решения этой задачи можно рассмотреть еще много идей: например, попробовать представление данных на основе абстрактных синтаксических деревьев, которое часто применяется при работе с программным кодом (10, 11), попробовать другие предобученные модели или провести какое-нибудь специфичное для этой области предобучение, если есть необходимые ресурсы. Мы же в весеннем семестре сосредоточились на более практическом применении полученных результатов и занимались автодополнением сообщений к коммитам. Об этом расскажу во второй части :)

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

Спасибо за внимание!

Источники


  1. Feng, Zhangyin, et al. Codebert: A pre-trained model for programming and natural languages. 2020
  2. Buratti, Luca, et al. Exploring Software Naturalness through Neural Language Models. 2020
  3. Kanade, Aditya, et al. Learning and Evaluating Contextual Embedding of Source Code. 2020
  4. Jiang, Siyuan, Ameer Armaly, and Collin McMillan. Automatically generating commit messages from diffs using neural machine translation. 2017
  5. Liu, Zhongxin, et al. Neural-machine-translation-based commit message generation: how far are we?. 2018
  6. Nie, Lun Yiu, et al. CoreGen: Contextualized Code Representation Learning for Commit Message Generation. 2021
  7. Rothe, Sascha, Shashi Narayan, and Aliaksei Severyn. Leveraging pre-trained checkpoints for sequence generation tasks. 2020
  8. Radford, Alec, et al. Language models are unsupervised multitask learners. 2019
  9. Sanh, Victor, et al. DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter. 2019
  10. Yin, Pengcheng, et al. Learning to represent edits. 2018
  11. Kim, Seohyun, et al. Code prediction by feeding trees to transformers. 2021
Подробнее..

О стажировках для тех, кто еще не ) Эпизод 2

19.04.2021 16:09:25 | Автор: admin

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

Вас пригласили на собеседование что делать?

Ответить

  • внимательно читайте инструкции в приглашении скорее всего вся необходимая информация там уже есть;

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

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

  • уточните часовой пояс тех, кто будет проводить интервью, и сообщите свой, если он отличается;

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

  • спросите, кто будет проводить собеседование и как вы можете к нему подготовиться; на каком языке будет общение (вдруг на английском? это лучше знать заранее).

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

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

Подготовиться

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

Что поможет вашим собеседникам как можно лучше разглядеть ваши сильные стороны сквозь естественное и здоровое волнение?

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

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

В-третьих, дьявол в деталях ;)

Оффлайн

  • заранее продумайте маршрут и заложите время на поиск офиса, пробки, непредвиденные задержки;

  • приезжайте за 10-15 минут до назначенного времени собеседования, чтобы успеть отдышаться и настроиться, и дать эту возможность встречающей стороне;

  • отключите телефон, когда вас уже встретили ничто не должно вас отвлекать и мешать общению.

Онлайн

  • подключайтесь по ссылке за 2-3 минуты до начала;

  • лучше звонить с компьютера собеседование может включать live-coding;

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

  • проверьте, что аккаунт приложения отображает ваши имя и фамилию, а не никнейм (в идеальном мире ваш адрес электронной почты также основан на ваших реальных имени и фамилии);

  • проверьте оплату интернета и стабильность сети;

  • камера обязательна проверьте, что с ней всё хорошо;

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

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

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

  • проходите собеседование в тихом помещении без посторонних шумов и по возможности с нейтральным фоном это поможет и вам, и другим лучше сосредоточиться и слышать друг друга;

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

И главное. Приходите или подключайтесь выспавшимися, в хорошем настроении и с интересом к происходящему ведь это действительно интересно!

Настроиться на нужный информационный контекст

Заранее почитайте (если еще не) или вспомните прочитанное ранее:

  • про компанию;

  • про проект и продукт;

  • про руководителя и команду.

Освежите свои знания о технологиях, заявленных в требованиях. Если перед собеседованием вы отправляли тестовое задание, откройте его и восстановите в памяти, что в нем было.

Подготовьте уверенный рассказ:

  • о вашем интересе к этой стажировке и компании;

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

  • о том, какие идеи у вас есть в отношении предложенной для стажировки задачи (подумайте про это заранее; поищите похожие проекты и посмотрите на них);

Подготовьте встречные вопросы вашим собеседникам. Например:

  • Каковы ценности компании? Почему вам здесь нравится?

  • Как организована работа в команде?

  • Какая зона ответственности будет у стажера?

  • Каким будет обучение и цель стажировки?

  • Какие перспективы и возможности в этом проекте?

  • Каков идеальный кандидат на эту стажировку?

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

Когда всё уже началось

Помните, что волнуетесь и вы, и ваши собеседники. Они также заинтересованы в том, чтобы ваша стажировка успешно состоялась.

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

Если вас поставили в тупик рассуждайте вслух. Задавайте встречные или уточняющие вопросы.

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

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

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

Техническое интервью

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

Ключевая часть интервью может включать:

Вопрос-размышление: как бы вы реализовали Х?

Вопросы по технологии: погуглите самые популярные вопросы на собеседованиях по вашему стеку - их, как правило, не больше ста ;)

Live coding:

  • проговаривайте свои шаги;

  • пишите тесты.

Код на листочке/доске: попробуйте это заранее дома.

Code review:

  • что этот код делает?

  • проверьте ошибки;

  • проверьте крайние случаи;

  • performance, примеры использования кода.

Тестовое задание на дом

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

На что стоит обратить внимание при подготовке тестового:

  • воспринимайте как реальный проект;

  • поймите, в чем задача (при необходимости уточните);

  • оцените время (если не установлен дедлайн) и уложитесь в него (max = 2 недели);

  • если что-то не успеваете к дедлайну опишите, что хотели бы улучшить;

  • будьте готовы к повторному собеседованию по результатам задания.

Ну, и ловите check-list для самопроверки:

  • тесты;

  • документация (описание проекта, как запустить);

  • внятные commit message / git rebase;

  • убрать мусор из репозитория;

  • запустить inspect code и добиться, чтобы ошибок не было;

  • протестировать на разных платформах/браузерах;

  • клонировать репозиторий и открыть с чистыми настройками;

  • UI: попросите кого-нибудь о конструктивном взгляде со стороны;

  • предполагаемые улучшения.

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

Пользуясь контекстом сама скажу здесь Спасибо! Екатерине Смаль (Team Lead in Educational Products, JetBrains) за экспертизу по части технического интервью и тестового задания :)

Когда вас пригласили на стажировку

Выдыхайте, но на самом деле всё только начинается!

А потому не забудьте быстро подтвердить свое участие или же сообщить о том, когда вы сможете принять это решение. Если по каким-то причинам вы отказываетесь от стажировки, то сообщите об этом как можно скорее. Это ответственное отношение к другим будет вам плюсом в карму на будущее а вдруг он вам еще пригодится?

С самого первого дня берите от своей стажировки максимум возможностей и вкладывайте максимум усилий навстречу тем, кто будет вкладываться в вас:

  • знакомьтесь с командой;

  • знакомьтесь с культурой компании;

  • задавайте вопросы;

  • погружайтесь в контекст;

  • активно вовлекайтесь во все процессы;

  • проявляйте интерес и инициативу;

  • будьте самостоятельны;

  • запрашивайте фидбек руководителя/ментора;

  • учитесь управлять своим временем;

  • развивайтесь!

Развивайтесь в любом случае

Если вы не прошли отбор на стажировку, оберните это в новые возможности для себя. Запросите обратную связь и проанализируйте полученный опыт. Учитесь. Практикуйтесь на open source проектах. Попробуйте иные варианты стажировок. Если вам не хватает какого-то опыта получите его:

  • хакатоньте;

  • участвуйте в студенческих стартапах;

  • пробуйте фриланс;

  • создавайте свои проекты;

  • реализуйте интересные учебные и научные работы.

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

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

Всем драйва!

Подробнее..

Создай мозг с нуля математические модели в нейробиологии

28.10.2020 14:12:50 | Автор: admin

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

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

Некоторые люди, как и в незапамятные времена, продолжают утверждать, что понять работу мозга невозможно, или же отрицают, что мозг порождает наш разум и сознание и т. д. Несмотря на все это, в реальности науки, работающие в этой области, делают огромные успехи и быстро сокращают пробелы в нашем понимании существующих вопросов. За последние десятилетия человечество узнало о том, что нервные клетки все-таки восстанавливаются и научилось перепрограммировать стволовые клетки так, чтобы они формировали новые нейроны [1]. Мы также выяснили, что посредством электрической стимуляции нервов можно восстановить способность самостоятельно передвигаться у парализованных пациентов с повреждениями спинного мозга [2]. Многие заболевания нервной системы сейчас можно распознать на ранних стадиях и без использования инвазивных методов или долгого мучительного сканирования: относительно простой анализ генетической информации человека позволяет выявлять многие нейродегенеративные заболевания, эпилепсии и двигательные расстройства даже до начала проявления симптомов. Появилась возможность создавать подробные карты и общедоступные базы данных, содержащие информацию о том, как конкретные гены связаны с различными заболеваниями или определенными типами поведения и как взаимодействия продуктов этих генов вовлечены в процессинг огромного потока информации в мозге. Были открыты детальные (на уровне работы индивидуальных нейронов) механизмы обработки информации о пространственном местоположении организма своего рода внутренний GPS, обеспечивающий ориентирование (за эту работу была присуждена Нобелевская премия в 2014 году)[10].

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

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

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

Рисунок 1. Подходы снизу-вверх vs сверху-вниз. Эти два подхода являются крайностями континуума различных путей к общей цели объяснению того, как именно наш мозг порождает наш разум. В целом, на данный момент существует отрицательная корреляция между когнитивной и биологической точностью моделей. Однако эта отрицательная корреляция может быть превращена в позитивную, когда когнитивные ограничения позволяют лучше понять биологические функции и когда биология служит вдохновением для создания моделей, объясняющих мыслительные процессы [3].Рисунок 1. Подходы снизу-вверх vs сверху-вниз. Эти два подхода являются крайностями континуума различных путей к общей цели объяснению того, как именно наш мозг порождает наш разум. В целом, на данный момент существует отрицательная корреляция между когнитивной и биологической точностью моделей. Однако эта отрицательная корреляция может быть превращена в позитивную, когда когнитивные ограничения позволяют лучше понять биологические функции и когда биология служит вдохновением для создания моделей, объясняющих мыслительные процессы [3].

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

Исследования в области развития НС проводятся учеными из разных сфер по всему миру. Одни ищут ответы на поставленные вопросы при помощи простых клеточных культур, другие используют более сложные in vitro системы, известные как органоиды, третьи ставят эксперименты на грызунах. В нашей лаборатории JetBrains Research используется чисто вычислительный (in silico) подход: мы разрабатываем модельный фреймворк BCNNM (Biological Cellular Neural Network Modeling), который может быть использован исследователями для построения динамических пространственных моделей развития и функционирования нервной ткани.

Наш подход

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

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

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

Результаты

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

Рисунок 2. Рост и дифференциация клеточной массы в ходе симуляции.Рисунок 2. Рост и дифференциация клеточной массы в ходе симуляции.Рост клеточной структурыРост клеточной структуры

При моделировании в режиме нормального развития полученные структуры обладают количественными соотношениями различных типов клеток и их пространственным распределением, характерными для биологических структур [4,5]. Параметры внутренней связности также сравнимы с аналогичными параметрами моделируемых in vitro и in vivo систем в норме [6]. Моделируемый органоид из миллиона клеток может содержать миллионы отростков и синапсов, которые обеспечивают связность внутри слоев и между ними. Количество и соотношение входящих и исходящих связей для клеток внутри слоя коррелирует с таковым в живых системах. В слоистых модельных структурах паттерны связывания слоев между собой сходны с тем, что можно наблюдать в слоистых структурах мозга или в церебральных органоидах. Эти паттерны связывания не случайны они следуют из молекулярных правил аксонального наведения и связывания нужных целей. Ниже можно увидеть визуализацию процесса аксонального наведения в нашей модели.

Рост аксонаРост аксона

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

Помимо моделирования нарушений процесса развития, в рамках нашего проекта проводились исследования по посттравматическому нейрогенезу [7]. Клеточная динамика после нанесения травмы продемонстрировала поведение соответствующее реальному [8, 9]: резко падает количество нервных клеток и повышается концентрация некротического фактора, что ведет к дифференциации мультипотентных стволовых клеток в нейрональные предшественники, которые мигрируют к месту травмы и в свою очередь дифференцируются в нейроны. Пример такой динамики показан на рисунке 5, а в таблице ниже приведено сравнение изменения числа пролиферирующих клеток при травме разной силы в модели и в экспериментальных данных из исследования на мышах [8].

Рисунок 3. Пример клеточной динамики после нанесения травмы в модели.Рисунок 3. Пример клеточной динамики после нанесения травмы в модели.

Перспективы применения метода

Фреймворк BCNNM может быть использован для подробного in silico воспроизведения in vitro экспериментов, направленных на получение детальных наборов параметров, характеризующих все ключевые компоненты (клетки, их компартменты, синапсы и т. д.), предоставляя новые данные для нейробиологических исследований. Это могут быть как фундаментальные вопросы, касающиеся процессов развития, так и более прикладные, связанные с различными заболеваниями центральной нервной системы, а в перспективе и с разработкой подходов для лечения некоторых из этих заболеваний. Применение фреймворка для предварительного вычислительного тестирования биологических и медицинских гипотез позволит снизить стоимость постановки лабораторных экспериментов и ускорит процесс проведения исследований.

Курс Computational Neuroscience

Помимо исследовательской деятельности, наша лаборатория вовлечена в образовательный процесс. С 2019 года мы читаем курс Вычислительные нейронауки для студентов партнерских магистратур ВШЭ и ИТМО (и любых вольнослушателей!) в рамках образовательных программ JetBrains. В прошлом осеннем семестре лекции и семинары проходили в очном формате. В ходе курса студентам были предложены базовый материал для изучения и обсуждения в аудитории, материалы для самостоятельного, более глубокого погружения, интересные практические задания по моделированию нейронов и биологических нейронных сетей. В осеннем семестре 2020 курс проходит в удаленном формате, что позволило нам значительно расширить аудиторию. Видеоматериалы будут доступны всем желающим на YouTube-канале JetBrains Research.

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

Список литературы

  1. Takahashi, J. iPS cell-based therapy for Parkinson's disease: A Kyoto trial. Regenerative Therapy, 2020, ISSN 2352-3204. https://doi.org/10.1016/j.reth.2020.06.002.

  2. Angeli, C. A., Boakye, M., Morton, R. A., Vogt, J., Benton, K., Chen, Y., Harkema, S. J. (2018). Recovery of Over-Ground Walking after Chronic Motor Complete Spinal Cord Injury. New England Journal of Medicine. doi:10.1056/NEJMoa1803588 (https://doi.org/10.1056/NEJMoa1803588)

  3. Kriegeskorte, N., & Douglas, P. K. (2018). Cognitive computational neuroscience. Nature Neuroscience. doi:10.1038/s41593-018-0210-5

  4. Caffrey, J. R., Hughes, B. D., Britto, J. M., and Landman, K. A. (2014). An in silico agent-based model demonstrates reelin function in directing lamination of neurons during cortical development. PLoS ONE 9. doi:10.1371/journal.pone.0110415

  5. Dingle, Y.-T. L., Boutin, M. E., Chirila, A. M., Livi, L. L., Labriola, N. R., Jakubek, L. M., et al. (2015). Three-dimensional neural spheroid culture: An in vitro model for cortical studies. Tissue engineering. Part C, Methods 21, 12741283. doi:10.1089/ten.TEC.2015.0135. 26414693

  6. Gerhard, F., Pipa, G., Lima, B., Neuenschwander, S., and Gerstner, W. (2011). Extraction of network topology from multi-electrode recordings: Is there a small-world effect? Frontiers in Computational Neuroscience 5. doi:10.3389/fncom.2011.00004

  7. Мыров В.О. Вычислительное моделирование посттравматического нейрогенеза. Магистерская диссертация. СПбАУ РАН, Санкт-Петербург 2018

  8. Wang, X., Gao, X., Michalski, S., Zhao, S., & Chen, J. (2016). Traumatic Brain Injury Severity Affects Neurogenesis in Adult Mouse Hippocampus. Journal of Neurotrauma, 33(8), 721733. doi:10.1089/neu.2015.4097 (https://doi.org/10.1089/neu.2015.4097)

  9. Neuberger, E. J., Swietek, B., Corrubia, L., Prasanna, A., & Santhakumar, V. (2017). Enhanced Dentate Neurogenesis after Brain Injury Undermines Long-Term Neurogenic Potential and Promotes Seizure Susceptibility. Stem Cell Reports, 9(3), 972984. doi:10.1016/j.stemcr.2017.07.015 (https://doi.org/10.1016/j.stemcr.2017.07.015)

  10. https://www.scientificamerican.com/article/how-the-2014-nobel-prize-winners-found-the-brain-s-own-gps/

Подробнее..

Из студентов в преподаватели интервью с выпускниками магистерской программы JetBrains ИТМО. Часть первая

23.11.2020 18:14:08 | Автор: admin

Преподавательский состав магистерской программы JetBrains и ИТМО Разработка программного обеспечения на четверть (!) состоит из выпускников этой же программы. Пожалуй, это хороший повод для гордости. Мы решили сделать большое интервью с ребятами. Возможно, их истории помогут кому-то решиться начать преподавательскую карьеру, а кому-то поступить к нам на программу.

В первой части наши выпускники и преподаватели Владислав Танков, Дмитрий Новожилов, Дмитрий Халанский, Алексей Зубаков, Артем Хорошев, Александр Садовников, Владислав Кораблинов и Роман Голышев рассказывают о выборе магистратуры, впечатлениях от обучения и отличиях от других программ.

Почему вы поступили на эту программу? Оправдались ли ожидания?

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

Дима Х.: Во время учебы в бакалавриате я случайно повстречался с преподававшим у параллельных групп бывшим студентом этой магистратуры Игорем Жирковым. Он впечатлил меня казавшимся тогда недоступным уровнем всестороннего понимания программирования. Особенно меня поразило, как он оперировал математическими инструментами. А я, надо признаться, в то время был убежден, что математика это про решение уравнений и неадекватных головоломок в духе правда ли, что 10 в степени 1999, если от него отнять 1999, делится на 9 и совсем меня не касается.

Это меня так впечатлило, что я решил бросить все силы на обретение этой мощи. Самостоятельное чтение книжек давалось с трудом, и я решил, что надо получить полноценное образование, где меня бы научили математически мыслить, желательно с привязкой к программированию. Я спросил у Игоря, где можно найти что-то подобное, и был готов ехать куда угодно. Каково же было мое удивление, когда Игорь сказал, что никуда ехать не надо: в СПбАУ есть такая учебная программа. (Ранее программа реализовывалась в СПбАУ. Прим. ред.)

Я увлекаюсь довольно нишевыми вещами, и в этой магистратуре мне удалось найти для себя много познавательного. Здесь каждый найдет что-то по душе. Любите машинное обучение? Пожалуйста! Хотите просто зарабатывать программированием на Java? Для этого здесь тоже все есть, и в довольно интенсивной форме. Компьютерное зрение? Алгоритмы на графах? Интерфейсы для Android-приложений? Сколько хотите. Почти любые связанные с программированием интересы тут поощряются и, скорее всего, вы найдете себе ментора. А если ваши интересы настолько особенные, что связанных с ними специалистов тут нет есть смысл подумать, а не стать ли первым соответствующим экспертом-преподавателем в этой магистратуре. Некоторые предметы начинали преподаваться именно так.

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

Леша: Я хотел закрыть пробелы в знаниях и укрепить базу, которую дали в бакалавриате. Искал какое-то хорошее место в области программирования, на тот момент это была чуть ли не единственная адекватная магистратура в Питере. Ожидания полностью оправдались. Я до сих пор иногда переслушиваю некоторые курсы и даже посещаю семинары.

Артем: В бакалавриате я учился на физическом факультете СПбГУ, но со 2-3 курса увлекся программированием. Ближе к выпуску я успел освоить основы разработки на C++ и поработать в одной компании, но у меня было чувство, что я многого не знаю в отличие от ребят, которые учились на программистских специальностях. Пришло время задуматься о магистратуре. Внимательно изучив сайт программы и поинтересовавшись у знакомых, я понял, что это именно то место, где могут дать всю необходимую базу в короткий срок. Я пришел сюда за знаниями и опытом и могу с уверенностью сказать, что получил и то и другое в полном объеме.

Влад К.: Я заканчивал 4-й курс в своем любимом УдГУ и раздумывал, чем заниматься дальше. Друг собрался поступать в физическую магистратуру СПбАУ и позвал меня туда же на информатику. Я справедливо возразил, что это невозможно, потому что туда поступают только минимум желтенькие на Codeforces. Он не менее справедливо возразил, что ну и пофиг. Я подумал месяцок и решил отправить заявку. Съездил на собеседование, и меня взяли.

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

Какие впечатления у вас остались от обучения на программе? Стоит ли что-то в ней изменить?

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

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

Саша: Впечатлений много! Наверное, большинство из них связаны с первым курсом. Было очень сложно. Пятичасовой сон, отмененные поездки за границу с друзьями, отсутствие свободного времени типичные атрибуты жизни студента первого семестра нашей магистратуры! Сейчас, конечно, понимаешь, что это было не зря. Но повторять, если честно, не очень хочется. А вот что хотелось бы повторить это второй семестр. Там ты уже научился балансировать между учебой и личной жизнью. И прямо ощущаешь себя сверхразумом, который успевает получать от жизни все и знания, и эмоции.

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

Влад К.: За два года впечатления самые разнообразные, но скажу, что такая же крутая учеба в моей жизни была до этого только в ЛМШ. Здесь невероятная атмосфера и люди, после обычного университета ты просто испытываешь эйфорию: а что, так можно было?!.. Но конечно, ничто не бывает идеальным, и изменить можно много чего как глобально, так и по каждому курсу в отдельности. Но это больше вопрос для обсуждения с кураторами, мне кажется.

Рома: Сложность прохождения программы целиком зависит от подготовленности студента. У меня были проблемы с теорией (алгоритмы, дискретка), но при этом сравнительно большой практический опыт программирования, что сильно упрощало прохождение практических курсов (Bash, Python, C++, Java). Думаю, тем, у кого не было предварительной подготовки ни в теории, ни в практике, программа дается значительно труднее. Кажется, это важно учитывать при составлении заданий, чтобы не создавать порочный круг я не могу даже понять текущее задание (потому что этот материал совершенно новый для меня) <-> я пропущу его и наверстаю потом.

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

Что, по-вашему, отличает эту программу от других магистратур? Как вы пытаетесь реализовать эти отличия в преподавании?

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

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

Леша: Я думаю, основное отличие в соучастии и компетентности. У нас есть специальные люди кураторы, которые сопровождают студентов в процессе обучения: помогают решать проблемы, готовят к защите диплома, по многу раз выслушивая докладчиков, регулярно встречаются со студентами (сейчас через Zoom), чтобы собрать обратную связь, и делают еще много всего, что сильно упрощает жизнь студентам и преподавателям все могут сосредоточиться на процессе обучения и не думать о лишнем.

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

Я как преподаватель стараюсь сделать так, чтобы студенты не выбивались из ритма домашка-лекция-домашка и им ничего не мешало эти домашки делать: проверяю работы в срок, объективно их оцениваю и оперативно отвечаю на вопросы студентов по условиям задач.

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

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

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

Рома: Мне кажется, что в этой программе принципиально другой уровень отношений между студентами и преподавателем. Когда я учился в бакалавриате, многие преподаватели были в каком-то смысле недосягаемы для меня я никогда не рассчитывал оказаться с ними на одном уровне. Между нами были строго деловые учебные отношения: преподавателю нужно закрыть ведомость, студенту нужно закрыть сессию.

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

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

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

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

Подробнее..

Открытые материалы курс по вычислительной нейронауке

04.01.2021 18:18:07 | Автор: admin

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

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

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

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

Если вас заинтересовал наш курс или какие-то отдельные темы, которых мы коснулись приглашаем вас в следующем осеннем семестре: будет еще интереснее, поскольку мы постоянно расширяем и дорабатываем контент. Прослушать курс могут все желающие. Вы также можете посмотреть все лекции 2020 года в любое удобное для вас время видеоматериалы доступны наYouTube-каналеJetBrains Research.

Слайд из лекции о кодировании и декодировании информации в НС.Слайд из лекции о кодировании и декодировании информации в НС.
Подробнее..

Слабые модели памяти буферизации записи на x86

14.10.2020 20:13:37 | Автор: admin

Об авторе


Антон Подкопаев является постдоком в MPI-SWS, руководителем группы слабых моделей памяти в лаборатории языковых инструментов JetBrains Research и преподавателем Computer Science Center.

Еще в 1979 году Лесли Лампорт в статье How to make a multiprocessor computer that correctly executes multiprocess programs ввел, как следует из названия, идеализированную семантику многопоточности модель последовательной консистентности (sequential consistency, SC). Согласно данной модели, любой результат исполнения многопоточной программы может быть получен как последовательное исполнение некоторого чередования инструкций потоков этой программы. (Предполагается, что чередование сохраняет порядок между инструкциями, относящимися к одному потоку.)

Рассмотрим следующую программу SB:



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



В этом и последующих примерах мы предполагаем, что разделяемые локации инициализированы значением 0. Тогда, согласно модели SC, у этой программы есть только три возможных результата исполнения: [a=1, b=0], [a=0, b=1] и [a=1, b=1].
Первый из них соответствует последовательному исполнению первого чередования инструкций, второй второму, а третий оставшимся четырем. Никакие другие результаты исполнения программы SB, в частности [a=0, b=0], моделью SC не допускаются.

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



Давайте проверим, что на практике все так же. Для этого мы реализуем программу
SB-impl на С++:

 1: #include <thread> 2: #include <iostream> 3:  4: using namespace std; 5:  6: int x, y, a, b; 7:  8: void thread1() { 9:  cout.flush();10:  x = 1;11:  a = y;12: }13: 14: void thread2() {15:  y = 1;16:  b = x;17: }18: 19: int main() {20:  int cnt = 0;21:  do {22:    a = 0; b = 0;23:    x = 0; y = 0;24: 25:    thread first(thread1);26:    thread second(thread2);27: 28:    first.join();29:    second.join();30:    cnt++;31:  } while (a != 0 || b != 0);32:  cout << cnt << endl;33:  return 0;34: }


Здесь аналог SB запускается в цикле (строки 2131), пока не будет получен результат [a=0, b=0]. Если он будет получен, то на экране появится номер соответствующей итерации (строка 32). (Зачем в функции thread1 на строке 9 нужна команда cout.flush(), будет описано ниже.)
С точки зрения модели SC, данная программа не должна завершиться, однако если скомпилировать этот код с помощью GCC и запустить на x86-машине,

g++ -O2 -pthread sb.cpp -o sb && ./sb

то можно увидеть на экране, например, 23022 или 56283 такие результаты получил автор, запустив данный код на своем компьютере.
Это пример показывает, что идеализированная модель SC не описывает реальное положение дел. Почему так? Откуда у программы SB берется результат [a=0, b=0]? На самом деле, причины две: компиляторные и процессорные оптимизации. Так, компилятор, в нашем случае GCC, может заметить, что инструкции в левом (аналогично и в правом) потоке программы SB независимы друг от друга, и, как следствие, может их переставить:



Для этой программы [a=0, b=0] является корректным с точки зрения модели SC. И эта перестановка действительно происходит! Для того чтобы в этом убедится, можно посмотреть на ассемблерный код, который GCC генерирует для функции thread1:

g++ -O2 -c -S sb.cpp

1: ...2: call    _ZNSo5flushEv@PLT3: movl    y(%rip), %eax4: movl    $1, x(%rip)5: movl    %eax, a(%rip)6: ...

На строке 2 происходит чтение из переменной y и значение записывается в регистр eax, на строке 3 происходит запись в переменную x значения 1, а на строке 5 значение из регистра eax записывается в переменную a.

Зачем нужен вызов функции cout.flush()
Теперь пришло время объяснить, зачем нужен вызов функции cout.flush(). Как было упомянуто ранее, поскольку запись в x и чтение из y независимы, то компилятор, в нашем случае GCC, может принять решение их переставить. Тем не менее, он не обязан этого делать: например, GCC не проводит перестановку для функции thread2. Для того чтобы сделать перестановку, компилятор должен предположить, что код после перестановки станет более эффективным. И, как показала практика, вызов функции cout.flush() заставляет GCC считать, что инструкции стоит переставить. При этом необязательно использовать именно эту функцию достаточно функции, вызов которой GCC не уберет как бесполезный. Так, печать не пустой строки cout << " " подойдет, а вызов арифметических функций sqrt() и abs() без использования их результата не подойдет.

Отметим, что cout.flush() не делает ничего в в программе SB-impl, хотя GCC и не может это вывести самостоятельно: cout.flush() сбрасывает буфер вывода в консоль, однако на каждом вызове cout.flush() буфер пуст, поскольку программа пишет в консоль только в конце (строка 34).

Есть способ явно запретить компилятору переставлять инструкции чтения и записи в функциях thread1 и thread2. Для этого достаточно вставить компиляторный барьер памяти asm volatile("" ::: "memory") между инструкциями (в данном случае добавление инструкции cout.flush() не меняет ничего):

void thread1() {  x = 1;  asm volatile("" ::: "memory");  a = y;}void thread2() {  y = 1;  asm volatile("" ::: "memory");  b = x;}

Тем не менее, если запустить программу с компиляторными барьерами, то все еще можно получить результат [a=0, b=0], поскольку, как было упомянуто ранее, не только компилятор, но и процессор может быть причиной появления результатов, выходящих за пределы модели SC результат [a=0, b=0] для программы SB не только разрешается спецификацией архитектуры x86, но и наблюдается на большинстве процессоров семейства x86.

Для того чтобы понять, как подобный результат получается на процессоре, нужно обратиться к модели памяти архитектуры, т.е. к ее формальной семантике. Модель памяти архитектуры x86 называется TSO (total store order). TSO разрешает исполнения программ, выходящие за пределы модели SC, в частности исполнение программы SB, завершающиеся с результатом [a=0, b=0]. Такие исполнения называются слабыми, как и допускающие их модели памяти. Все основные процессорные архитектуры (x86, ARM, RISC-V, POWER, SPARC) обладают именно слабыми моделями памяти.

Схематически модель TSO можно изобразить так:



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

Рассмотрим исполнение программы SB в модели TSO, которое заканчивается с результатом [a=0, b=0]. В начале исполнения состояние программы и памяти выглядит следующим образом:



P обоих потоков показывают на первые инструкции, все локации в памяти проинициализированы 0, а регистры a и b не определены. Далее левый поток выполняет инструкцию записи в локацию x, и соответствующий запрос попадает в буфер записи:



Далее правый поток может выполнить аналогичный шаг:



Теперь правый поток выполняет инструкцию чтения из локации x. Поскольку в его буфере нет запроса на запись в эту локацию, поток получает значение из основной памяти, присваивая соответствующее значение 0 регистру b:



Аналогичным образом левый поток присваивает значение 0 регистру a:



После чего запрос из буфера левого потока попадает в память:



А за ним и запрос из буфера правого потока:



Так, в модели TSO получается слабое исполнение для программы SB. Кстати, название программы SB является аббревиатурой от store buffering эффекта, наблюдаемого в ее слабом исполнении.

Тем не менее, существует способ запретить результат [a=0, b=0] для программы SB-impl, а значит и реализовать алгоритм Деккера на архитектуре x86. Для этого в программу нужно добавить процессорный барьер памяти mfence специальную инструкцию x86 которая, как и ранее использованный компиляторный барьер, запрещает GCC переставлять инструкции вокруг нее, но и дополнительно требует при своем исполнении уже на процессоре, чтобы буфер записи соответствующего потока был пуст:

void thread1() {  x = 1;  asm volatile("mfence" ::: "memory");  a = y;}void thread2() {  y = 1;  asm volatile("mfence" ::: "memory");  b = x;}

Так, чтение a :=[y] в левом потоке исправленной программы SB-impl может быть выполнено только после того, как запись [x] := 1 обновила основную память. Аналогичное утверждение верно для чтения b := [x] из правого потока. В итоге результат [a=0, b=0] становится невозможным.

Заключение


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

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

Семинары лаборатории языковых инструментов JetBrains Research

29.10.2020 20:09:21 | Автор: admin
Лаборатория языковых инструментов совместная инициатива JetBrains и математико-механического факультета СПбГУ.

Сотрудники лаборатории исследуют:
  • формализацию и верификацию семантики языков программирования в контексте слабых моделей памяти;
  • логическое и реляционное программирование;
  • теорию формальных языков и ее применения;
  • метапрограммирование, специализацию и частичные вычисления;
  • формальную верификацию и применение SMT-решателей.

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



Прошедшие доклады:

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

Первым шагом к решению этой проблемы является формализация файловых систем. В докладе мы рассмотрим Linux ext4 и её формальную модель, интегрированную с моделью памяти C/С++11. Кроме того, обсудим адаптацию алгоритма проверки моделей GenMC для верификации программ, работающих с файлами. В конце будут приведены примеры ошибок, которые удалось найти с помощью адаптированного GenMC в текстовых редакторах, таких как vim и nano.

Докладчик: Илья Кайсин

Ссылка

Реализация сжатия ссылок в кучу в GraalVM Native Image
В некоторых приложениях размер адресного пространства существенно превышает размер области памяти, на которую может ссылаться указатель. Сжатие ссылок позволяет уменьшить размер приложения и ускорить его выполнение и старт. Рассматриваются варианты реализации сжатых ссылок. Демонстрируется способ легкого введения сжатия ссылок в хорошо организованную реализацию языков программирования.

Докладчик: Олег Плисс

Ссылка

Слегка субкубический алгоритм для задачи поиска путей с контекстно-свободными ограничениями
Все мы так или иначе сталкиваемся с задачами, решаемыми за полиномиальное время. Но есть такие задачи, для которых кубическое или, например, квадратичное время работы является слишком неэффективным для использования на практике. Возникает вопрос, может ли конкретная задача быть решена немного быстрее, например, хотя бы за субкубическое (n^{3-e}) (или субквадратичное) время? Если нет, то как показать, что такое время работы оптимально?

В докладе будет рассмотрена одна из таких задач задача поиска путей с контекстно-свободными ограничениями (CFL-reachability), к которой сводится большое количество задач анализа программ. Вопрос о существовании субкубического алгоритма для решения этой задачи является открытым уже более 30 лет. Оптимально ли классическое кубическое решение? Мы попробуем ответить на этот вопрос, используя инструменты современного направления теории сложности fine-grained complexity. Также будет показано, как ускорить время решения на логарифмический фактор, получив тем самым "слегка субкубический" алгоритм для задачи CFL-reachability.

Докладчик: Екатерина Шеметова

Ссылка

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

Докладчик: Екатерина Вербицкая

Ссылка

Проверка моделей в слабых моделях памяти
Проверка моделей это метод автоматической формальной верификации программ. На сегодняшний день большинство инструментов для проверки моделей либо не учитывают эффекты, возникающие в слабых моделях памяти, либо работают только с некоторой фиксированной моделью. Среди этих инструментов выделяется GenMC, который не привязан к конкретной модели памяти. GenMC может работать с широким классом моделей (в который входят, например, модели RC11 и IMM). Тем не менее наиболее сложные и интересные модели (Promising, Weakestmo) не поддерживаются, так как эти в этих моделях не выполняются некоторые свойства, подразумеваемые GenMC. Кроме того, оказывается что и сами эти модели (Promising, Weakestmo), настолько слабые, что какой-либо алгоритм их проверки может оказаться неприменимым на практике.

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

Докладчик: Евгений Моисеенко

Ссылка

Логическое программирование высшего порядка
В докладе мы познакомимся с языком программирования Prolog. Объединяя логическое программирование с программированием высшего порядка, Prolog позволяет естественным образом поддерживать HOAS для описания языков, избавляя программиста от необходимости ручной работы со связываниями переменных. В случае с отношениями высшего порядка унификация является неразрешимой, однако существует некоторое подмножество языка, на котором унификацию всегда можно выполнить. Я расскажу про то, зачем нужно логическое программирование высшего порядка и как в нем реализовать унификацию.

Докладчик: Екатерина Вербицкая

Ссылка

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

Докладчик: Даниил Березун

Ссылка

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

Докладчик: Дмитрий Косарев

Ссылка

О представимости инвариантов программ с алгебраическими типами данных
Со времён появления логики Хоара принято выражать свойства и сертификаты корректности программ на языках первого порядка. Современные методы автоматического вывода индуктивных инвариантов программ ориентированы на представление инвариантов также в логике первого порядка. Хотя такие представления очень выразительны для некоторых теорий (LIA, LRA BV, теория массивов), они не позволяют выразить многие интересные свойства программ над алгебраическими типами данных (АТД).

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

Докладчик: Юрий Костюков

Ссылка

Разработка компиляторов предметно-ориентированных языков для спецпроцессоров
В составе современных вычислительных систем все чаще используются аппаратные спецпроцессоры, программируемые на предметно-ориентированных языках. Популярность набирает подход compiler-in-the-loop, предполагающий совместную разработку спецпроцессора и компилятора. При этом традиционный инструментарий, GCC и LLVM, оказывается недостаточным для быстрой разработки оптимизирующих компиляторов, порождающих целевой код нетрадиционной, нерегулярной архитектуры со статическим параллелизмом операций.

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

Докладчик: Пётр Советов

Ссылка

Логика некорректности
Всем хорошо известна так называемая логика корректности Хоара, позволяющая формально доказать, что программа работает правильно. А что если мы захотим формально доказать, что в программе есть баг? Например, что программа упадет, если дать ей на вход очень большую строку, при этом не уточняя, какая именно это строка. Оказывается, процесс доказательства наличия бага в программе можно формализовать так же, как мы формализуем доказательство корректности с помощью логики Хоара, используя Логику Некорректности В докладе мы поговорим про Логику Некорректности: обсудим ее связь с логикой корректности Хоара, посмотрим на ее натуральный вывод и семантику, отловим пару багов и, наконец, рассмотрим, как она связана с Динамической Логикой и Relation Algebra.

Докладчик: Владимир Гладштейн

Ссылка

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

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

Докладчик: Дима Розплохас

Ссылка

Ближайший доклад 2 ноября сделает Антон Трунов по теме Неразличимые доказательства: по определению, но без аксиомы К. Присоединяйтесь в 17:30 в Google Meet по ссылке.

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

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

Чтобы получать анонсы наших семинаров:
Подробнее..

О стажировках для тех, кто еще не ) Эпизод 1

01.04.2021 22:22:46 | Автор: admin

Привет! Недавно я в соавторстве с Ириной Резняковой из Yandex провела несколько экспериментальных мастер-классов IT Career Mind Map для студентов CS центра, а также СП и МААД в СПбГУ. Предыстория у него была долгая, уходящая корнями в опыт организации стажировок, экспертизу коллег из JetBrains & Yandex, а также переплетающаяся с проектами, которыми я занимаюсь сейчас в JetBrains Learning Research Lab и PM-школе в CS центре. Есть ощущение, что эксперимент удался, а потому хочется поделиться некоторыми мыслями в помощь тем, кто стоит на пороге получения первого опыта в профессии. Поскольку мыслей много, то будет несколько постов, и первый про базовые настройки.

С чего начать?

С самопознание. Если вам предстоит первая стажировка, начните с определения того, что вам ближе. Если на этом этапе вы чувствуете затруднения, посмотрите вокруг: какие программы стажировок предлагает ваш вуз? Не знаете? Спросите у ваших кураторов или поищите информацию на Ярмарках вакансий. Не нашли ничего интересного в своем вузе посмотрите, что происходит в других, или погуглите рейтинги IT-работодателей в вашем городе. Из них можно выделить ключевые компании и поискать, есть ли у них программы стажировок. Читайте! Читайте и наблюдайте, что вам откликается.

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

Расставьте приоритеты

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

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

Экспериментируйте

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

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

Адаптируйтесь под ситуацию

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

только честно!

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

SEO-оптимизация себя

Прежде чем заполнять заявку на стажировку, почитайте, как пишет компания: описания вакансий, пресс-релизы продуктов, блоги и интервью с ключевыми спикерами. Загрузите в себя этот словарный запас. Для эффективности можно собрать в список фразы из статей компании и потом их по-своему комбинировать, формулируя описание своего опыта и интересов. Только честно! Таким образом вы станете гораздо ближе к тому, чтобы разговаривать с профессионалами из индустрии на одном языке. Это важно и для взаимопонимания, и для вашего развития.

Лайфхак

А чтобы не волноваться перед собеседованиями репетируйте! Проговаривайте вслух рассказ о себе, своих интересах и опыте, формулируйте и задавайте встречные вопросы, которые помогут вам лучше понять, что и как предстоит делать на стажировке. Наедине с собой перед зеркалом, глядя себе в глаза (я не шучу!) раз. Наедине с собой в Zoom, включив запись, и потом, посмотрев на себя со стороны, и еще раз с кем-то из друзей два. Офлайн с кем-то из тех, кто может дать вам полезную обратную связь и доброжелательно поддержать три. Главное говорите! Проговаривайте свои мысли вслух как можно больше в реальности они звучат совсем не так, как мы слышим их у себя в голове. И чем лучше вы разговоритесь в домашних условиях, тем легче будет преодолеть волнение в реальности.

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

Нам нужен план!

Целенаправленная подготовка к наборам на стажировки требует и времени, и ресурсов вашего мозга. Чтобы он работал эффективно, важно равномерно распределить нагрузку. Откройте свой календарь и занесите в него все дедлайны по интересным для вас программам не забыв про лекции, зачёты и экзамены (если вы учитесь) и другие важные дела. Посмотрите, где образовались наслоения и подумайте, как эти периоды можно разгрузить и что можно сделать заранее. Запланируйте конкретные дни и часы для подготовки к конкурсам так, как если бы это были спортивные тренировки. И (барабанная дробь) just do it!

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

И всё же немного рецептов...

вас ждет в следующих сериях ;)

Поговорим о том, как готовиться к собеседованиям, вести себя во время интервью и что делать, когда всё это наконец закончится (спойлер на самом деле, нет). Не переключайтесь!

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru