Введение в промышленное программирование и структуры данных. Часть I, язык C

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

Ранее этот курс читался в рамках известного проекта Ilab ("Айлаб", образовательной лаборатории МФТИ-Intel) и был доступен только для студентов ФРТК. Теперь он доступен для всех физтехов.

Несколько замечаний:

Те, кто уже занимался Си, Си++ и их потомками - Java, C# и т.п. - найдут много нового в нюансах языков, но главное - в том, как языковые средства применять грамотно.

Те, кто считают, что Си - уже мертвый язык, а в Си++ "легко выстрелить себе в ногу", возможно, в чем-то правы, но "гарантированно не выстрелить себе в ногу" можно только на языке, которым никто не пользуется. А языки семейства С/С++ и их потомки - абсолютные лидеры по применению. К сожалению, на любом языке можно писать плохо и выстрелить в эту самую ногу. Наша цель - научиться не делать так.

Те, кто активно занимался алгоритмами и олимпиадами, могут заметить, что алгоритмически курс не супер-нагружен. Это сделано специально, чтобы сфокусироваться на том, что в олимпиадах вообще не рассматривается. А не рассматривается там процентов 90 от необходимых навыков профессионального программиста, так как олимпиады - это лишь только спорт, и большинство навыков программиста-профессионала там просто не нужны. А в профессии - нужны.

Курсов, посвященным только алгоритмам очень много, как и литературы по ним в Интернете. Наш курс фокусируется на том, как грамотно реализовать алгоритмы и структуры данных и соединить их вместе в надежно работающий объемный проект, "чтобы не было мучительно стыдно" за бесцельно потраченное время, нервы коллег и свои собственные. История, увы, обычная для каждого олимпиадника, пытающегося прикоснуться к профессии. А вот об этом уже нет курсов, мало книг и немного систематизированной информации в сети.

Важно: этот курс не рассчитан на обучение "с нуля", он предполагает знание какого-либо языка программирования и алгоритмический опыт, олимпиадный или проектный.

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

Lifehack: Материал этого курса автор читает в своих академических группах МФТИ для первого курса, поэтому те, кто в этих группах учатся, могут получить за эту работу еще и зачет в зачетку. :)

May the Source be with you! :)

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

Вторая часть курса (11-12 занятий) – введение в структуры данных и алгоритмы, практическая часть которой содержит меньшее число задач, но большего объема. Задачи второй части подобраны по большей части таким образом, что в конце курса каждый студент самостоятельно реализует примитивную модель вычислительной системы, инструментальные средства низкоуровневой разработки для него, а также небольшой высокоуровневый транслятор в байт-код, совместимый с трансляторами других студентов на уровне AST. Это дает возможность использовать кросс-компиляцию программ одного студента для виртуальной машины другого и затем на ней, а также перевод в исходный текст в формате языка другого студента. Студентам предстоит разработать общие стандарты взаимодействия компонентов системы.

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

Четвертая часть курса (второй семестр, 6-10 занятий) посвящена технологии применения С++ (ООД, ООП, компо-нентное программирование) в многомодульном проекте, использующем программный код группы разработчиков в виде динамически подключаемых библиотек. Здесь, используя материал курса языка Ассемблера кафедры информатики МФТИ, появляется возможность устроить продолжение тематики второй части курса в виде реализации простейшего JIT-компилятора.

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

  • Лекция №1
    Введение в язык С. Краткая история и особенности возникновения языка. Трансляция и построение программы. Принципы промышленного программирования.
  • Смешанное занятие №2
    Принципы промышленного программирования (продолжение). Разбор различных инженерных решений.
  • Смешанное занятие №3
    Массивы и указатели. Динамическая память.
  • Смешанное занятие №4
    Многомерные массивы. Строки.
  • Смешанное занятие №5
    Структуры данных на языке Си
  • Смешанное занятие №6
    Развитие стекового вычислителя
  • Смешанное занятие №7
    Структура данных "Список" и ее реализации. Хеш-таблицы.
  • Семинар №8
    Структура данных "Список" и ее реализации. Хеш-таблицы.
  • Смешанное занятие №9
    Структура данных «дерево» и алгоритмы синтаксического разбора
  • Семинар №10
    Структура данных «дерево» и алгоритмы синтаксического разбора
  • Смешанное занятие №11
    Архитектура nGCC. Front-end, middle-end и back-endFront-end, middle-end и back-end.
  • Семинар №12
    Архитектура и реализация nGCC.
  • Семинар №13
    Архитектура и реализация nGCC.
  • Рубежный контроль №14
    Архитектура и реализация nGCC.
  • Рубежный контроль №15
    Архитектура и реализация nGCC.

Длительность
15 занятий
64 ак.часов

Курс преподает

    Илья Дединский Илья Дединский

Получаемые навыки

Результатом согласованной работы лектора, семинариста и студентов должно стать не только изучение теоретического материала и отработка его на практических задачах, но и формирование современной методологии разработки программ и профессиональной системы ценностей у студентов, что позволит им как успешно разрабатывать системные программные продукты, так и участвовать в дальнейших курсах Технотрека.

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

После прохождения этого курса студенты должны получить все эти навыки. И начать их оттачивать месяцами и годами, "правило десяти тысяч часов" никто не отменял. Но профессиональные качества программиста зависит от того, как именно провести эти десять тысяч часов.

Контроль знаний

Контроль заданий осуществляется через помещение его на серверный репозиторий курса. Основная форма проверки кода – детальный code review с разбором типичных случаев на групповых занятиях, юнит-тестирование, перекрестное тестирование. Со второй части курса вводится peer review.