В феврале мы запустили бесплатный онлайн-курс программирования на С++, рассчитанный на продвинутых разработчиков. Цели было в основном две — сделать так, чтобы в мире было больше хороших программистов, а заодно набрать себе пополнение в команду. Идея взлетела: участвовать в первом наборе захотело 185 человек из 57 городов и 8 стран. В курсанты попало 30 из них, но со словами «неинтересно» ушёл только 1. Остальные по итогам курса сообщили, что было в целом круто и они с пользой провели время.
Обкатав всю затею и учебный процесс на начальном бета-наборе, мы решили повторить курс ещё раз. Набор уже во всю идёт, подать заявку можно до понедельника, 26 июня. Чему, как и кто учит — рассказываем внутри.
UNIGINE С++ School — это курс для тех, кто уже умеет и практикует C++, любит выжимать производительность, но пока ещё не Степанов, не Александреску и не компания EA. И свой первый STL ещё не написал.
Мы назвали «продвинутым», но на самом деле стоило назвать его «углубленным». В целом курс для тех, кому уже становится небезразлична скорость работы программ и детали внутреннего устройства важных чёрных ящиков. Если хотите посмотреть, как ускорять программы в разы, если вам интересен достаточно низкий уровень кода и его связь с железом, и если вы хоть иногда считаете миллисекунды — курс наверняка вам будет полезен.
Всего в первом курсе 8 лекций, 7 практических занятий и домашние работы. По первому опыту учёба предстоит очень интенсивная, но и эффект соответствующий.
Придумал курс и ведёт занятия Андрей Аксёнов, он же Шодан, ведущий разработчик команды 3D-движка UNIGINE, а также автор поискового движка Sphinx, на котором работает Хабр, например.
Антон Тарасов, Новосибирск
Сергей Коптев, Москва (ООО ПФ «Логос»)
Ренат Дусаев, Томск
Александр Баранов, Красноярск
Игорь, Томск
Павел Наказненко, Красноярск
Курс бесплатный, но предполагает наличие у вас базовых скиллов. Так что зачислять в курсанты будем по итогам входного тестирования. Подать заявку и пройти входной тест можно на сайте школы до понедельника, 26 июня.
Важный update:
Нас многие просили сделать приём заданий под Linux, и мы сделали. Теперь входной тест для поступления можно компилировать и под Windows MSVC 2013, и под Linux gcc 5.4.0.
И даже больше — мы сделаем это за вас. При приёме задания ваш код пройдет автопроверку на компилируемость, и мы пришлём вам отчёт, чтобы вы были уверены, что программа собралась на нашей стороне. Если всё хорошо, код будет проверяться уже вручную Шоданом. Если нет — у вас есть неограниченное количество попыток!
А на закуску, тизер нового сезона.
Обкатав всю затею и учебный процесс на начальном бета-наборе, мы решили повторить курс ещё раз. Набор уже во всю идёт, подать заявку можно до понедельника, 26 июня. Чему, как и кто учит — рассказываем внутри.
Чему учат?
UNIGINE С++ School — это курс для тех, кто уже умеет и практикует C++, любит выжимать производительность, но пока ещё не Степанов, не Александреску и не компания EA. И свой первый STL ещё не написал.
Мы назвали «продвинутым», но на самом деле стоило назвать его «углубленным». В целом курс для тех, кому уже становится небезразлична скорость работы программ и детали внутреннего устройства важных чёрных ящиков. Если хотите посмотреть, как ускорять программы в разы, если вам интересен достаточно низкий уровень кода и его связь с железом, и если вы хоть иногда считаете миллисекунды — курс наверняка вам будет полезен.
Программа занятий в деталях
Занятие #1.
Мировые константы.
Про стоимости операций CPU/RAM/HDD, про устройство частей C++ рантайма, про вытекающие оптимизации.
Занятие #2.
Всем «известные» азы.
Массивы, вектора, баги. И как правильно бенчмаркать.
Занятие #3.
Списки всех сортов.
Когда и зачем они нужны на практике. Паззл для собеседования. Плюс сортировки и поиски, если успеем.
Занятие #4.
Хеши и все такое.
Cами таблицы, функции, коллизии и по самые фильтры Блума. И ещё чуток KV-структур, если успеем.
Занятие #5.
Композитные структуры.
Складываем любое нужное слово из только что изученных букв В, С, Х.
Занятие #6.
Деревья и кучи (heaps).
И укладка «сложной» структуры в тупой массив.
Занятие #7.
Обзор эзотерических структур данных.
От тупого circular buffer до адовых HyperLogLog.
Занятие #8.
Бонус: обзор устройства 3D графики.
От векторов и матриц (с разбором) и до современных техник рендера (без подробного разбора).
Мировые константы.
Про стоимости операций CPU/RAM/HDD, про устройство частей C++ рантайма, про вытекающие оптимизации.
Занятие #2.
Всем «известные» азы.
Массивы, вектора, баги. И как правильно бенчмаркать.
Занятие #3.
Списки всех сортов.
Когда и зачем они нужны на практике. Паззл для собеседования. Плюс сортировки и поиски, если успеем.
Занятие #4.
Хеши и все такое.
Cами таблицы, функции, коллизии и по самые фильтры Блума. И ещё чуток KV-структур, если успеем.
Занятие #5.
Композитные структуры.
Складываем любое нужное слово из только что изученных букв В, С, Х.
Занятие #6.
Деревья и кучи (heaps).
И укладка «сложной» структуры в тупой массив.
Занятие #7.
Обзор эзотерических структур данных.
От тупого circular buffer до адовых HyperLogLog.
Занятие #8.
Бонус: обзор устройства 3D графики.
От векторов и матриц (с разбором) и до современных техник рендера (без подробного разбора).
Как все происходит?
Всего в первом курсе 8 лекций, 7 практических занятий и домашние работы. По первому опыту учёба предстоит очень интенсивная, но и эффект соответствующий.
Кто ведёт?
Придумал курс и ведёт занятия Андрей Аксёнов, он же Шодан, ведущий разработчик команды 3D-движка UNIGINE, а также автор поискового движка Sphinx, на котором работает Хабр, например.
Отзывы участников первого набора
Магия оптимизации, которую Шодан показал в первом задании, выглядела впечатляюще. Узнал, в каких местах можно обогнать std и что это делается малой кровью. В первый раз услышал об устройстве hash-таблиц. Узнал, как бенчмаркать свой код, чтобы компилятор всё не соптимизировал. Не смотреть информацию в книгах/статьях, а проверять самому, потому что время идёт, многое меняется и то, что раньше работало медленно, сейчас может быть реализовано достаточно быстро.
Антон Тарасов, Новосибирск
Очень много нового, причём, в тех областях, которые считал давно проясненными и закрытыми для экспериментов.
— Об особенностях использования STL. Ещё раз покопался в его внутреннем устройстве, с более критическим подходом. С вопросом «А что в нём плохо?».
— Много новых фишек про оптимизацию программ. Часть из них слышал — но «мимо», не применял. Как все эти бесконечные закладки в браузере из серии «будет время — разберусь».
— Некоторые вещи были для меня совсем новые. Trie-tree, например. Даже не слышал о такой штуке. Не так, чтобы это перевернуло вселенную вверх ногами, но рассказано это было понятно, и наверняка пригодится.
Сергей Коптев, Москва (ООО ПФ «Логос»)
Что узнал нового? Что STL действительно можно уделать на порядок, и это проще чем кажется. Что для внятной оптимизации нужно знать намного больше чем мне известно сейчас.
Ренат Дусаев, Томск
Что узнал? На самом деле, много. Понял насколько крут и на самом деле «разноуровнев» C++. Тематические штуковины (например размытый ключ деревьев на примере). Ссылки, подобранные уже в скайпе. Например про битхаки в духе nonbranching code.
Александр Баранов, Красноярск
Никогда не пробовал замерять собственно скорость работы STL контейнеров, и думал что он и так норм. В процессе курса я был вынужден этим заняться и своими руками получил нужные мне результаты на собственном железе. Кое-какие взгляды на STL поменялись.
Оценил inplacement new подход к инициализации объектов и malloc для аллокации памяти. Раньше всегда пользовался new, но, видимо, просто не вставало нужды что-то оптимизировать до такой степени.
Игорь, Томск
Узнал про Bloom filter, экзотические и композитные структуры данных. Маленькие трюки, типа компактной укладки сложных структур в линейный массив. Привёл в порядок голову и систематизировал знания. Была пара моментов, когда думал что знаешь как оно работает, а потом случалось озарение. Сборка собственного велосипеда оказалась не таким очевидным делом.
Павел Наказненко, Красноярск
Хочу учиться, как поступить?
Курс бесплатный, но предполагает наличие у вас базовых скиллов. Так что зачислять в курсанты будем по итогам входного тестирования. Подать заявку и пройти входной тест можно на сайте школы до понедельника, 26 июня.
Важный update:
Нас многие просили сделать приём заданий под Linux, и мы сделали. Теперь входной тест для поступления можно компилировать и под Windows MSVC 2013, и под Linux gcc 5.4.0.
И даже больше — мы сделаем это за вас. При приёме задания ваш код пройдет автопроверку на компилируемость, и мы пришлём вам отчёт, чтобы вы были уверены, что программа собралась на нашей стороне. Если всё хорошо, код будет проверяться уже вручную Шоданом. Если нет — у вас есть неограниченное количество попыток!
А на закуску, тизер нового сезона.
Поделиться с друзьями
kronos
Как выполнить тестовое задание если у меня мак?
monah_tuk
Даже так, как выполнить задание, если нет возможности проверить в VS 2013? У меня на всех доступных компах — Linux :-)
masterspline
Писать понятно, что не под виндой, а проверять можно через GitHub + AppVeyor
image: Visual Studio 2013
environment:
DEGREE_OF_PARALLELISM: 3
matrix:
- GENERATOR: Visual Studio 12 2013
CONFIG: Release
configuration: Release
build_script:
- mkdir build
- cd build
- cmake .. -G "%GENERATOR%"
- cmake --build . --config %CONFIG%
- cmake -E copy ../in.txt .
- dir
- dir Release
- Release\mytest -n 10 in.txt out.txt
- cat out.txt
annchapa
Здравствуйте, при получении задания мы автоматически cбилдим Ваш код на двух платформах — Windows msvc2013 и Linux gcc 5.4.0, в случае фейла, вы получите лог сборки, сможете исправить и прислать код еще раз, до победного success. Этакий удаленный CI. Удачи!
monah_tuk
в рамках какого стандарта?
binstream
С++11
Effolkronium
Можно использовать C++11 регулярки? Ведь они входят в 11 стандарт.
Beatrix
Можно использовать всё, что скомпилируется на MSVC 2013 или gcc 5.4.0 из коробки.
JIghtuse
Выглядит интересно, но многое непонятно. Зачем VS2013, почему не к стандарту языка привязаться? Пользовался пару раз этой средой, винды нету, про особенности реализации и поддержки стандартов не в курсе. Какие ограничения по времени, памяти, входным данным? От этого же здорово зависит, каким будет решение. На видео показаны лекции? Кроме них какие-то материалы выдаются?
firegurafiku
Более того, ещё пару дней назад требований о визуалстудии и недопустимости использования сторонних библиотек в условии тестовой задачи не было, как и о том, что решение должно быть оформлено в виде единственного CPP-файла и проходить автоматическую проверку.
Было весьма неприятно узнать об этом, имея на руках готовое решение, сделанное с расчётом на оценивание человеком: с Boost.Coroutine и Boost.Range, разбиением функциональности на кучу классов, комментариями и coverletter на английском. Написал им на мыло — код смотреть даже не стали.
binstream
Пожалуйста, извините за неудобство — отлаживаем новую систему автоматизированной проверки входных заданий, с требованиями проморгали момент :( На будущее учтем.
binstream
Все задания автоматически проверяются первично на компилируемость в двух средах: Windows / VS 2013 и Linux / GCC 5.4.0. Если задание удастся скомпилировать хотя бы на одной из указанных конфигураций, его уже дальше оцениваем на предмет корректности и производительности.
Чем быстрее — тем лучше. Памяти желательно не больше 8 ГБ потреблять. Пример входных данных приведен, но проверять будем на более объемных файлах.
На видео — фрагмент лекций, да. Помимо них, курсантам рассылаются e-mail с конспектами и заданиями.
5oclock
А без вступительных заданий, без «обучения» — просто обучающие материалы уже прошедшего курса можно почитать/посмотреть?
Beatrix
Да, после второго набора лекции планируем выкладывать в публичный доступ. Первый набор был репетицией, сейчас будет "чистовик". Но это случится, скорее всего, уже после окончания курса, в конце лета.
Beatrix
Важный UPD:
Было много комментариев про приём заданий под Linux, так что мы скорректировали требования к сдаче тестов. Теперь программу для входного теста можно компилировать и под Windows MSVC 2013, и под Linux gcc 5.4.0.
И даже больше — мы теперь сделаем это за вас. При приёме ваш код пройдёт автопроверку на компилируемость, и мы пришлём вам отчёт, чтобы вы были уверены, что программа собралась на нашей стороне. Если всё хорошо, код будет проверяться уже вручную Шоданом. Если нет — то у вас есть неограниченное количество попыток исправиться.
Еще раз просим прощения у всех, кто пострадал от калибровки приёма заданий. Сейчас всё окончательно починили, можно пользоваться.
hacenator
Запилите потом статью с бенчмарками, top быстрейших решений задачи?
Beatrix
Подумаем об этом! Вообще, у нас есть еще есть лидерборд за первый сезон, но там все же была другая задачка на входном тесте.
AngReload
Вы обещались написать про SSRTGI, когда будет пост?
Beatrix
Скорее всего, после SIGGRAPH. Мы туда едем на Real-Time Live в конце июля, как раз показывать и рассказывать про SSRTGI.
molnij
Несколько вопросов по заданию
1. Нужны ли, могут ли быть потоки?
2. Если -n не задано, считать N=0 и не выводить статистику? Или нужно вывести всю статистику?
3. Можно ли считать, что все пути\домены влазят в оперативную память? Т.е. можно ли работать чисто в памяти, или же нужно заморачиваться с работой в рамках выходного файла?
4. Могут ли встречаться «некорректные url», и как их рассматривать в этом случае. Например «http://google.com:88/search?q=free+software». Считать ли в этом случае что разбор адреса должен быть закончен с любого символа не входящего явно в перечисление допустимых для домена и отличающегося от "/" или нужно какое-то иное поведение?
Мне кажется что вчера в задании было явное описание «общей статистики», кроме примера, но могу ошибаться…
Beatrix
Отвечает Шодан. :)
Leo_Eldorado
Извините, не совсем ясно по пункту 4: если обнаружен такой символ, то считать URL некорректным и исключить его из рассмотрения или же, наоборот — считать корректным, но только до той части, где был обнаружен неизвестный символ?
Chulup
Сейчас уже немного поздно менять задание, но я был удивлён пришедшим логом с ошибкой «error: use of ‘auto’ in lambda parameter declaration only available with -std=c++14 or -std=gnu++14». Можно было догадаться, конечно, из-за MSVS 2013, но всё-таки.
Ещё в задании написано «URL-ом считается подстрока». В такой формулировке «blablahttp://ya.ru» будет верным URL с доменом «ya.ru» и путём "/". Может, всё-таки, с разделителя начинать поиск?
После заполнения формы и отправки задания на проверку пропадает ссылка на текст задания. Осталась только в истории браузера.
Beatrix
Если я правильно разгадала вашу почту, у вас задание сдано со второй попытки, судя по отчетам роботов.
Формулировка про URL
dreamer-dead
Простите, что значит — формулировка специально задумана?
Точно так же, как со значением N без указания поведения по умолчанию.
Это тест на умение додумывать за автора, или на написание программ на C++?
Почему не сформулировать задание максимально полно и корректно?
Beatrix
Это значит, что сформулировано преднамерянно и в задачке специально оставлен небольшой подводный камень, чтобы посмотерть, а как люди думают и как его обойдут.
Хотя в здании изначальном действительно были неточности, и спасибо тем, кто на них указал. Но сейчас там ровно так, как всё должно быть. :)
ruzzz
Я просто вырезал regex'ом полагая что строка в задании «URL-ом считается подстрока» однозначно просит нас вырезать любые подстроки URL, ну например для сбора статистики, или же известно что в логе URL будут отделены пробелами.
Так вот, могу ли я переделать код с учетом вышесказанного в комментах и отправить на ревью повторно?
Beatrix
Да, до конца дня понедельника можно перезалить задание заново, если есть желание.
tr1cks
Есть предложение тогда добавить все хинты из комментариев Хабра в текст самого задания, чтобы те кто его вдруг не смотрит не оказались в неравных условиях.
Beatrix
Это, конечно, было бы полезно. Но этом этапе еще раз фиксить условия задачи — это посеять еще больше хаоса и разрушения. Ну и тем у кого есть вопросы по заданию, мы всем отвечаем.
tr1cks
А чтобы было совсем кошерно можно еще время дедлайна с указанием таймзоны добавить. :)
Beatrix
Добавили в видном месте на сайте дедлайн сдачи с часовым поясом. :)
Qwerty343
Я конечно прошу прошения, но тут парни решили поучить народ на собственном энтузиазме. А ты придираешься к словам. Если что-то непонятно то спроси. Авторы между прочим отвечают. Так что это показывает не их уровень а твой.
ruzzz
Уточните пожалуйста вот этот пункт:
Bombus
Подписываюсь.
В выходном файле нужно вывести общее количество:
1) total urls — количество URL, общее число ссылок на страницы в документе.
2) domains — количество уникальных доменов
3) paths — количество уникальных URL (domain+path), количество упомяеутых страниц.
Так правильно?
Если под path подразумевается только путь (то что идет после домена), и в статистике нужно привести их общее количество, то оно будет равно total urls.
Прошу уточнить!
Bombus
С учетом противоречивости задания и соответственно вероятностного решения задачи, вспоминается анекдот:
Beatrix
Уточнения получены, рассказываю:
Да. Причем неуникальных.
Нет. Количество уникальных просто paths, без учета домена. Иначе да,
это называлось бы уникальным URL, но по условиям интересуют не они.
Нет, не будет. count(distinct url) != count(distinct path) !=
count(url). Это три разных числа. Нужны последние два.
Beatrix
Это к тому, что любой путь (один и тот же) должен засчитаться в таком случае именно 4 раза, а не 1 раз.
Что каждое такое вхождение пути считается отдельным ("разным") новым упоминанием, а не как-то еще, не схлопывается почему-то.
Эту часть в задании, кстати, поправили почти сразу.
Qwerty343
Подскажите пожалуйста как будет выглядеть вызов программы с флагов/ кол-вом топов и без указания данных параметров.
Beatrix
Вопрос не очень понятен.
Например, как test.exe -n 12345
myinputfile.txt myoutputfile.txt и соответственно test.exe -n
myinputfile.txt myoutputfile.txt
Дорасшифруйте, что имеется ввиду.
tr1cks
А разве такой вызов валиден?:
main.exe -n in.txt out.txt
Имхо, исходя из описания допустимы только варианты:
main.exe -n 10 in.txt. out.txt
main.exe in.txt out.txt
Флаг без значения это что-то странное.
silent_tsk
Про какие именно параметры идет речь — не могли бы вы уточнить?
ruzzz
Вроде где-то отвечали: взять topN какой-то по умолчанию на свое усмотрение, и использовать если не задан явно.
Qwerty343
да, это я видел. Я про то, как будет выглядеть запуск программы:
Mytest.exe -n 10 in.txt out.txt
Или же
Mytest.exe [-n 10] in.txt out.txt
А если не указывать кол-во то:
Mytest.exe in.txt out.txt
Overlordff
[-n NNN] взято в квадратные скобки. Это значит «необязательный параметр», который можно не указывать.
Следовательно возможно два запуска:
Mytest.exe -n 10 in.txt out.txt
и
Mytest.exe in.txt out.txt
muradovm
эх, а я сдал как раз с [-n 12] параметром
tr1cks
Задавал вопрос про регистрозависимость в личке. Вот ответ на него:
Еще в тексте задания вроде нигде явно не сказано, что домен должен быть невырожденным и содержать как минимум хотя бы один символ. Вроде очевидно, что да, но хочется пруфа.
tr1cks
А сколько тестовых заданий поступило ради интереса не скажете?
silent_tsk
Получили 345 разных заданий, наибольшее количество — за последние 24 часа. Из 345 исходников не удалось собрать только 4, остальные же сейчас изучаем и отбираем участников :)