Взято по ссылке
Сферы знаний и компетенции, которые вообще существуют
Список можно и нужно дополнять.
Если в списке указан большой курс, это не повод не включать его составные части и выделять из курсов подтемы, которые кажутся важными.
Сюда стоит включать и темы, которые редко где рассказывают, хотя они и бывают полезны.
Не факт, что всё из этого войдет в учебную программу, но мы сначала хотим как можно шире представлять, что в мире вообще бывает.
Следующей задачей будет подробить курсы на темы обозримого размера, а затем скомпоновать ликбез и полноценные курсы и определить часы на них
алгоритмы и структуры данных
дискретная математика; графы, конечные автоматы и регэкспы
математика:
линал
комбинаторика, теорвер со статистикой + алгоритмы на монте-карло, например
матан: производная, интеграл, сходимость к пределу, язык кванторов, непрерывность, ряд Тейлора и О-нотация, экспонента как предел, сюда же неплохо укладывается введение в комплексные числа через вывод формулы Эйлера, исследование экстремумов и асимптотик, возможно, ряды, производная по направлению и дифференциал, фурье и анализ сигналов. Остается неясным, нужны ли всякие теоремы об абсолютной сходимости рядов и критерии их сходимости; теоремы о перестановке под двойным интегралом. Или лучше помахать руками и показать, что всё бывает непросто, а дальше дать какие-то простые правила, когда всё точно ок. Ещё есть вопрос, нужны ли многомерные интегралы (и рассказать про различие интегралов по поверхности и по пространству) и замена переменной под интегралом (как красивая связь линала и матана)
вычмат(методы Эйлера и Рунге-Кутты, приближенные методы поиска корней,, методы Монте-Карло, сплайн-интерполяция), линейное программирование и методы оптимизации
мат.логика (ну только не с позиции “сейчас вы узнаете что-то новое”, а с позиции “давайте формализуем то, что вы уже знаете, а затем наткнемся на противоречия, попытаемся их разрешить, а потом и обобщить).
геймдев и работа с 3D + теормех
теория вычислений - маш.Тьюринга, алгоритмы Маркова, проблема остановки, P/NP/…
теория информации
формальная верификация программ, системы доказательств
парсеры и компиляторы, байт-код и виртуальные машины
устройство памяти, виртуальная память итп
Операционные системы и системное программирование
драйвера для виндоус и модули ядра/fuse для линукса
пользовательская работа с ОС (bash, xserver итп)
контейнеризация и виртуализация
внутреннее устройство и линковка бинарных библиотек
Устройство IDE, фреймы/окна, пайпы и собирание рабочей среды под себя
устройство makefile/maven итп
пакетные менеджеры (apt, pip, собственные репозитории, версионирование)
веб-прогр.: бэкенд (MVC, веб-серверы трёх уровней типа app/unicorn/nginx, кэш, база данных), html+css, js, создание своих API
десктопное программирование: Qt, …
мобильная разработка
UI/UX
bash, coreutils, ssh
системное администрирование - разделы файловой системы, конфиги, crontab, файрвол, системные логи, many more…
docker
kubernetes
парадигмы и основания программирования - ооп (с как можно более широким покрытием имплементаций в разных языках, а то java и smalltalk мало общего имеют), функциональное программирование, логическое программирование, метапрограммирование, теория типов
lisp
также я бы добавил отдельный раздел — подходы к проектированию систем:
event sourcing, CQRS, domain driven design, вот это все
анализ данных
визуализация (data-журналистика, например)
машинное обучение
нейронные сети
компьютерное зрение
искусственный интеллект (от экспертных систем до reinforcement learning)
обработка естественного языка
чат-боты
сети и протоколы: модель OSI, железный уровень (от кабелей до wifi и сотовых технологий), архитектуры сетей, маршрутизация, TCP/UDP, http(s), mesh-сети, P2P-коммуникация, открытые протоколы - DNS/XMPP/FTP, почтовые протоколы, …
железо - asm, архитектура процессора, прерывания, BIOS, драйверы, типичные скорости кэш процессора/RAM/SSD/HDD/сеть
железо-2 - микроконтроллеры, телеком и прочий реалтайм, Internet of Things, робототехника и промышленное оборудование, компьютеры в экстремальных средах (космическое излучение, например)
железо-3 (“тыжпрограммист, собери мне компьютер”) - типы портов и средств коммуникации на близких расстояниях от COM и USB порта до bluetooth и NFC, устройство шин, SCSI/SATA/…, типы RAID (+отличия программного и аппаратного), …
Электричество, теория поля и оптика (устройство систем передачи данных)
параллельное программирование, облачные вычисления
async programming (go channels / fibers / await / actors / erlang / etc)
базы данных, sql, nosql, графовые бд и семантические сети
kafka / rabbit mq / sqs
разворачивание и примерное понимание как работают децентрализованные системы а-ля elastic search / kafka / любое современное хранилище, которое умеет sharding / replication
отладка и тестирование, профилирование и performance, документация
рефакторинг, практика по именованию переменных и других сущностей
работа с legacy-кодом
1с (один-эс)
информационная безопасность (криптография(здесь же условный блокчейн), инъекции итд, антивирусы)
big data: алгоритмы обработки больших данных и сопутствующие технологии
highload
архитектурные паттерны
(я бы ещё предложил практикум по рисованию архитектур на, скажем, PlantUML или чём-то подобном)
git
девопс - CI, docker, kubernetes, ???
api и работа с библиотеками; JSON/XML/…
написание своих API: RPC/REST/…, версионирование,
квантовые вычисления
офисные приложения, хоткеи, слепая печать
vim, эффективная работа IDE
латех
jupyter
mathematica или там sympy
ГИС-системы
пайплайны и интеграция систем из неоднородных компонентов (байндинги на разных языках, межпроцессная коммуникация итд)
история IT в лулзах и факапах
-
сбор требований от заказчика, аджайл, ватерфол, тайм-менеджмент, UML(?)
-
модели монетизации IT-проектов (от рекламных сетей до бизнеса интеграторов); где здесь open source. Это, кстати, был бы хороший вводный курс - т.к. в процессе много можно узнать про то, где и как программирование использовали и оно “взлетало” (и не менее важно - где не взлетало, чтобы было понимание что не все проблемы мира решаются программированием)
-
веб-аналитика
-
возможно, как устроены бизнес-планы вообще, венчурный бизнес
понимание, что существует такая штука как облака, базовые навыки работы с aws / gce / azure, понимание отличий от своего хостинга + удобств,
туда же CDN, DDoS protection
право в области интеллектуальной собственности
технический английский
Можно посмотреть чужие программы:
-
фкн вшэ https://cs.hse.ru/programs
-
итмо
-
фивт и фупм
-
вмк
-
иннополис
-
бауманка
-
маи
Вот например, исследование операций - типичный курс. Что там делают?
теория массового обслуживания
Концептуальные идеи
Одна из идей - сделать курс таким, чтобы студенты не хотели свалили работать, прежде чем станут компетентными и получат полноценные фундаментальные знания. Для этого хорошо организовывать оплачиваемые стажировки в рамках учебной программы
В первый год должен быть вводный курс, где по 1-2 лекции рассказывается про всё-всё-всё “на пальцах”. Цели: а) дать представление об области; б) на семинарах-домашках дать те 10% темы, которые позволят уже что-то прикладное делать; в) показать им насколько многого они не знают, чтобы был стимул не уходить после первого курса работать кодером, не получив должной широкой подготовки.
На следующих курсах эти предметы читается уже систематически. Какие-то из них будут обязательными, какие-то опциональными
Под каждую парадигму программирования хорошо бы давать несколько языков на выбор. Например, статическая типизация - С++/Java/C#, динамическая типизация - Python/Ruby/PHP, ФП - Lisp/…, ? - Scala/Haskell/Rust, возможно где-то Coq/Agda
Вообще выбор - хорошо, возникает ощущение, что сам отвечаешь за то, чтобы образование было оптимальным
Хорошо бы делать курсовые проекты, создаваемые командами от 2 человек. Каждый год или семестр стоит делать проект по одной из специализаций.
“Безумное чаепитие” как формат командной работы над проектами https://habr.com/ru/post/298460/
Время от времени устраивать хакатоны было бы полезно
Open-source практикумы тоже полезно, наверное. Плюс учиться читать чужой код, в т.ч. на незнакомых языках и фреймворках
Сколько нужно матана, в какой детализации, чтобы о нем было представление, но не перегрузить доказательствами теорем и проч. Работа с кванторами изучается где-то кроме матана? О-символика? можно ли привязать сюда погрешности вычислений и обсудить арифметику плавающей запятой? На каком курсе это нужно давать?
полезны ли студентам сертификации (w3c, cisco, oracle, microsoft,…) и для чего: как учебный материал? как независимая проверка знаний? как помощь в трудоустройстве?
(на будущее) часть кафедр может находиться в IT-компаниях: они и учат, и организуют стажировку/диплом.
Под некоторые курсы (параллельные вычисления, нейронные сети) хорошо бы найти вычислительные ресурсы: небольшой кластер и GPU.
Кажется интересным и полезным заложить в часть программистских и математических курсов майндсет “как это сломать” и “понять, почему это ТАК работает”, найти ошибку в коде/доказательстве/… См. примеры:
*https://www.facebook.com/vorontsov.i.e/posts/10204465273709141?comment_id=10204465842483360&reply_comment_id=10204467878374256
*пример [‘1’,‘7’,‘11’].map(parseInt) → [1, NaN, 3]
*книгу “Контрпримеры в анализе”
Доклад Брагилевского “Как преподавать программирование программистам” https://youtu.be/ygK80xGC-WI?t=9928
https://mnmc.hse.ru/it-conference/program/2310 - конференция
теормин - https://sharpc.livejournal.com/67583.html
Может иметь смысл делать обучение “летняя школа-стайл”: параллельно идут не 10 курсов, а 2-4, зато в формате интенсивов (например, базы данных мы изучаем всего месяц, зато по пять пар в неделю). Например, есть слот в 5 пар на неделе под интенсивы, на котором раз в месяц меняются темы и преподы. Проблема с такими курсами логистическая: временный препод должен гарантировать, что в эти дни ему не будет мешать прочая работа; постоянный препод, который работает месяц в остальные месяцы тоже должен получать зарплату.
Открытые вопросы
Как организован отбор: есть ЕГЭ + какие-то дополнительные вступительные испытания.
Какие ЕГЭ? математика + информатика + русский?
Можем ли мы жонглировать ценностью предметов в общем балле вступительных?
Должен ли на каком-то уровне абитуриент уже уметь программировать?
Что с общагой (+как сделать вступительный экзамен для иногородних)
есть ли идея сделать факультет совсем универсальным или все-таки специализированным? есть ли тут работа с железом? есть ли тут вычислительная математика? (или считаем, что в этих нишах уже есть хорошие игроки и лезть туда не надо)
Lockywolf: мне кажется, чтобы студенты не бежали от математики, нужно сразу давать эту математику с приложениями. Задания сдавать только в электронном виде, в виде code-review к коду, собирающему документ из markdown/latex. К каждой задаче требовать картинку, иллюстрирующую её.
Интересные рассуждения о программировании, как сцепке наука+ремесло+искусство (https://www.facebook.com/sergei.abramov.96/posts/10215640452860742)
Школьный план
параллели есть:
-
инфомат (моя)
-
физхим (?)
-
биохим (?)
-
матфиз (Пашина)
-
матэк
-
соцэк
-
гум
Чем будет заниматься 10-й в след.году. И чем отличается матфиз (у Паши) от инфомата.
Инфомат - прикладное программирование.
Надо очень четко сформулировать отличия
веб + js
веб-парсинг + API
базы данных
numpy, matplotlib, машинное обучение и анализ данных, компьютерное зрение
регулярки
криптография
алгоритмы и структуры данных
ооп (мб на примере flask)
?? языки программирования java / c#
операционные системы
bash
ssh
git
package management
векторизация-параллелизация-многопоточность(может быть не на примере анализа данных, а написать краулер; UI тоже умеет из коробки), возможно это стоит не на питоне а на js делать; битвы нескольких ботов в параллель
10 класс:
или проекты размером поменьше, но штуки три
или отказ от проектов в сторону лекции+семинары
скрейпинг: спортивная статистика, например
проект может занимать 2 часа из 4 в модулях 3 и 6, а в основном треке в это время нет домашек, и он основную тему углубляет
(!) они не сами придумывают проекты + проекты не групповые (по-крайней мере если нет четкого разделения областей)
2 урока и 2 урока стоит сделать разными тематиками (например, прикладное и теоретическое програмирование)
писать домашние задания
(?) знают ли они матрицы, статистику, производные и можно ли их использовать для объяснения анализа данных
работа с командной строкой:
- cd, cp, mv, rm, cat, less
- вместо with open(filename) работать с перенаправлением, и с пайпами
- права доступа (включая +x)
запускать питон в командной строке
argv
latex (в несколько подходов + сверстать текст + запишите доказательство теоремы + оформить презентацию + слепить документ из нескольких глав + bibtex)
unicode и кодировки
Приближенные и случайные алгоритмы. Оценить диаметр множества точек за бустрепав. Приближенный kNN.
случайные величины
opencv, фильтры-свёртки
работа со звуком(?)
работа с текстами: токенизация, нормализация, n-граммы, bag of words, word2vec. Классификация спама наивным байесом, codenames, генератор плагиата (подбор синонимов)
nltk, pymorphy, gensim
CTF на один урок
http, cookie, заголовки
cgi/fastcgi
как работает интернет
криптография: RSA, Диффи-Хеллман, шифрование и подпись, блокчейн и Proof of Work (и что он используется ещё в ), атаки (MitM, reply attack)
10 класс:
- Алгоритмы и структуры данных:
- массивы и списки.
- Структура данных = (данные + операции) и их асимптотики
- стек / очередь
- куча, очередь с приоритетами
- сортировка (заодно - рекурсия); можно разобрать qsort, а затем рассказать, что существуют ещё как минимум mergesort и сортировка подсчётом
- ООП как способ за счет инкапсуляции поддерживать инварианты структуры
Структуры поиска (хорошо сочетается с темой про индексы в БД - в курсе про веб):
- двоичный поиск
- деревья поиска
- хэш-таблицы
- графы
- направленные/ненаправленные
- различные формы хранения
- обходы: BFS, DFS
- поиск кратчайших путей: между двумя элементами, от одного элемента до всех элементов, от всех до всех. Почему некоторые алгоритмы работают не с любыми графами?
- описательные метрики графов: центральность, хабы, выделение иерархической структуры
- рассказ про то, какие ещё задачи бывают и зачем: топологическая сортировка, конденсация, остовные деревья, поиск клик, поиск паросочетаний, задача комивояжера, поиск минимального разреза, поиск максимального потока. Какие-нибудь из них применить, используя библиотеки типа networkx
- отступление в сторону: graphviz
- конечные автоматы. Регулярные выражения. Разгрузка: тренируемся с grep
- (разгрузка) верстаем в latex какую-нибудь теорему
- грамматики и BNF. YACC(?)
- строки и поиск в них.
- геометрические алгоритмы, kNN по всем объектами с помощью разбиения на клеточки, затем рассказать про B-tree
- линейная регрессия, параметризация
- Explorative data analysis
- jupyter notebook
- среднее, медиана, квантиль. Матожидание, дисперсия.
- линейная регрессия, метод наименьших квадратов
- матрицы, numpy
- matplotlib
- RANSACK (работа с аутлаерами)
- Монте-Карло, бутстрепинг
- корреляция, мультиколлинеарность
- правдоподобие, формула Байеса
- задачи регрессии и классификации,
- работа с изображениями: руками и через opencv
- проект: разгадывание капчи, предсказание температуры плавления вещества по табличке с температурой кипения, длиной цепи итп.
- Введение в веб:
- html+css, скрейпинг, работа с API
- пишем своё приложение, ssh (+screen/tmux), TCP/IP + http (чтобы понимали порты), выкладываем проект на сервер
- git (потому что у нас есть локальная версия и версия на сервере)
- добавляем в приложение базу данных, SQL руками (индексы, join таблиц, запросы к данным и к схеме aka миграции)
- проект например: скрейпинг + заполняем базу данных + веб-страница для взаимодействия и полуавтоматическая разметка
Веб-разработка
-
Анализ данных и визуализация
11 класс:
-
ООП (наследование, полиморфизм), системы типов; разница между статической и динамической типизацией, сильной и слабой; вывод типов. Типизированные списки и функции. Компиляция, интерпретация, JIT. Использование типов в питоне и mypy
-
Машинное обучение
-
Технологии программирования
-
Технологии программирования (git, bash, ssh)
аналоги tSNE и оптимизационные задачи (оптимизация расстояний на плоскости), оптимизация сетей, генетические алгоритмы для оптимизации гиперпараметров, градиентный спуск, отжиг, линейное и квадратичное программирование(?)
алгоритмы: простые вещи делать руками, сложные - из коробки
**