Лекции по программированию 1 курс. Чему учат на CS50. Кто учит, как давно и кого

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

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

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

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

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


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

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

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

В открытый доступ уже несколько лет назад, но переводится на русский впервые. За основу взяли самую свежую версию - ту, что стартовала в самом Гарварде осенью 2015 года.

Передаём слово ребятам из JavaRush.

Прежде, чем стать типичным программистом, человеку нужно пройти путь типичного студента. Под «студентом» тут имеется в виду человек, который основательно учится чему-то новому. Учится не обязательно в вузе: возможно, он самостоятельно перерывает интернет в поисках полезной информации. Среди тонн информационного мусора порой можно отыскать настоящие алмазы, хотя при нынешних размерах и структуре глобальной сети сделать это весьма и весьма непросто.

Однажды Zapp, глава JavaRush (о JavaRush будет в конце статьи), рылся в интернете, пытаясь найти такие вот алмазы для новичков в программировании - студентов JavaRush - и наткнулся на CS50. Под этой аббревиатурой скрывается вводный курс по основам компьютерных наук и искусства программирования. Его читают студентам Гарвардского университета, с недавнего времени - еще и в Йеле. И «заочно» во всем мире, посредством образовательной интернет-платформы edX. Причем совершенно бесплатно!

Признаться, курс зацепил Zapp’а, хотя обычно он не слишком (мягко говоря) жалует университеты, пичкающие студентов технологиями, утратившими актуальность ещё во времена бурной юности их родителей. Вузовские «айтишные» лекции еще и скучные чаще всего. Настолько, что скулы сводит. Но нет, CS50 - не такой, даже близко! Он прогрессивный (постоянно обновляется), лекции можно смотреть как крутой сериал (а не засыпать на задней парте или заниматься своими делами), задания подобраны со смыслом. Курс хочется смотреть, изучать и… продолжать вливаться в ИТ.

Одним словом, CS50 делает ровно то, что должен делать любой вводный курс: дает основы и вдохновляет на будущие свершения. При этом он универсален, то есть пригодится абсолютно любому будущему айтишнику независимо от специализации. А еще, чтобы усвоить CS50, не нужно штудировать «матанализ», «дискретку» и прочую университетскую математику. Курс вполне осилит гуманитарий или старшеклассник. Если английский знает, разумеется. А если нет? Раньше тех студентов, кто с трудом разбирал энергичную речь лектора, могли выручить разве что автоматически переведенные субтитры, из которых выудить смысл крайне тяжело на самом деле.

Но теперь даже английский учить не придется. Хотя нет, конечно, но уже для работы, а не для учёбы. Потому что мы - JavaRush и студия VertDider - перевели лекции CS50 на русский.

Чему учат на CS50

Будет неправильно сказать, что на CS50 вас научат программировать «от» и «до», но, как по мне, правильное введение в информатику должно быть именно таким. Студентам поясняют всё и понемногу, но прежде всего - как «мыслит» компьютер. Его азбуку - двоичное счисление и понятие алгоритма и алгоритмизации поясняют сразу же, а бинарный поиск, над правильной реализацией которого нужно хорошо подумать, поясняется легко и быстро прямо на вводной лекции. Да еще и со спецэффектами в виде порванных телефонных справочников и специальной теплой «ламповой» бинарной машины. Даже понятие сложности алгоритма пояснили на наглядном примере, предложив способ быстрого подсчета примерного количества людей в аудитории (людей в аудитории было порядка полутысячи, если что).

С программированием как таковым CS50 начинает знакомить на «нулевой» неделе. Вероятно, чтобы не пугать даже самых неуверенных гуманитариев, профессура Гарварда первым делом показывает студентам визуальный язык Scratch, на котором можно составлять программы простым перетягиванием графических элементов. Эта разработка Массачусетского Технологического Института (MIT) предназначена для обучения школьников, но основные концепции процедурного программирования - всякие циклы и условия - понять помогает очень быстро. Однако на Scratch никто долго не останавливается, а сразу же переходят на «великий и прекрасный» язык C, и большинство практических заданий студенты CS50 решают именно на нем. Очень неплохой выбор хотя бы потому, что C - чуть более низкоуровневый, чем большинство других ходовых языков, то есть хорош для понимания работы компьютера. К тому же знание основ С не помешает «линуксоидам» и прочим админам. Кстати, Linux’у и его командам также уделено внимание в курсе.

Далее студентам рассказывают о понятии функции, глобальных переменных, параметров, возвращаемых значений. Объяснят принцип стека и «кучи» (heap) и какие данные там хранятся, расскажут о массивах, строках и аргументах командной строки, отладке, вводе и выводе в файлы.

Конечно, не обойдется без основ алгоритмов и структур данных. Студенты получат очень внятные и интересные пояснения алгоритмов поиска (линейного, двоичного) и сортировок (пузырьковой, выбором, слиянием), ознакомятся с деревьями и хеш-таблицами.

Узнают о том, стоит ли боятся рекурсии и когда она необходима. А еще - о такой экзотике, как указатели, которые наделяют программиста огромной силой, но негативно сказываются на безопасности.

Счастливые слушатели CS50 получат представление о такой науке, как криптография, и поймут, в чем сила самых известных шифров - Цезаря, Виженера, DES.

Точно так же - поверхностно, но в самый раз для первого знакомства - в курсе поведают о веб-разработке, основах CSS, HTML, JavaScript и PHP. И немного о SQL с базами данных.

Если очень кратко, то CS50 вот о чём:

  • Алгоритмы и алгоритмизация задач.
  • Абстракции, структуры данных, инкапсуляция, управления памятью.
  • Основы языка программирования C и программирования в целом.
  • Понятие о веб-разработке и базам данных: CSS, HTML, JavaScript, PHP, Ajax SQL.
  • «Правильная разработка». Что такое MVC.
  • Искусственный интеллект.
  • Понятие о шифровании.

Кто учит, как давно и кого

CS50 эволюционировал от обычного вводного курса по программированию до настоящего суперхита. В Гарварде его читают, начиная с 80х годов минувшего столетия, но он начал стабильно набирать популярность после того, как его возглавил Дэвид Малан . Этот профессор Гарварда - вовсе не углубленный в себя и свою науку седовласый старец. Это увлеченный дирижер (или режиссер, если угодно), умеющий заразить своей увлеченностью, рассказать просто о сложных вещах и вдохновить на продолжение учёбы.

Впервые Дэвид прочёл CS50 в 2007 году, а уже в 2014 году 12% студентов Гарварда всех специализаций, то есть более восьми сотен человек, записались на «Основы программирования», загнав его в топ популярности среди всех курсов колледжа. До этого все было не так весело и многолюдно. Скажем, на лекции создателя Facebook Марка Цукерберга в 2005 году присутствовало аж 15 студентов. Правда, тогда эта социальная сеть только-только набирала обороты. Каждый год Дэвиду ассистируют множество человек - как другие преподаватели, так и недавние студенты CS50. И еще пара-тройка Muppet’ов=).

Вы, возможно, слышали о Сьюзен Войчицки (Susan Wojcicki), исполнительном директоре Youtube. Так вот, в 1990 году она заканчивала Гарвард. Факультет истории и литературы, как ни странно. На последнем курсе девушку перемкнуло, и она решила узнать побольше о компьютерах, посему - выбрала CS50. Затем была Кремниевая долина, дружба с Ларри и Сергеем (теми самыми Ларри и Сергеем), свой луна-парк, все дела. Вот как CS50 может изменить жизнь.

А вы кто такие, господа переводчики?

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

Где найти переведенные лекции

Вот страница , на которой появляются лекции курса на русском языке. Они будут доступны совершенно бесплатно всем пользователям интернета. Перевод первой лекции появился 20 июня, следующая будет 27 июня, дальше - по мере их готовности.

Следите за обновлениями на страничках JavaRush в социальных сетях.

(Основы языка С++, I семестр)

Введение

В первом семестре рассматриваются основные конструкции языка Си и базовая технология программирования (структурное программирование).

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

    1. Алгоритм и программа

Алгоритм – точное предписание, определяющий вычислительный процесс, идущий от изменяемых начальных данных к конечному результату, т. е. это рецепт достижения какой-либо цели.

алгоритм

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

Сначала всегда разрабатывается алгоритм действий, а потом он записывается на одном из языков программирования. Текст программы обрабатывается специальными служебными программами – трансляторами. Языки программирования – это искусственные языки. От естественных языков они отличаются ограниченным числом «слов» и очень строгими правилами записи команд (операторов). Совокупность этих требований образует синтаксис языка программирования, а смысл каждой конструкции – его семантику.

    1. Свойства алгоритма

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

    Результативность: алгоритм должен приводить к получению результата за конкретное число шагов (при делении 1 на 3 получается периодическая дробь 0,3333(3), для достижения конечного результата надо оговорить точность получения этой дроби, например, до 4 знака после запятой).

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

    Дискретность – процесс должен быть описан с помощью неделимых операций, выполняемых на каждом шаге (т. е. шаги нельзя разделить на более мелкие шаги).

Алгоритмы можно представить в следующих формах:

    словесное описание алгоритма.

    графическое описание алгоритма.

    с помощью алгоритмического языка программирования

1.2. Компиляторы и интерпретаторы

С помощью языка программирования создается текст, описывающий ранее составленный алгоритм. Чтобы получить работающую программу, надо этот текст перевести в последовательность команд процессора, что выполняется при помощи специальных программ, которые называются трансляторами. Трансляторы бывают двух видов: компиляторы и интерпретаторы. Компилятор транслирует текст исходного модуля в машинный код, который называется объектным модулем за один непрерывный процесс. При этом сначала он просматривает исходный текст программы в поисках синтаксических ошибок. Интерпретатор выполняет исходный модуль программы в режиме оператор за оператором, по ходу работы, переводя каждый оператор на машинный язык.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: