Мой вариант курсов для ВУЗовского образования по специальности "программная инженерия" (характеристика этих курсов даётся в каждом "кумулятивно", т.е. очень грубо считаем, что эти курсы проходятся последовательно, а не "вперемешку" и умения накапливаются от курса к курсу):
1. Грунтовка мозга: подготовка "думателя"
-- английский язык
-- дискретная математика, классическая логика
-- философская логика (и совсем чуть-чуть философии)
-- лингвистика
-- формальные семантика и прагматика в объеме, чтобы свободно читать теоретические статьи по computer science.
После этого курса выходят очень умные, полностью бесполезные в любом деле люди. Зато их можно потом легко обучить многим и многим профессиям, ибо они после этого курса "быстро схватывают".
2. Предметная ориентация: подготовка "учёного программиста" (computer science)
-- парадигмы программирования и языки программирования
-- моделирование данных (от реляционок до онтологий, от XML до ISO 15926)
-- алгоритмика (методом Кнута без пряника, но не чураясь параллельности)
-- как устроены компиляторы, интерпретаторы, виртуальные машины, моделлеры и прочие редактирующие и исполняющие среды -- в объеме, позволяющем ориентироваться в том, что пишут в рассылке FONC, на сайте Lambda Ultimate, а также примерно понимать, как устроены системы типа помянутых в
http://www.languageworkbenches.net/ar.html Эти люди могут побеждать в олимпиадах по программированию, читать лекции в университетах, но к работе по специальности "программная инженерия" совершенно не приспособлены (ибо у них нет в лексиконе слов "требования", "архитектура", "методология разработки" и т.д.) -- то есть "придумывать алгоритмы умеют, а работать не умеют".
3. Профессиональная ориентация: инженерные компетенции:
-- системный подход, инженерный метод (работа с эвристиками)
-- ситуационная инженерия методов, методологии разработки
-- технические практики системной инженерии (инженерия требований, инженерия системной архитектуры и т.д.): не для "чисто программных систем" (таких нет), а сразу для социотехнической системы, киберфизической системы и т.д.,
-- особенности программной инженерии: методологии разработки (в ассортименте: RUP, SCRUM и все-все-все, понятие о devops etc.), архитектура и моделирование, методы тестирования, методы версионирования и управления конфигурацией, продуктные линии и т.д.. Фишка в том, что это одна строчка в программе, т.е. учить нужно отнюдь не только этому! Всё это дается как "специализация" для практик системной инженерии.
После этого курса выходит инженер-программист ("умеет программировать"), не ориентирующийся в жизни. Он хорошо решает поставленную ему узкую программистскую задачу, но у него нет знаний о том, как устроено производство -- поэтому он постоянно решает ненужные задачи, и не решает нужные ("программировать умеет, программирует всё время что-то не то"). Поэтому требует мелочного внешнего управления.
4. Инженерный менеджмент (как устроено производство)
-- праксеология (формальный анализ человеческой деятельности)
-- enterpise engineering (организационные модели + change management)
-- управленческий учёт
-- проектное управление в связи с методологиями разработки
-- работа с живыми людьми (aka "лидерство")
После этого курса выходит инженер-программист, который ориентируется в производственной жизни, способен встроиться в производственный процесс, "самоорганизующийся" и даже при случае "организующий". Это и есть искомый результат обучения.
Время такого образования -- входное условие (например, 4 года), а вот уровень квалификации выпускника существенно зависит от методики (т.е. выбранных наборов упражнений -- по моей оценке, ежели учить "правильно", т.е. учить тщательно подобранными упражнениями для предварительно отмоделированных мыслительных операций, то получается обычно впятеро быстрее, чем если учить "традиционно").
UPDATE: мой рассказ (1 час 23 минуты видео) этих тезисов в виртуальной академии:
http://ailev.livejournal.com/937397.html* * *
Понятно, что у меня есть собственное понимание, что такое "инженер-программист" (не только теоретическое, но и практическое: у меня многолетний рабочий стаж и программиста-теоретика, и инженера-программиста, и менеджера программистского коллектива, и многолетний стаж работы в проектах, где айтишные задачи представляют только часть работы).
Для понимания моего подхода полезно также ознакомиться с другими моими материалами по общему верхнему образованию:
-- программа общего верхнего образования:
http://ailev.livejournal.com/853399.html (июль 2010)
-- тезисы к Программе общего верхнего образования:
http://ailev.livejournal.com/855472.html (август 2010)
-- оценки времени верхнего образования:
http://ailev.livejournal.com/871079.html (октябрь 2010)
-- системная инженерия верхнего образования
http://ailev.livejournal.com/907435.html (февраль 2011)