GolovachCourses
Компания
27,95
рейтинг
25 марта 2014 в 19:41

Разработка → Программа курса «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
Автор: @IvanGolovach
GolovachCourses
рейтинг 27,95
Компания прекратила активность на сайте

Комментарии (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
      Пост в блоге компании, так что нет.
      • 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).

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

Самое читаемое Разработка