В феврале мы запустили бесплатный онлайн-курс программирования на С++, рассчитанный на продвинутых разработчиков. Цели было в основном две — сделать так, чтобы в мире было больше хороших программистов, а заодно набрать себе пополнение в команду. Идея взлетела: участвовать в первом наборе захотело 185 человек из 57 городов и 8 стран. В курсанты попало 30 из них, но со словами «неинтересно» ушёл только 1. Остальные по итогам курса сообщили, что было в целом круто и они с пользой провели время.



Обкатав всю затею и учебный процесс на начальном бета-наборе, мы решили повторить курс ещё раз. Набор уже во всю идёт, подать заявку можно до понедельника, 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 графики.
От векторов и матриц (с разбором) и до современных техник рендера (без подробного разбора).

Как все происходит?


Всего в первом курсе 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.

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

А на закуску, тизер нового сезона.

Поделиться с друзьями
-->

Комментарии (49)


  1. kronos
    22.06.2017 01:58
    +1

    Как выполнить тестовое задание если у меня мак?


    1. monah_tuk
      22.06.2017 03:08
      +1

      Даже так, как выполнить задание, если нет возможности проверить в VS 2013? У меня на всех доступных компах — Linux :-)


      1. masterspline
        22.06.2017 04:41
        +1

        Писать понятно, что не под виндой, а проверять можно через GitHub + AppVeyor

        Вот тебе примерный appveyor.yml
        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


    1. annchapa
      22.06.2017 07:52
      +3

      Здравствуйте, при получении задания мы автоматически cбилдим Ваш код на двух платформах — Windows msvc2013 и Linux gcc 5.4.0, в случае фейла, вы получите лог сборки, сможете исправить и прислать код еще раз, до победного success. Этакий удаленный CI. Удачи!


  1. monah_tuk
    22.06.2017 03:09
    +2

    Можно использовать язык в рамках стандарта, те. C++ и ещё STL.

    в рамках какого стандарта?


    1. binstream
      22.06.2017 08:19

      С++11


      1. Effolkronium
        24.06.2017 15:56

        Можно использовать C++11 регулярки? Ведь они входят в 11 стандарт.


        1. Beatrix
          24.06.2017 15:57

          Можно использовать всё, что скомпилируется на MSVC 2013 или gcc 5.4.0 из коробки.


  1. JIghtuse
    22.06.2017 04:34
    +1

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


    1. firegurafiku
      22.06.2017 06:32
      +2

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


      Было весьма неприятно узнать об этом, имея на руках готовое решение, сделанное с расчётом на оценивание человеком: с Boost.Coroutine и Boost.Range, разбиением функциональности на кучу классов, комментариями и coverletter на английском. Написал им на мыло — код смотреть даже не стали.


      1. binstream
        22.06.2017 07:55

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


    1. binstream
      22.06.2017 08:18

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

      Все задания автоматически проверяются первично на компилируемость в двух средах: Windows / VS 2013 и Linux / GCC 5.4.0. Если задание удастся скомпилировать хотя бы на одной из указанных конфигураций, его уже дальше оцениваем на предмет корректности и производительности.

      Какие ограничения по времени, памяти, входным данным? От этого же здорово зависит, каким будет решение.

      Чем быстрее — тем лучше. Памяти желательно не больше 8 ГБ потреблять. Пример входных данных приведен, но проверять будем на более объемных файлах.

      На видео показаны лекции? Кроме них какие-то материалы выдаются?

      На видео — фрагмент лекций, да. Помимо них, курсантам рассылаются e-mail с конспектами и заданиями.


  1. 5oclock
    22.06.2017 08:27

    А без вступительных заданий, без «обучения» — просто обучающие материалы уже прошедшего курса можно почитать/посмотреть?


    1. Beatrix
      22.06.2017 08:40

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


  1. Beatrix
    22.06.2017 09:56
    +2

    Важный UPD:
    Было много комментариев про приём заданий под Linux, так что мы скорректировали требования к сдаче тестов. Теперь программу для входного теста можно компилировать и под Windows MSVC 2013, и под Linux gcc 5.4.0.


    И даже больше — мы теперь сделаем это за вас. При приёме ваш код пройдёт автопроверку на компилируемость, и мы пришлём вам отчёт, чтобы вы были уверены, что программа собралась на нашей стороне. Если всё хорошо, код будет проверяться уже вручную Шоданом. Если нет — то у вас есть неограниченное количество попыток исправиться.


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


  1. hacenator
    22.06.2017 12:26
    +1

    Запилите потом статью с бенчмарками, top быстрейших решений задачи?


    1. Beatrix
      22.06.2017 13:09

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


  1. AngReload
    22.06.2017 14:21

    Вы обещались написать про SSRTGI, когда будет пост?


    1. Beatrix
      22.06.2017 18:56

      Скорее всего, после SIGGRAPH. Мы туда едем на Real-Time Live в конце июля, как раз показывать и рассказывать про SSRTGI.


  1. molnij
    22.06.2017 14:46
    +1

    Несколько вопросов по заданию
    1. Нужны ли, могут ли быть потоки?
    2. Если -n не задано, считать N=0 и не выводить статистику? Или нужно вывести всю статистику?
    3. Можно ли считать, что все пути\домены влазят в оперативную память? Т.е. можно ли работать чисто в памяти, или же нужно заморачиваться с работой в рамках выходного файла?
    4. Могут ли встречаться «некорректные url», и как их рассматривать в этом случае. Например «http://google.com:88/search?q=free+software». Считать ли в этом случае что разбор адреса должен быть закончен с любого символа не входящего явно в перечисление допустимых для домена и отличающегося от "/" или нужно какое-то иное поведение?

    Мне кажется что вчера в задании было явное описание «общей статистики», кроме примера, но могу ошибаться…


    1. Beatrix
      22.06.2017 20:04

      Отвечает Шодан. :)


      1. Потоки в смысле threads или C++ streams? Threads нет, streams да.
      2. Нет, выбрать разумное N на ваше усмотрение и выводить.
      3. Да, можно.
      4. Да, могут, рассматривать как специфицировано: прекращать на первом непонятном символе.


      1. Leo_Eldorado
        24.06.2017 15:57

        Извините, не совсем ясно по пункту 4: если обнаружен такой символ, то считать URL некорректным и исключить его из рассмотрения или же, наоборот — считать корректным, но только до той части, где был обнаружен неизвестный символ?


  1. Chulup
    23.06.2017 13:47

    Сейчас уже немного поздно менять задание, но я был удивлён пришедшим логом с ошибкой «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» и путём "/". Может, всё-таки, с разделителя начинать поиск?

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


    1. Beatrix
      23.06.2017 18:50

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


      Формулировка про URL

      Скрытый текст
      так специально хитро задумана, никому не говорите!


      1. dreamer-dead
        23.06.2017 20:01
        +1

        Простите, что значит — формулировка специально задумана?
        Точно так же, как со значением N без указания поведения по умолчанию.
        Это тест на умение додумывать за автора, или на написание программ на C++?
        Почему не сформулировать задание максимально полно и корректно?


        1. Beatrix
          24.06.2017 16:08

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


          Хотя в здании изначальном действительно были неточности, и спасибо тем, кто на них указал. Но сейчас там ровно так, как всё должно быть. :)


          1. ruzzz
            24.06.2017 18:33

            Я просто вырезал regex'ом полагая что строка в задании «URL-ом считается подстрока» однозначно просит нас вырезать любые подстроки URL, ну например для сбора статистики, или же известно что в логе URL будут отделены пробелами.

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


            1. Beatrix
              25.06.2017 18:13

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


              1. tr1cks
                25.06.2017 18:19

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


                1. Beatrix
                  26.06.2017 08:38

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


              1. tr1cks
                25.06.2017 18:24

                А чтобы было совсем кошерно можно еще время дедлайна с указанием таймзоны добавить. :)


                1. Beatrix
                  26.06.2017 08:32

                  Добавили в видном месте на сайте дедлайн сдачи с часовым поясом. :)


        1. Qwerty343
          26.06.2017 13:56

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


  1. ruzzz
    24.06.2017 18:26
    +1

    Уточните пожалуйста вот этот пункт:

    Обратите внимание, путь "/" в составе 4 разных URL из 4 разных доменов это 4 разных упоминания.

    • Тут есть некий подвох и нужно сообразить самому?
    • Это нужно понимать буквально (только для пути "/" и/или 4 раза)?
    • Или это пример для всех путей и в любых количествах? Т.е. любой путь считается отличным от другого если они одинаковы, но разные домены?
    «упоминания» где? В общей статистике или а топе? Или и там и там?



    1. Bombus
      24.06.2017 23:18
      +1

      Подписываюсь.
      В выходном файле нужно вывести общее количество:
      1) total urls — количество URL, общее число ссылок на страницы в документе.
      2) domains — количество уникальных доменов
      3) paths — количество уникальных URL (domain+path), количество упомяеутых страниц.
      Так правильно?
      Если под path подразумевается только путь (то что идет после домена), и в статистике нужно привести их общее количество, то оно будет равно total urls.
      Прошу уточнить!


      1. Bombus
        25.06.2017 20:44

        С учетом противоречивости задания и соответственно вероятностного решения задачи, вспоминается анекдот:

        Два HR-менеджера смотрят на стопку резюме.
        Молодой менеджер:
        — да… изучать это надолго…
        Опытный берет половину и кидает в шредер.
        Молодой:
        — ?????
        Опытный:
        — А зачем нам нужны неудачники?!


      1. Beatrix
        26.06.2017 11:05

        Уточнения получены, рассказываю:


        В выходном файле нужно вывести общее количество:
        1) total urls — количество URL, общее число ссылок на страницы в документе.
        2) domains — количество уникальных доменов

        Да. Причем неуникальных.


        3) paths — количество уникальных URL (domain+path), количество упомяеутых
        страниц.

        Нет. Количество уникальных просто paths, без учета домена. Иначе да,
        это называлось бы уникальным URL, но по условиям интересуют не они.


        Если под path подразумевается только путь (то что идет после домена), и в
        статистике нужно привести их общее количество, то оно будет равно total
        urls.

        Нет, не будет. count(distinct url) != count(distinct path) !=
        count(url). Это три разных числа. Нужны последние два.


    1. Beatrix
      26.06.2017 11:03

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


      Эту часть в задании, кстати, поправили почти сразу.


  1. Qwerty343
    26.06.2017 08:10

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


    1. Beatrix
      26.06.2017 11:08

      Вопрос не очень понятен.
      Например, как test.exe -n 12345
      myinputfile.txt myoutputfile.txt и соответственно test.exe -n
      myinputfile.txt myoutputfile.txt


      Дорасшифруйте, что имеется ввиду.


      1. tr1cks
        26.06.2017 13:29

        А разве такой вызов валиден?:
        main.exe -n in.txt out.txt

        Имхо, исходя из описания допустимы только варианты:
        main.exe -n 10 in.txt. out.txt
        main.exe in.txt out.txt

        Флаг без значения это что-то странное.


    1. silent_tsk
      26.06.2017 11:29

      Про какие именно параметры идет речь — не могли бы вы уточнить?


    1. ruzzz
      26.06.2017 12:04

      Вроде где-то отвечали: взять topN какой-то по умолчанию на свое усмотрение, и использовать если не задан явно.


      1. Qwerty343
        26.06.2017 13:51

        да, это я видел. Я про то, как будет выглядеть запуск программы:
        Mytest.exe -n 10 in.txt out.txt
        Или же
        Mytest.exe [-n 10] in.txt out.txt
        А если не указывать кол-во то:
        Mytest.exe in.txt out.txt


        1. Overlordff
          26.06.2017 14:48

          [-n NNN] взято в квадратные скобки. Это значит «необязательный параметр», который можно не указывать.
          Следовательно возможно два запуска:

          Mytest.exe -n 10 in.txt out.txt
          и
          Mytest.exe in.txt out.txt


          1. muradovm
            27.06.2017 15:30

            эх, а я сдал как раз с [-n 12] параметром


  1. tr1cks
    26.06.2017 14:03
    +1

    Задавал вопрос про регистрозависимость в личке. Вот ответ на него:

    • Домены — нерегистрозависимы
    • Paths — регистрозависимы


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


  1. tr1cks
    27.06.2017 12:26

    А сколько тестовых заданий поступило ради интереса не скажете?


    1. silent_tsk
      27.06.2017 14:00

      Получили 345 разных заданий, наибольшее количество — за последние 24 часа. Из 345 исходников не удалось собрать только 4, остальные же сейчас изучаем и отбираем участников :)