Возник уникальный курс по направлению Программная инженерия. Уникальный, потому как читается один раз. Когда создавался первый раз учебный план по направлению, этим курсом заткнули дыру - вместо физики. Планы на следующие года создавали уже с чувством, с толком и с расстановкой, и там такого курса нет (есть много отдельных курсов по программной инженерии). 
Курс годовой, в первом семестре - экзамен, во втором - зачет. Одна лекция и одна лаба в неделю.
В принципе, что читать - понятно. 
Проблема в следующем: это студенты первого курса и одновременно начинают изучать программирование на языке высокого уровня (это основы С++). До того они прошли основы алгоритмизации на основе Кумира, то есть писать программы в принципе умеют. Функции писали и массивы обрабатывали. 
Не совсем понятно, как строить лабы. Вариантов - два. 
Первый. Берем те же лабы, что и на программировании, и делаем их по науке: сверху-вниз, с пошаговым уточнением, через тестирование... Тут не совсем ясно, как это проверять. Отчет по лабе с описанием всех шагов требовать?
Второй. Берем ББ+КП и исполняем те же лабы. На основе школьной сборки, например. В первом семестре. 
А во втором - английская версия ББ - 1.5 и лабы покрупнее. 
А потом сравним и статистику соберем.   
Кстати, может ли кто-нить какие-нить лабы покрупнее порекомендовать?
Вот у меня на системном ПО одна из лаб такая. Задается архитектура виртуальной машины, и надо реализовать интерпретатор. А проверку интерпретатора выполнять с помощью программы в кодах виртуальной машины. 
Требования к реализации (на С++)
1. Объектно-ориентированный подход.
2. Модульный подход. 
Процессор – отдельный класс, разделение на интерфейс и реализацию;
Выполнение команд – вызов функтора (не использовать оператор-переключатель!)
Память – динамический массив – поле-указатель в классе 
Команды – иерархия классов-функторов; 
Базовый класс – абстрактный класс Command с перегруженной операцией operator()  
Пример архитектуры:
Цитата:
Одноадресная, стековая с адресным регистром 
PSW – 32 бита = 16 + 4 + 12 = IP + SP + Flags
Память – байтовая, размер адреса = 16 бит.
Стек вычислений– 16 ячеек по 4 байта – в процессоре
адресный регистр – 2 байта
Типы данных:
	Целые знаковые – 4 байта
Дробные – 4 байта
Структура команды, 24 бита:
	Код операции – 7 бит,	b – 1 бит
		b = 0 – адрес (абсолютная адресация)
b = 1 – адрес + регистр (индексная или базовая)
	Адрес – 16 бит
Безадресные команды занимают 1 байт = 8 бит
Загрузка адресного регистра: схема та же
		b = 0 – целая константа в команде (константа = адрес)
		b = 1 – регистр + константа в команде
Загрузка стека, копирование вершины стека, извлечение из стека. 
Арифметика дробная в стеке, безадресная, сохранение в стеке
Арифметика целая знаковая в стеке, безадресная, сохранение в стеке
Переходы:
	Безусловный прямой: IP = адрес (константа в команде); 
бит b работает по схеме загрузки адресного регистра: 
b = 0 – адрес (константа) в команде (константа = адрес)
		b = 1 – регистр + константа в команде
Если адрес = 0, то это косвенный переход по адресному регистру
	Условный – то же самое, проверяет флаги;
Вызов подпрограммы, адрес возврата сохраняется в адресном регистре
Возврат – безусловный переход прямой: b = 1, регистр + 0