image


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


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


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


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

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


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


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


  • Базовые понятия: программные абстракции, переменные, операторы, типы данных, массивы, структуры, скалярные и ссылочные типы, отображения;
  • Основные понятия: функции, контексты и область видимости, классы и объекты, прототипы, методы, лямбды, чистые функции, побочные эффекты, замыкания, частичное применение, каррирование, композиция, функции высшего порядка, колбэки, враперы, декораторы, примеси, события, интерфейс, синглтон, итераторы, функциональные объекты, функторы, монады, работа с файлами, потоки, сокеты, мемоизация, наследование, генераторы, асинхронное программирование, чеининг, модули и зависимости, обработка ошибок, фабрики и пулы, таймеры, регулярные выражения;
  • Вспомогательные материалы: 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 и библиотеки нашего комьюнити.


Заключение


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

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


  1. Tantrido
    26.10.2018 04:37

    Круто: в КПИ ещё на русском преподают и сайт на русском — молодцы!


    1. Anshi85
      26.10.2018 06:23

      Круто, но не обязательно, если что то нужно узнать я с любого языка постараюсь перевести. Заметил что украинское
      IT сообщество более продвинутое и дружелюбное, нежели русскоязычное, у нас прежде чем ответить или помочь будут долго объяснять какой ты глупый и плохой.


  1. Hitman333
    26.10.2018 11:08

    Зашел на 2 плейлиста. Все хаотично разбросано и нет логической цепочки. Тут тебе говорят о базовом синтаксисе JS, а тут бабах и каррирование) Хотелось бы видеть более логичную структуру что бы по степам идти.


    1. MarcusAurelius Автор
      26.10.2018 11:13

      Есть еще оглавление курса, с темами, определениями и ссылками на репозитории. Ну и сначала нужно смотреть плейлист по основам программирования, просто подряд лекции: HowProgrammingWorks, а уж потом NodeUA. Чуть позже я собираюсь делать маленькие видео на 5-7 минут по каждому понятию и расставлять их по оглавлению курса.


  1. NiniCassini
    26.10.2018 16:08
    +2

    По своему скромному опыту, первые лекции мне были довольно скучными, я даже на одной уснула. Но буквально с 5й все меняется, темы становятся серьезнее. И даже на простых темах отвлекаться не стоит. Так что если вам «не зашли» первые, смотрите дальше.
    Не может не радовать что в КПИ все больше таких преподавателей, настоящих практикующих специалистов, с желанием и умением преподавать.