Курс инфопоиска на Зимней Пущинской Школе: учим старшеклассников создавать поисковые системы

В наших технопроектах преподают более 200 коллег. Но многие этим не ограничиваются и проводят мастер-классы, курсы и лекции и на других образовательных платформах. Один из таких энтузиастов — Роман Васильев, который этой весной провел курс по инфопоиску в Зимней Пущинской Школе. Под его руководством всего за шесть занятий школьники 7–11 классов (!) написали свой поисковик и защитили проект. Как им это удалось, что это за поисковик и для чего проводится ЗПШ — в философской, вдумчивой, легкой, с изрядной долей юмора статье Романа Васильева.


lkcumbvjfigjsxsy872d6xhg3gw.png


Вступление. Куда идет наше образование, und was können wir dagegen tun?


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


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


На деле я часто слышу от учителей о том, что ученики просто не хотят учиться, а от учеников — что иногда выпадают целые дисциплины, например, программирования в некоторых школах не было как такового. Да-да, вот приходит ко мне группа студентов-геологов, мне нужно учить их информатике, а уровень знаний у них у всех «как повезет», при этом очень трудно адаптировать курс. Или, например, расхожее явление, что на уроках литературы ученикам снижают отметки лишь за то, что они не согласны с мнением учителя и отражают это в своих сочинениях. Понимают ли учителя свой предмет досконально, интересуются ли им искренне? Увы, не все. И неудивительно, если учесть, что старшее поколение учителей неизбежно уходит из жизни, а после распада СССР жизнь учителя стала скорее выживанием, в результате сильные абитуриенты просто обходили педагогические вузы стороной. Разве можно заинтересовать ребенка чем-то, когда сам этим не «горишь»?


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


ЗПШ. Идея


Оказывается, есть остров, где мир знаний играет всеми красками, где уроки — это общение и сотворчество, куда ученики приезжают даже издалека и проводят там каникулы. Это Зимняя Пущинская Школа. Ах, знать бы мне о ней 15 лет назад! Расположенная в небольшом городе Пущино, на берегу Оки и неподалеку от Серпухова, она существует с 1990-го года. В конце марта прошел ее 28-ой сезон. Одна из основных целей школы — дать возможность ученикам взглянуть на учебный процесс под другим углом, погрузить их в другую атмосферу, предоставить им самим выбирать то, что интересно. Более 15 лет общее руководство проектом осуществлял Михаил Абрамович Ройтберг, д. ф.-м. н., заведующий лабораторией прикладной математики ИМПБ РАН, заведующий кафедрой алгоритмов и теории программирования ФИВТ МФТИ. К сожалению, прошлым летом он ушел из жизни, и сейчас руководство школы коллегиальное, в оргкомитет входят, в основном, ученые и преподаватели ВУЗов.


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


Cтруктура школы. Активности


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


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


Поскольку Школа чем-то напоминает лагерь, куда дети приезжают чуть более, чем на неделю, есть возможность быть вожатым. Всем сотрудникам компенсируется проезд и проживание в Пущино. Мне приходилось ездить туда на автобусе 6 дней подряд, потому что работу никто не отменял. Было довольно тяжело: в 9 часов утра выдвигался, к полудню успевал на третью ленту, проводил занятие, обедал и возвращался в Москву, в офисе оказывался примерно в половине пятого. Работал, сколько было сил, после полуночи возвращался домой и перед сном готовился к следующему занятию. В следующем году, наверное, возьму отпуск, к тому же сам бы посетил некоторые курсы, особенно по психологии, а вставать в 5:30 утра к первой ленте — это просто убийство.


Мои первые впечатления. Место, атмосфера, люди


Да, это длится всего неделю, но заряда, который там получаешь, хватает надолго. Воскресенье, утро, через заснеженные поля и лес автобус приносит меня в Пущино. Гимназия расположена на въезде в город, в микрорайоне с загадочным названием «АБ». В здании из красного кирпича, раскинувшемся буквой «П», все были приглашены в Красный зал на торжественное открытие Школы. Когда я там оказался, взглянул на лица людей вокруг, на меня накатила ностальгия: я вспомнил, как ездил на олимпиады по математике и физике. Только на этот раз я был в другом качестве, когда не нужно решать задачи и соревноваться.


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


mnfcanytfceeg1r9vnkyd0qyuzm.png


На первом этаже рядом со штабом было оборудовано «Африканское кафе», где всегда можно было выпить чаю, кофе и полакомиться фруктами.


Три раза ровно по 10 минут ты рассказываешь о курсе. В конце дня ученики делают свой выбор. Всего около 200–300 школьников выбирают для себя по 3 курса из нескольких десятков. Курсы по анализу данных и нейросетям, как я посмотрел, оказались популярнее, а ко мне на информационный поиск записалось 6 человек. Надо сказать, это хорошо: не слишком мало, и не слишком много, удобно вести диалог. Боялся, что будет меньше.


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


Одна из проблем ЗПШ — нехватка компьютерных классов. Мне достался кабинет русской словесности. Проектор нашелся, WiFi в том месте ловил так-сяк, пришлось использовать мобильный. Ноутбуки были не у всех, и я брал с собой два: с одного — показывал презентацию, другой — отдавал для практикумов.


Дни занятий. Как выстроился курс инфопоиска: темы, учебный процесс


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


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


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


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


Насколько успели, разобрали код индексатора. К этому времени парни уже запилили красивый веб-интерфейс для поисковика, который только и ждал, пока его прикрутят к бэкенду. На четвертый день после занятия мы с Даней (один из моих учеников) нарисовали эмблему курса. На последнем занятии по просьбам радиослушателей я рассказывал о методах поиска дубликатов. Ребята узнали, что такое шинглы, как работает алгоритм Minshingle. А с алгоритмом Бродера проблем не возникло, потому что на курсе по обработке больших объемов данных объяснили, как работает MapReduce. И под конец — небольшой хакатон, где мы настроили индексатор на те данные, что нам навыкачивал краулер, и самым топорным способом реализовали генерацию сниппетов.


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


Герои курса. Пара слов от меня, интервью с ребятами: Даня Горлов, Артем Брустовецкий, Катя Хватова


А как же им-то — и не втащить? «If we can’t get it all, then nobody will.»


Такой энергии, неукротимого энтузиазма, такого сияния талантов я не видел еще ни в одной аудитории, где мне доводилось ранее преподавать. А выучил я, ни много ни мало, пять групп геологов-горючников в МГУ. Как виделось с моей стороны, занятия были похожи на диалог, а если внимание и рассеивалось, то это означало, что все смотрят в код. Здесь мне хочется сказать многое, и я сталкиваюсь с той трудностью, что можно точно передать мысль словами, но чувства не всегда поддаются. Отец спросил меня в воскресенье: «И вот не лень тебе было мотаться каждый день за сто километров? Заняться тебе, что ли, больше нечем? Когда диссер, наконец, напишешь?»


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


Кто же они — мои ученики?


Даниил Горлов


om39bt6f5nqp9snz1aml4hmifcu.png


Учится в 7-ом классе школы-пансиона «Дубравушка» г. Обнинска, интересуется web-программированием, IT в целом и технологиями информационного поиска в частности. И особенно — программированием микроконтроллеров, на базе которых он разработал систему управления теплицей через Интернет. Система умеет считывать данные об уровне воды в баке, влажности и температуре воздуха, и осуществляет автоматический климат-контроль. Еще один проект Дани — реализация сетевого протокола под Arduino, созданного в противовес HTTP, в том числе на низком уровне. Главной отличительной особенностью протокола является модульность и расширяемость. Его основной язык программирования — Python, в область интересов попадают фреймворк Flask, распределенные вычисления в парадигме MapReduce с помощью Hadoop. В планах — освоить технологии обработки больших объемов данных, машинное обучение, deep learning. А затем создать операционную систему для нейроинтерфейса. Уверен, у него получится.


Артем Брустовецкий


m0n1xvvn0cgql00aed5xwzggow8.png


Ученик 11-го класса из Пущино, посещает ЗПШ уже шестой год подряд и безумно увлечен программированием. Его выбор пал на курс по инфопоиску, поскольку эта дисциплина связана с web- и backend-разработкой, которыми он интересуется, а еще — потому что здесь была отличная возможность писать код. Опасения Артема по поводу понимания материала не оправдались, и под конец он научился программировать поисковые системы, чему был очень рад. Самым лучшим и самым любимым языком программирования для Артема является Python, к написанию кода на нем он относится с особым тщанием и стремится довести его качество до совершенства. Больше всего Артему нравится сетевое программирование, многопоточность, сокеты и разработка игр. Сейчас он создает игру на Unity, основной упор делает на реализацию серверной части и производительность при передаче данных. Планирует развиваться в таких отраслях, как машинное обучение, нейросети, и далее повышать свой уровень в web-разработке. Одна из идей, которые ему хочется воплотить в жизнь, это преобразование Веба в децентрализованную систему, в которой каждый участник хранил бы свой кусочек данных. Впечатления от Школы у Артема самые светлые, и всем школьникам он советует обязательно попасть сюда и погрузиться в эту неповторимую атмосферу.


А теперь дадим несколько слов Кате Хватовой, ученице 11-го класса из Москвы.


9sfxwtf7bwrof0dkbqnjq9wdabw.png


«Я оптимист по жизни, увлечения достаточно разнообразны, но основные — это биология и программирование. Выбрала этот курс, так как мне понравилась сама тема, я очень интересуюсь принципами работы поисковиков типа Поиска Mail.ru Для меня эти занятия были очень необычными и интересными за счет достаточной сложности. Иногда было слишком сложно, ведь я пришла на курс, почти не зная языка. Несмотря на это, сами принципы работы мне стали понятны сразу, так как способ преподавания был очень удобен. Если смотреть со стороны, я была самым слабым программистом, но мне понравилось. Я узнала очень многое — например, как можно давать более понятные для поисковика запросы, а это может очень помочь в будущем. У нас было достаточно мало практики, но мне это понравилось, ведь я больше хотела научиться не программированию (хотя и этому тоже), а самим принципам. Меня интересуют самые разные языки, но больше всего Java и C++, потому что в последнее время используются в основном они. Также это одни из самых удобных языков. Но, несмотря на это, в данный момент я использую Паскаль, на нем у меня есть несколько проектов. Сам мир программирования очень разнообразен, для меня интересны отрасли, граничащие с биологией, например, нейросети и биоинформатика. На самом деле я научилась всему, чему хотела, и очень радуюсь, что выбрала этот курс».


Итоги курса. Поисковик. Что получилось у ребят


И теперь настал самый торжественный момент: показать результаты того, что мы сделали в течение курса и еще двух недель после него. А это, пусть небольшой и немного урезанный, но всё же работающий web-поисковик. Он сейчас развернут на сервере по адресу http://alphase.ru/, ссылка на исходники здесь. Вот его архитектура:


nwmq3_bciddtm8zfhzxtlnmjmze.png


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


С одной стороны, краулер обходит Интернет-страницы, учитывая содержание файлов robots.txt и обрабатывая возможные ошибки протокола HTTP, скачивает их и сохраняет на диске. В настоящий момент получена небольшая коллекция веб-документов с портала habrahabr.ru. Исходная HTML-разметка обрабатывается утилитой Boilerpipe, которая используется как внешняя система, «черный ящик». В результате остается только текстовый контент страниц без обвязки (header, footer), меню сайта и рекламы. Индексатор перед началом работы запускает утилиту удаления дубликатов, а затем обрабатывает текст документов и формирует индекс и словарь. Для обнаружения дубликатов документов используется алгоритм Minshingle. Размер индекса на текущий момент небольшой, порядка нескольких десятков тысяч документов, но мало-помалу увеличивается за счет новых поступлений от краулера.


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


Все компоненты написаны на Python 3.6, за исключением Boilerpipe, который использован в виде jar (Java-приложение). Индекс и словарь представлены в бинарном виде для быстрого поиска в больших коллекциях. В настоящий момент создается подсистема ранжирования результатов на основе простых текстовых признаков.


gzf_gxgq75w3jvvrszrcknt4ors.png


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


knrktof-uda5d5plhlc0uqrly0u.png


И самое классное здесь вот что: оно работает!


mg2xczjtacdyqy9kyzrewxjtedi.png

© Habrahabr.ru