2012/12/25 20:49:46
Осенью уходящего года я собирался продолжить свою преподавательскую деятельность и начать вести кружок программистов во внешкольном учреждении МАН, подготовил программу и предварительно договорился, но переговоры с администрацией закончились неудачей. Выложу программу с некоторыми комментариями, вдруг кому-то пригодится.

Программа рассчитывалась ориентировочно на годичный курс по 9 академических часов в неделю (3 занятия, одно чисто практическое). В процессе предполагалось написать хотя бы пару годных коллективных работ на областную сессию МАН.


Предполагалось, что начнет ходить около 25 человек, из которых хорошо, если 8 что-то поймут, и пусть опережающие помогают отстающим, чтобы коллектив не сильно разрывался по уровню.

Первым делом стоит провести анкетирование, у первого визита всегда проблемы со временем, но надо как-то заинтересовать и одновременно собрать полезную информацию. Анкетирование:
ФИО, школа-класс, электропочта, есть ли дома компьютер? интернет? ноутбук? можете носить его на кружок?
Как хорошо знаете математику (3-4 вопроса по возрастающей)? программирование? какие аббревиатуры (№17 по ссылке) встречали?
Какой из перечисленных пунктов вызывает больше всего интереса (список кейвордов из программы, несколько не из, несколько в стиле Dota 2)?
Что бы хотели написать, когда станете хорошими программистами?
Есть ли свой блог?

Во внешкольных учреждениях принято поощрять инициативу и поисковую деятельность, но устно можно сообщать оценки для обратной связи из ограниченного множества {4, 5, 5+, 5++}, активно поощрять собственные неожиданные фичи.

В качестве дополнительной стимуляции поисковой деятельности и расширения кругозора можно устраивать угадайки в начале занятия, когда все собираются: голубая точка Сагана, адронная струя, Крабовидная туманность, Кошачий глаз, Фейнман, fast inverse square root, деванагари etc.

Запись: lecture notes и тесты в интернет, себя на диктофон (из расчета мегабайт в минуту → занятие на 2.5 часа займет 150 МБ), скринкасты (подумать о проекторе или большом телевизоре — в условиях нашего кружка вряд ли, веб-скринкаст правдоподобнее).

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

Пререквизиты: уметь печатать, пользоваться ОС, думать :)

Краткая реклама курса: веб-программирование (HTML-верстка/JavaScript/PHP+SQL), C++, математическое и спортивное программирование, программирование роботов, разработка трехмерных игр, научная визуализация, прикладное программирование, язык ассемблера и reverse engineering.

Софт: Chrome, Notepad++, Zen Coding (теперь он Emmet), PHP 5.4, MySQL, HeidiSQL, Olly, Visual Studio Express, JRE + TopCoder Arena, DirectX SDK, OGRE, Qt.

По ходу обучения понадобится давать очень несложные задачи (пока не дорастут до div2 250) и хорошо, если джадж для них буду делать не я. Нашел такие тут: http://acmu.ru/asp/champ/index.asp?main=stage&id_stage=40088


Собственно, сама программа, каждая тема примерно на неделю, некоторые меньше:

Знакомство, анкетирование, написание helloworld на C++ (важна инициация именно на первом занятии)
HTML
CSS
Модульная сетка, табличная верстка
Принципы дизайна, цветовые схемы, eye-candy, что такое рыба (в процессе разогрева фантазия будет хромать, хотя один товарищ уже через час втыкания начал выдавать вполне годную рыбу про завоевание Америки с помощью автоматов с клюквенным соком)
Итоговый проект: верстка по макету

Введение в программирование на JavaScript, переменные, типы, выражения, ввод-вывод
Условия, циклы, массивы, функции (очень важно заставить всех вслух распевать цепочки в графах исполнения)
DOM, события, jQuery, Raphael (ввод-вывод становится красивым)
HTTP, Ajax, JSON
Итоговый проект: игра на JavaScript (тетрис? лабиринт?) с серверным рейтингом

Введение в серверное программирование на PHP (думал еще про node.js, отверг), переменные, типы, выражения, ввод-вывод, условия, циклы, функции (снова нараспев исполнение)
Введение в ООП, классы, поля/методы, конструктор/деструктор, статические члены, модификаторы доступа
Введение в БД (ООП сразу применяем для обертки), таблицы, записи, четверка SQL, SQL injection (а сейчас я покажу вам, как ломают все сайты)
Прикладное веб-программирование, серверная графика gd, регекспы, аплоад, куки/хэши/авторизация
Принципы построения CMS: MVC, CRUD
Итоговый проект: блогодвижок, форум, башорг, джойреактор, типа вконтакт (сложность в районе 4-5 табличек)

Введение в низкоуровневое программирование, процессор, память, машинный код, язык ассемблера, mov, add, cmp, jmp/jz, стек, push/pop/ret/call, простейший крякми (а сейчас я покажу вам, как ломают все программы)
Введение в C++, переменные, типы, выражения, ввод-вывод
Условия, циклы, массивы, арифметика указателей, функции, отладка (Страустрап предлагает рассказывать про vector и string до указателей и массивов, стоит попробовать)
ООП в C++, классы, поля/методы, конструктор/деструктор, статические члены, модификаторы доступа
Наследование, динамический полиморфизм, vtable, виртуальные функции, виртуальный деструктор
Исключения, копиктор, оператор присваивания, идиома copy-and-swap, RAII, перегрузка операторов
Введение в STL: строки, контейнеры, итераторы, алгоритмы
Шаблоны, специализация шаблонов
Компилятор, линкер, использование статических и динамических библиотек, WinAPI, препроцессор
Итоговый проект: Retratech certification + топкодер + что-нибудь бэкендоподобное

Алгоритм, сложность, перебор
Строки, поиск подстроки, массивы, максимальная подстрока
Сортировка пузырьком, быстрая, пирамидальная
Графы, задача Эйлера, BFS/DFS/A*, рекурсия, топсорт, алгоритм Дейкстры, конечные автоматы
BST и красно-черное дерево, B-дерево
Введение в динамическое программирование
Математика для программистов, теория множеств, булева алгебра, алгоритм Евклида, комбинаторика, начала теории вероятностей, быстрое возведение в степень, бинарный поиск
Основы общей алгебры, комплексные числа, формула Эйлера, формула Муавра
Основы линейной алгебры, вектора, произведения, перестановочное неравенство, матрицы, определитель, система линейных уравнений, метод Гаусса
Основы аналитической геометрии, аналитическая форма геометрических фигур, пересечения, проекции, отражения
Основы математического анализа, предел, дифференцирование, интегрирование, преобразование Фурье (бегло, упомянуть БПФ, jpeg, аудиокодеки и прочее)
Дихотомия, метод Ньютона, генетические алгоритмы, нейронные сети (в стиле есть такое и где почитать)
Сжатие Хаффмана, краткая экскурсия по криптографии, избранные темы
Математические пакеты (Sage? Octave? WolframAlpha? Maxima?)
Итоговый проект: машинное решение какой-нибудь головоломки, простой архиватор, игровой бот, все с визуализацией, либо собственно визуализация алгоритма + практика на топкодере

Форматы данных, кодировки, XML, что-нибудь про форенсику
Введение в прикладное программирование, системный API, работа с файлами, сеть, сокеты
Введение в Qt, принципы построения GUI
Введение в программирование графики, полигональная графика, графический конвейер, вершинные/индексные буфера
Введение в COM, DirectX, текстурирование, рендертаргет
Введение в OGRE
Программирование шейдеров
Game loop, основы геймдизайна
Создание популярных эффектов, тени, антиалиасинг, скелетная анимация
Введение в game AI
Итоговый проект: трехмерная игра, видео/аудио обработка, машинное зрение, хорошо, если кто-то станет синим
Завершение итогового проекта, подведение итогов
Введение в Arduino (обещал же :))


Параллельно собирался писать по мотивам лекций шпору (она же lecture notes). Писал и по предыдущему курсу веб-программирования, обещал ее выложить после дописывания, но дописывать все же стало влом, выложил так: Введение в веб-программирование.pdf: на 11 страничках очень коротко изложено почти все, что нужно знать wannabe php newbie.

Интересно ли вам было бы учиться по такой программе?
30 посетителей, 24 комментария, 0 ссылок, за 24 часа