Программа курса «Multicore programming in Java»

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

    Также я веду курс «Scala for Java Developers» на платформе для онлайн-образования udemy.com (аналог Coursera/EdX).

    Хотелось бы услышать мнение сообщества по поводу
    1. программы курса «Multicore programming in Java»
    2. литературы к курсу

    Кратко о курсе: стартует 28 апреля (в связи с майскими праздниками старт перенесен на 15 мая), ведется в режиме вебинаров дважды в неделю в 19.00-22.00, состоит из 16 лекций по 2.5 часа (=40 лекционных часов), к каждой лекции дается расширенное задание, рассчитан на Java Junior/Middle.

    Программа курса


    Модуль #1: Между “железом” и “математикой”, примитивы
    • “железо”
      • архитектура современных процессоров, кэши
      • memory barriers, read/write reordering, протоколы когерентности кэшей
    • “математика”/Java Memory Model
      • New JMM — описание «на пальцах»
      • какие гарантии дают Thread.start()/join(), volatile, final, CAS, lazySet, weakCompareAndSet, классы из j.u.c
      • формальная спецификация New JMM: happens-before edge, commitment protocol
    • примитивы/конструкции
      • double checked locking (broken), safe publishing
      • synchronized+Object.wait()/notify()/notifyAll() — как использовать, какие гарантии, как реализовано в HotSpot
      • реализуем свои: Dekker's algorithm, Peterson's algorithm, Lamport Bakery algotithm

    Модуль #2: java.util.concurrent (Java 5)
    • многопоточные коллекции
      • BlockingQueue-s
      • ConcurrentMap-s: ConcurrentHashMap, ConcurrentSkipListMap
      • copy-on-write structures: CopyOnWriteArrayList, CopyOnWriteArraySet
    • “синхронизаторы”
      • Lock, Condition, ReentrantLock, ReentrantReadWriteLock, Semaphore
      • CountDownLatch, CyclicBarrier, Exchanger, Phaser
    • пул потоков + Future
      • Executors, ExecutorService, ThreadPoolExecutor, ScheduledExecutorService, ScheduledThreadPoolExecutor
      • Callable, Future, чего не хватает j.u.c.Future
    • ядро j.u.c: AbstractQueuedSynchronizer + LockSupport
      • внутреннее устройство j.u.c.AQS
      • строим свои примитивы на j.u.c.AQS + LockSupport

    Модуль #3: Fork/Join Framework (java 7) + Parallel Streams (Java 8)
    • Fork/Join Framework
      • решаем задачи в стиле рекурсивного параллелизма
      • идиомы и типичные задачи
      • Fork/Join Framework — что «под капотом»
    • Parallel Streams
      • Java 8 — работаем с данными через java.util.Stream
      • java.util.Stream.parallel() — что «под капотом»

    Модуль #4: “Неклассические архитектуры”
    • Non-blocking algorithm
      • пакет j.u.c.atomic: AtomicXXX, AtomicXXXArray, AtomicXXXFieldUpdater, AtomicStampedReference, AtomicMarkableReference
      • классификация: blocking, non-blocking, lock-free, wait-free, obstruction free
      • неблокирующие реализации основных структур данных: stack, queue, deque, hashtable, treemap
    • архитектуры на основе передачи сообщений (Akka)
      • библиотека Akka
      • основные шаблоны, типовые архитектуры
      • плюсы и минусы архитектур на основе передачи сообщений
    • Software Transactional Memory (Clojure)
      • библиотека clojure.lang.*
      • плюсы и минусы архитектур на транзакционной памяти
    • Persistent Data Structures
      • плюсы и минусы персистентных структур данных
      • персистентные реализации основных структур данных: stack, queue, deque, hashtable, treemap
      • библиотеки: clojure.lang.*, pcollections


    Литература


    Книги

    Статьи

    Блоги

    Контакты



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

    skype: GolovachCourses
    email: GolovachCourses@gmail.com
    Метки:
    GolovachCourses 28,15
    Компания
    Поделиться публикацией
    Похожие публикации
    Комментарии 45
    • +2
      Где записываться? Срочно ссылку на форму регистрации!

      P.S. Я думаю мое мнение понятно без дополнительных комментариев. Вцелом и программа и литература подобраны отлично.
      • 0
        Где записываться? Срочно ссылку на форму регистрации!

        Пишите в скайп. Как таковой «регистрации» нет.
        Мы ответим на все Ваши вопросы, вы решите — платить или нет.
        У нас все административные вопросы решаются в общей скайп-группе.
      • +2
        Я бы предложил изменить последовательность подачи материала:

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

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

        — не повторять в учебном плане историю развития, оставляя “неклассические архитектуры” на потом, а выработать наиболее усвояемую классификацию задач и решений и ей следовать. Научить сначала классифицировать задачу, а только потом подбирать для нее готовое решение из запаса. А то весь ваш план — список решений, причем разные решения для одной и той же задачи изучаются в разных местах, что затрудняет возможность выбора (например synchronized/wait/notify vs Lock/Condition), в то время как о проблематике как таковой ничего не говорится.

        — добавить изучение CompletableFuture из java8
        • +1
          Я бы предложил изменить последовательность подачи материала:
          — начать с высокоуровневых понятий, а именно передачи сообщений синхронным (блокирующие очереди) и асинхронным (акторы) способом, чтобы ученики сразу имели возможность писать работоспособные программы
          — соответственно, низкоуровневые и аппаратные механизмы перенести в конец, когда ученики станут способны чувствовать параллелизм и его проблемы


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

          Сейчас составляю вторую программу — по задачам. И сам курс будет «нанизываться» на задачи.
          В ближайшее время опубликую. На вскидку, я пожалуй начну с простейшего в 50-100 строчек HTTP-сервера на блокирующих сокетах — сразу используется пул потоков для обработки каждого соединения + шаблон производитель-потребители через блокирующую очередь (поток на ServerSocket.accept() передает принятые Socket-ы «потребителям»). Потом добавить shared state, скажем простейший механизм сессий на ConcurrentHashMap.
          Получилось легкое введение в j.u.c.
          Потом вместо блокирующей очереди из j.u.c пишем свою на synchronized/wait/notifyAll, другую на ReentrantLock/Condition, третью на семафорах.

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

          Собственно было бы вообще интересно составить подборку из 10-20 «классических» задач по многопоточности. «Классических» — в смысле популярности «в жизни».
          • 0
            — добавить изучение CompletableFuture из java8

            Да, это пропустил.
            Надо выделить время и в целом помедитировать над тем, что Future — это монада, и что мы можем из этого выжать. Посмотреть что там в Akka, кажется в Netty реализовывали свое Future.
          • +6
            Какова цена вопроса? И если она отсутствует, то выложите ли записи вебинаров в свободный доступ?
            • +1
              Как я понимаю, цена вопроса – $975. www.golovachcourses.com/multicore-course-detailed/
              • +4
                Тогда я боюсь желающих будет чуть больше чем 0.
                • +1
                  Ну с хабра может и 0, а вообще цена как цена. У Специалиста вот например курсы по основам РНР по 12-20к (часов меньше, чем тут как я понимаю) www.specialist.ru/dictionary/definition/php и ничего, ходят люди. По Java тоже аналогично www.specialist.ru/dictionary/definition/java
                  • 0
                    Приятно посмотреть на сайт. Глаза прям радуются, сразу видно — специалисты.
                  • 0
                    достаточно 475$ — вы получаете все (выше писал что) включая задания, но я их не проверяю.
                    975$ — это с code review и общению по заданиям, персональному обсуждению литературы.
                • 0
                  Какова цена вопроса?

                  1. Участие в вебинарах, доступ к записанному видео, доступ к коду с лекций, доступ к электронной литературе – 475$.
                  2. Пункт 1 + проверка лектором заданий для самостоятельной работы (16 больших заданий) – 975$.
                  .
                  Если Вас несколько человек — можем обговорить значительную скидку.
                  • 0
                    выложите ли записи вебинаров в свободный доступ?

                    Скорее всего — нет.
                    Иначе эта деятельность теряет смысл как источник заработка:(
                  • +3
                    Люто плюсую!

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

                    P.S.: я тут полез в ваши лекции, услышал слово «J2EE» и понял, что могут быть проблемы с актуальностью ваших материалов. Следите за актуальностью внимательнее :)
                    • 0
                      А что не так с J2EE?
                      • 0
                        Сейчас оно называется JavaEE
                      • 0
                        P.S.: я тут полез в ваши лекции, услышал слово «J2EE» и понял, что могут быть проблемы с актуальностью ваших материалов. Следите за актуальностью внимательнее :)

                        Да, спасибо. Во время лекции иногда тяжело отслеживать терминологические тонкости.
                        Они сменили название:
                        • J2EE 1.2 (December 12, 1999)
                        • J2EE 1.3 (September 24, 2001)
                        • J2EE 1.4 (November 11, 2003)
                        • Java EE 5 (May 11, 2006)
                        • Java EE 6 (Dec 10, 2009)
                        • Java EE 7 (May 28, 2013,[3] but April 5, 2013 according to spec document. June 12, 2013 was the planned kickoff date[4])

                        • 0
                          Да, больше 10 лет назад.
                        • 0
                          есть сомнения насчёт того, получится ли. Во-первых, тема непростая

                          Тема действительно непростая. Но при грамотно составленной программе, большом количестве примеров кода и нормальных источниках — должно получиться.
                          До этого читал короткие курсы по многопоточности — 4-6 лекций. При хороших примерах — слушатели усваивают.
                          • 0
                            есть сомнения насчёт того, получится ли.… а во-вторых, не уверен, что джуниоры потянут.

                            Ну тут каждый выбирает для себя.
                            Но мой опыт показывает, что джуниоры с математическим бэкграундом (мехматы, прикладная математика) — тянут.
                          • +1
                            Канал на Youtube у вас интересный. Есть материалы где то еще, на торрентах например?
                            • +2
                              На торрентах — нет.
                              Большая часть материалов на youtube в публичном доступе. Там около 800 часов, кажется.
                              В следующем посте опишу, что есть на youtube по Java Core + Junior Java Developer.
                            • 0
                              Место проведения Москва?
                              • 0
                                «в режиме вебинаров»
                              • +2
                                Задумка крайне интересная, но, имхо, с монетизацией все плохо. Поясню мысль: поскольку на каждого дополнительного слушателя тратится крайне мало дополнительных ресурсов (ибо вебинар и я не учитываю code-review), то для получения большей прибыли было бы целесообразно снизить цену ниже некоторого психологического порога, предположим $150. Проще говоря, при цене в $100 можно ожидать в 100 раз большую аудиторию чем при цене в $1000.
                                Ну а для тех кто желает кроме прослушивания курсов, иметь доступ к code-review стоит оставить, озвученную выше цену, т.к. данный вариант предполагает довольно большой объем ручной работы для лектора.
                                • 0
                                  Согласен. При всему уважении к автору курса, который действительно умеет пояснять мысли и доносить до слушателя многие полезные вещи. Меня тем не менее очень отпугивает цена. + ко всему я сторонник небольших порций лекций, после которых можно задавать вопросы и сделать перерыв, чтобы мозг не за туманился. Очень часто себя ловлю на мысли что по середине большой лекции уже теряю нить лектора (
                                  • –1
                                    Очень часто себя ловлю на мысли что по середине большой лекции уже теряю нить лектора (

                                    У меня большинство слушателей как раз пересматривают лекции несколько раз и с перерывами на чай.
                                    Плотность материала обусловлена тем, что необходимо за ограниченный срок (40-100 часов) дать огромный объем теории, примеров, подходов. Иначе — ну вы знаете: 11 семестров по 5 экзаменов + 5 зачетов:)
                                  • 0
                                    Как известно устав бизнес-модель написана кровью:)
                                    Я пробовал разные схемы монетизации (я полтора года преподаю Java Core + Junior Java Developer).
                                    Сумма 400$-600$ показала себя как самая разумная и выгодная.
                                    на каждого дополнительного слушателя тратится крайне мало дополнительных ресурсов

                                    Это правда. Но учитывайте, что есть начальный порог затрат на ведения сложного курса длительностью N месяцев. Это примерно N * 4.000$.
                                    — надо готовиться заранее. Сейчас месяц до старта, а я уже занимаюсь курсом
                                    — обязательное требование — не работать во время чтения курса. Необходимо время на продумывание примеров, вычитку статей, ответы на вопросы. Да и вообще чтение лекции 2.5 часа тратит много сил.
                                    — реклама. Блог на habrahabr, скажем, стоит 1.500$ за три месяца
                                    — офис. У меня дома ребенок, значит мне вечерами необходимо помещение
                                    — з.п. бухгалтера
                                    — налоги
                                    — и т.д.

                                    Если бы я был уверен, что этот порог будет пройден — я могу снижать цену. Я не могу сказать курс по 100$, приходит 30 человек, я пересчитываю и говорю — нет ребята, курс по 300$.

                                    Скажем можно по другому, курс стоит 12К. Если соберется 120 человек, то всем будет по 100$. Соберется 480 человек — по 25$. Не вопрос.
                                    • –1
                                      Проще говоря, при цене в $100 можно ожидать в 100 раз большую аудиторию чем при цене в $1000.

                                      1. Базовая цена — 475$, а не 1000$. В реальности практически ни у кого не хватит времени/мощности И пересмотреть все примеры с лекции И почитать ссылки И ЕЩЕ поделать примеры за 3 дня между лекциями.
                                      2. Мой опыт показывает, что психологических порогов несколько. 100$ — это первый порог, 500$ — второй. 100-долларовый порог уменьшает аудиторию НЕ в 10 раз, а примерно в 2-3 раза.

                                      Есть люди которые согласны платить/инвестировать в образование, а есть те, кто не согласен.
                                      Мой опыт показывает, что хорошее знание многопоточности позволяет повысить зарплату примерно на 100$ (на з.п. в 1000$-1500$ в месяц) и сменить сферу деятельности на более интересную (игровые сервера, сетевые сервера, движки игр, ...). Итого инвестиция в 475$ отбивается за 5 месяцев и потом начинает приносить 100$ в месяц.
                                      • 0
                                        Весьма разумный вариант, не хотите попробовать в качестве эксперимента?
                                    • 0
                                      У меня иногда интернет «отваливается», смогу ли я пересматривать лекции прошедшие «сегодня»?
                                      • –1
                                        1. Вы можете переподключиться в течении хода лекции.
                                        2. Сейчас запись лекции выкладывается с задержкой 12-24 часа: конвертация из внутреннего формата вебинаров в mp4 + заливка на внешний сервер.

                                        Так что сейчас смотреть с задержкой 30 минут — не получится.
                                        Но если найдем (посоветуете) хорошего провайдера вебинаров, у которого видео доступно сразу (с задержкой 1-10-100 минут после трансляции), то Ваша проблема будет решена.

                                        Мы сейчас ищем.
                                      • 0
                                        Очень годный план.

                                        Единственное, что смущает — это порядок изложения в «Модуль #2». В первом модуле вы идёте «снизу вверх», а во втором более низкие уровни абстракции (AQS и LockSupport) рассказываете позже. Это намеренно? Кроме того, как мне кажется, логично их рассказывать прямо до или сразу после «синхронизаторов», а у вас между ними ещё и пулы вклинились.

                                        В остальном, повторюсь, мне весьма нравится.
                                        • +1
                                          Стоит обдумать. LockSupport, думаю, можно читать и в начале.
                                          Но AQS крайне сложно устроен и имеет нетривиальное API:
                                          — попытка блокирующего/неблокирующего захвата (Lock.lock()/tryLock())
                                          — попытка блокирующего захвата с таймаутом и без (Lock.lock()/lock(long))
                                          — прерываемая и непрерываемая через interrupt() попытка захвата (Lock.lockInterruptibly()/lock())
                                          — «четная» и «нечестная» блокировки
                                          — exclusive и shared захват
                                          — и т.д.

                                          Я предполагаю, что сначала слушателю стоит поиграться с Lock/Semaphore/CountDownLatch, что бы он понят как эти свойства «выглядят», для чего могут быть полезны. И только потом самые сильные могут попробовать разобраться на каком основании это все построено.
                                          • –1
                                            а у вас между ними ещё и пулы вклинились.

                                            Тоже обсуждаемо.
                                            Но методически синхронизаторы необходимо учить сразу с пулами. Для демонстрации синхронизаторов необходимо иметь множества потоков и создавать их по new Thread(new Runnable() {...}) как-то уже некрасиво.
                                          • +1
                                            Главное, чтобы не получилось по принципу: «Умеешь — делай, не умеешь — учи других ».
                                            • 0
                                              Извините, я тут недавно, но разве этот пост не должен быть в разделе «Я пиарюсь»?
                                            • 0
                                              Судя по описанию — отличный курс! Подборка тем прямо в точку.
                                              • +2
                                                Иван, я смотрел ваши ролики на ютубе и мне они понравились.
                                                И я даже был готов купить курс для джунов, но остановили некоторые вещи:
                                                — нет нормальной информации по курсу, везде какие-то куски, сайт полурабочий
                                                — вместо форума для учащихся какая-то скайп группа, куда скидывают материалы, все туда пишут спамят и найти материалы к лекции к концу дня просто невозможно
                                                — видео просто оставляет желать лучшего, вы говорите про команду, про оператора, но зачем платить оператору, который по 5 минут не может сфокусироваться на доске? последние лекции это просто ад (когда вы проводите онлайн конфу), я плакал кровью от звука и видео. И я это я не платил за курс, а если бы заплатил и получил такое качество, то скорее всего, попросил вернуть деньги.
                                                • 0
                                                  Полностью поддерживаю, предыдущего комментатора, подача информации очень хороша, но не хватает того, что есть у Hexlet University (Проект Рахима Давлеткалиева), то есть хорошей упорядоченности материала и структурированности. За указанную сумму хотелось бы иметь:
                                                  — лекции в хорошем качестве (то есть хорошее качество звука, нормальное освещение, трансляция экрана во время демонстрации исходного кода);
                                                  — деление лекций на более короткие логические блоки (так как это сделано в курсах на coursera.org);
                                                  — форум для обсуждения лекций, домашних заданий и т.п.
                                                  — какое-либо описание лекции с основными рассматриваемыми темами.

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

                                                  Система поощрений и мотивации: бейджи, ачивки, балловая система, скидки на будущие курсы, сертификаты с публикацией на linkedin.

                                                  После прохождения курса, необходима возможность просматривать лекции и доступ к сделанным проектам с комментариями лектора.
                                                • 0
                                                  IvanGolovach
                                                  А у Вас есть возможность организовать видеоматериала еще в доп. формате, в формате мобильного видео? Приведу пример один из докладов на суботнике в яндексе:
                                                  * Скачать видео 536 МБ
                                                  * Скачать мобильное видео 231 МБ

                                                  Дело в том что живу в Моск.Области и у меня достаточно много времени в дороге, 20 мин в электричке + мин 35-40 в метро. Есть смартфон и периодически по нему смотрю полезные видео-лекции. На просмотр в онлайн с ютуба надеятся не приходится, т.к. то интернет отвалится или WiFi и поэтому скачиваю на карточку заранее, отсюда встает желание иметь не большого размера видео, т.к. карточка быстро расходуется.
                                                  • 0
                                                    Этот курс не будет в свободном доступе:(
                                                    Другие, которые выложены на youtube (Java Core, Junior Java Developer) — можно подумать, но Вы первый из 4.000 подписчиков, кому такое потребовалось.
                                                    Так что, вряд ли.
                                                  • 0
                                                    Также я веду курс «Scala for Java Developers» на платформе для онлайн-образования udemy.com (аналог Coursera/EdX).

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

                                                    Самое читаемое