Хабрахабр

100 видео-лекций по программированию

image

За это время у меня накопилось огромное количество примеров кода и материалов, примерно на 90 лекций. Товарищи инженеры, уже четвертый год пошел, как я взялся преподавать в Киевском политехническом институте. Если раньше мне казалось, что написать кратко, сложно и внушительно — это верх мастерства, то теперь я осознал, что мой код должны понимать студенты после минимальных объяснений, иначе он никуда не годится. Должен сказать, что за весь период своей профессиональной деятельности (а это 24 года почти ежедневного написания кода), я никогда не подымал свой уровень программирования, как за последние годы, работая со студентами. Более того, обучающий код не должен существенно отличаться от рабочего кода, потому, что мы учим будущих инженеров делать настоящие системы, а не учебные. Я пришел к выводу, что способность эту можно и нужно распространить не только на обучающий код, но и на весь рабочий код. За этот учебный год я планирую записать 100 лекций, из которых уже опубликованы 23, готовы материалы еще для 67 лекций и новых 10 лекций еще в процессе подготовки. А после многочисленных просьб, я решил записывать все лекции в виде скринкастов, которые сразу после завершения лекции отправляются на ютюб.

Концепция курса

Все вы знаете, что у нас в отрасли есть существенные проблемы с фундаментальным инженерным образованием:

  • курсы ВУЗов часто устарели и оставляют желать лучшего,
  • не сформирована общепринятая терминология (в спорах мы часто называем одни и те же вещи разными словами и разные вещи одинаковыми словами), от этого и путаемся,
  • статьи и видео в интернетах может с легкостью выпустить любой, кому пришло в голову, что его квалификации для этого достаточно,
  • в программировании накопление опыта затруднено быстрым выходом людей из специальности, а ведь фундаментальные идеи циклически повторяются, но те, кто получил опыт на предыдущем витке, с большой вероятностью уже не практикуют и не могут подсказать младшим коллегам, где грабельки и узкие места.

У самих же JavaScript разработчиков очень часто наблюдается плохая базовая инженерная подготовка и нехватка фундаментальных знаний по структурам данных, алгоритмам, базовым абстракциям, паттернам, архитектуре, парадигмам и приемам программирования. Построить курс на базе JavaScript — это конечно экспериментальная затея, но этот язык уж точно не будет лишним ни для кого в современном ИТ. В общем, качество и знания редко требуются, разве что на собеседованиях. Большинство кода, что пишется сейчас в индустрии, просто выбрасывается вскоре после создания, потом опять переписывается и опять выбрасывается. Кроме того, наша отрасль совершенно оторвалась от науки, в этом есть существенные заслуги маркетологов, потому что мы уже программируем не на языках программирования и не на абстракциях, а мы программируем на фреймворках и библиотеках, которые нам "втюхали" в красивой обертке. Выгоднее всего делать некачественный код и обслуживать его или выбрасывать код и продавать больше времени на его повторное написание. Все по частям уже давным-давно написано, все можно найти в интернете, но оказалось, что одно с другим не лепится, то есть по частям оно есть, а вместе это не работает. Мы собираем все из кубиков, часто без всякого научного осмысления и редко можем ответить на вопрос, почему мы делаем так а не иначе. Происходит это именно из-за отсутствия системного подхода, терминологического раскола и понятийной рассинхронизации специалистов. Связывать разобщенные кусочки кода гораздо сложнее чем поодиночке их сделать. Я надеюсь, что этим курсом я сделаю хоть небольшой шаг к достижению такого важного для отрасли консенсуса. Вместе будет работать только то, что идеологически совместимо, что базируется на общей теории и выведенных из этой теории общих стандартах.

Каждую неделю я записываю 4 лекции. Все материалы курса в свободном доступе на github, а лекции открытые, их можно посещать бесплатно. Мы проводим еще семинары и практические занятия, но они не записываются.

Структура курса

  • Базовые понятия: программные абстракции, переменные, операторы, типы данных, массивы, структуры, скалярные и ссылочные типы, отображения;
  • Основные понятия: функции, контексты и область видимости, классы и объекты, прототипы, методы, лямбды, чистые функции, побочные эффекты, замыкания, частичное применение, каррирование, композиция, функции высшего порядка, колбэки, враперы, декораторы, примеси, события, интерфейс, синглтон, итераторы, функциональные объекты, функторы, монады, работа с файлами, потоки, сокеты, мемоизация, наследование, генераторы, асинхронное программирование, чеининг, модули и зависимости, обработка ошибок, фабрики и пулы, таймеры, регулярные выражения;
  • Вспомогательные материалы: git, системы контроля версий и менеджеры пакетов, работа с консолью, тестирование, непрерывная интеграция, логирование, линтеры, оптимизация и производительность, борьба с утечками памяти, скрытые классы, мономорфные функции, дженерики, сборка мусора, управление памятью;
  • Структуры данных: коллекции, массивы и типизированные массивы, буферы, списки, стек, очередь, дек, деревья двоичные и иерархические, многомерные деревья, повороты и балансировка ветвей, множества, хешмапы, графы, развернутые списки, асинхронная очередь, автоматы, итерирование структур данных и поиск;
  • Расширенные понятия: символы, прокси, диферы, фьючеры и промисы, линзы, трансдьюсеры, async/await, коллекторы данных, асинхронная композиция, адаптеры асинхронности, асинхронные итераторы, интроспекция, рефлексия, скаффолдинг, инверсия управления и внедрение зависимостей, песочницы, слоистая архитектура, компонентный подход, слой доступа к данным, проекции данных, мониторинг файловой системы, клиент-серверная и трехзвенная архитектура, кластеризация и балансировка, проектирование протоколов, динамическая перегрузка модулей, метаданные, динамическое связывание, межпроцессовое взаимодействие;
  • Примеры кода и комплексного использования технологий: живые электронные таблицы, чат на вебсокетах, реализация языка запросов к графам, альтернативная библиотека асинхронных абстракций metasync, сравнение реализации одинаковых задач на разных парадигмах, сравнение стилей функционального программирования, примеры структуры приложений, маршрутизация обработчиков в node.js приложениях, изоляция кода в песочницах, транзакционные объекты;
  • Парадигмы программирования: императивное, структурное и неструктурное, процедурное, объектно-ориентированное, прототипное, функциональное, логическое, декларативное, асинхронное, реактивное, событийное, автоматное, обобщенное, программирование управляемое потоками данных, мультипарадигменное, метапрограммирование.

Ссылки

Вход свободный для всех, но организационно проще оценивать количество слушателей. Календарь лекций доступен в двух митап группах: HowProgrammingWorks (это лекции по программированию на примерах JavaScript) и NodeUA (это лекции по Node.js) и я настоятельно прошу регистрироваться всех, кто хочет посетить лекции очно. За всю историю у меня были случаи и 600 человек и 2 человека, при чем явка непредсказуема.

Все записанные видео появляются в тот же день (через 10-20 минут после завершения лекции) на youtube канале.

Лекции сгруппированы в два плейлиста: по программированию и JavaScript и по Node.js.

Ссылки на лекции и материалы я размещаю в двух телеграм-каналалах: по программированию и JavaScript и по Node.js и другим более сложным темам.

Для обсуждения и вопросов есть две телеграмм-группы: по программированию и JavaScript и по Node.js.

Мой аккайнт на github, учебные репозитории в организации HowProgrammingWorks и библиотеки нашего комьюнити.

Заключение

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

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть