Первокурсников, начинающих изучать курс компьютерных наук в Массачусетсском технологическом институте (Massachusetts Institute of Technology, MIT), в этом учебном году ожидают большие перемены.
По мнению доцента кафедры электротехники и компьютерных наук (само название кафедры показывает, что в MIT ценят традиции) д-ра Линн Андреа Стайн, алгоритмы - хорошо, но агенты - лучше. Суть предложения госпожи Стайн ошеломляюще проста: преподаватели должны готовить студентов к тому, что ожидает их в реальной жизни.
Те изменения, которые произошли в технологии программирования за последнее десятилетие, не нашли практически никакого отражения в учебных планах американских университетов и колледжей. Изучение новых парадигм проектирования программ, ставших уже привычными для многих практиков этой крайне изменчивой по самой своей природе профессии, становится возможным уже на студенческой скамье. На помощь приходят Java и модели программ-агентов.
Путь к простым истинам сложен - чему только ни училась Линн на своем веку!.. Каллиграфии и ивриту, биологии и игре на флейте, а также, разумеется, математике и приемам оказания первой медицинской помощи. "Просто удивительно, как много узнаешь, собирая ромашки", поражается она. Насмешливая фраза из Стивена Ликока: "Рыцарь вскочил на коня и поскакал, как безумный, во всех направлениях" - про госпожу Стайн.
"Для меня исследовательская работа и преподавание неразрывны. По сути, это одно и то же, только в лаборатории ты не знаешь ответов на те вопросы, которые тебе задают".
От собирания ромашек Линн перешла к собиранию аргументов и фактов, затрагивающих святая святых - университетский курс CS101, "ведение в программирование". Выяснилось, что изучение механизмов исполнения алгоритмов по привычной уже последовательной модели "один поток команд - один поток данных" приводит к формированию стереотипа, от которого впоследствии бывает трудно избавиться. Отлаженную программу оценивают по результатам ее выполнения - а как же еще?
Шествуя по этой натоптанной дорожке, преподаватели часто предлагают студентам воспринимать появление феномена Java как "вариации на тему C++". "Если же вы хотите, чтобы уже первые курсовые стали такими маленькими шедеврами, как клиент-серверные приложения или сетевые варианты динамичных видеоигр, то от родной методики старого варианта CS101 придется отказываться",- утверждает Линн Стайн.
Итак, долой старый добрый текстик "Hello, world!"; его место занимает не менее крохотный, однако возмутительно зацикленный while (true) { echo(); }.
В реальных программах сегодня приходится иметь дело с явно или неявно взаимодействующими (конкурентными) компонентами; именно их взаимодействие составляет суть работы программы. Результатом становится не вывод на экран числа или текста, мультимедийных окошек - нужное подчеркнуть, а непрерывный процесс связи с миром, внешним по отношению к программе. Именно этот внешний мир управляет поведением программы, а не одна только воля программиста.

За последние несколько лет технология разработки программ претерпела революционные изменения (визуальное программирование, событийная логика программы, компонентная технология, использование макросредств и пр.), что должно было бы отразиться на методике обучения; но этого, к сожалению, не произошло. И схема "типичного пути начинающего программиста: Бейсик Х Паскаль Х Си++ Х программирование под Windows", при всей своей несовременности является весьма характерной.

Андрей Колесов, PCWeek/русское издание, октябрь 1997

В рамках существующей модели преподавания программирования наиболее важные понятия оказались отнесенными к категории "особо сложных". Неудивительно, что переобучение выпускников начинается почти сразу же за порогом университета. "А теперь, сынок, представь себе, что ты должен собрать хоккейную команду или попросту стянуть со стола пирожок так, чтобы мама не заметила".
Курс, предложенный Линн Стайн, рассчитан на один или два семестра и состоит из четырех разделов. В первом из них излагаются концептуальные основы технологий программирования, основанных на событийной логике и работе взаимодействующих компонентов. "Раньше в изложении техники программирования мы действовали так, как будто требовалось обучить марсианина искусству приготовления сэндвичей; теперь же начинающему программисту предлагается роль режиссера или предпринимателя. Результат твоей работы - не сэндвич в одном экземпляре, а работоспособный бизнес или пьеса, идущая без накладок".
Во втором разделе курса речь идет об основных конструкциях программы в терминах синтаксиса и семантики этих конструкций. Однако уже в первых примерах разбираются те программы, при выполнении которых приходится учитывать поведение "соседних" программ-компонентов и события во внешнем мире. По завершении этой части курса студенты осваивают программирование в терминах "взаимодействующих сущностей", приходя к выводу о том, что автономные, stand-alone программы - существа, в природе встречающиеся все реже.
Значительная часть курса посвящена приемам и альтернативам проектирования программ в рамках модели "сообществ программных компонентов". Изучаются такие вопросы, как наследование, обработка исключительных ситуаций и диспетчеризация. Рассматривается такая абстракция понятия процедуры, которая приводит студентов к представлению о технике событийного программирования. Источники сигналов о событиях могут находиться либо на аппаратном уровне, либо в "соседних" программных компонентах, либо во внешнем мире.
Завершающий раздел курса посвящен проблеме "связывания сущностей". Здесь среда Java AWT представлена и как инструмент, и как объект изучения - система, управляемая событиями.
Тема разработки программных интерфейсов является в этом курсе сквозной. Речь идет не только о том, что должны содержать спецификации интерфейса, но и о том, чего они содержать не должны.
Наконец, одной из доминант курса становится проблема обеспечения надежности и жизнеспособности (liveness) программ.
В итоге, по мнению Линн Стайн, студент получает в свое распоряжение компактный "Cловарь основных концепций", что позволяет ему научиться задавать правильные вопросы по мере того, как продолжается изучение им системных технологий.
"Абстракции последовательного выполнения программ по Тьюрингу и фон-Нейману были крайне важны в историческом плане и позволили многое сделать. Но дело в том, что алгоритмы часто оказывались не дискретными, не последовательными по своей структуре; стоит проследить за эволюцией систем с разделением времени", - подчеркивает Линн. "Когда я начала работать над этим курсом, технология Java отсутствовала. Мои интересы в то время были связаны с роботами. Расказывая студентам о роботах, я стала вводить в курс представления о жизненном цикле программ, разработке встраиваемых приложений и интерактивных систем. Появление Java и WWW стало для меня свидетельством того, что событийное программирование начинает доминировать в реальном мире".