Почему в MIT больше не изучают SICP
На днях широкое внимание привлекло состоявшееся в начале года на митапе NYC Lisp выступление Джеральда Джей Сассмана, — одного из авторов великого и могучего SICP, а также крестного отца Scheme. Всему виной — ответ на вопрос, почему в MIT прекратили преподавать ставший легендарным курс 6.001, построенный на основе книги Сассмана и Абельсона «Структура и интерпретация компьютерных программ» (вопрос задан на 59 минуте).
Сассман назвал две причины; впрочем, сразу замечу, что в первой из них нет ничего особенного. К 1997 году Абельсон и Сассман уже устали рассказывать практически одно и то же с 80-ых, поэтому решили оставить преподавание и предложили главе кафедры самостоятельно решить, как поступить с самим курсом. Здесь удивляться действительно нечему — что угодно может осточертерть, если заниматься им достаточно долго.
Впрочем, вторая причина гораздо серьезнее. По мнению Сассмана, они с Абельсоном осознали, что учебный план SICP больше не в силах подготовить инженеров к тому, что представляет собой «инжиниринг» сегодня. В 80-ых и 90-ых инженеры строили сложные системы, комбинируя простые и хорошо изученные «части». Целью SICP было предоставить язык абстракций для рассуждений о таких системах.
Сегодня дела обстоят не так. Сейчас инженеры обычно пишут код для сложного аппаратного обеспечения, которое они не до конца понимают (причем часто это происходит по причине коммерческой тайны, а не в силу лени или недостатка времени — взять ту же Apple и ее технологии). Это же утверждение справедливо и для программного обеспечения, поскольку программные окружения состоят из гигантских библиотек с широчайшей функциональностью. Согласно Сассману, сегодня его студенты большую часть своего времени тратят на чтение мануалов к этим библиотекам, чтобы разобраться в том, как связать их вместе с простой целью — чтобы всё заработало и сделало то, что им нужно.
Со слов Сассмана, «Программирование сегодня больше напоминает науку: вы берете часть библиотеки и «тыкаете» в нее — смотрите на то, что она делает. Затем вы спрашиваете себя, «Могу ли я настроить это так, чтобы оно делало то, что мне нужно?». Подход «анализ через синтез», используемый в SICP, когда вы строите большую систему из простых, маленьких частей, стал неактуальным. Сегодня мы программируем «методом тыка».
В конце концов, в качестве альтернативы для Lisp в MIT был выбран Python. В пользу языка преподавателей склонил тот факт, что для Python доступно значительное количество библиотек, которые позволяют использовать его для решения упражнений в самых разнообразных типах проектов (например, для написания ПО для управлениям роботами).
Впрочем, сам Сассман пошутил, что использование Python было решением в духе «позднего связывания» («late binding») — поскольку план обучения SICP был более «последовательным» по сравнению с тем, что заняло его место. Он признался, что вместе с коллегами по прежнему не представляет себе, каким должен быть оптимальный план обучения.
Мнения насчет современного образования в целом и того, чему же все-таки должны обучаться будущие software engineer, расходятся радикально — поэтому предложить однозначный вывод из нововведения невозможно. Согласно одному из них, фундаментальной целью обучения CS является понимание того, как работают компьютеры, а не изучение конкретных языков программирования, и уж подавно — библиотек. С мнением соавтора курса Абельсона насчет конца эры SICP в MIT можно познакомиться по ссылке.
Современная экономика остро нуждается в присутствии на рынке большого количества прикладных программистов, и университеты выполняют свою обязанность в подготовке студентов к будущему. Естественно, выучить всё, особенно на старте карьеры, представляется невозможным; и в то же время, серьезное изучение CS позволяет уменьшить количество плохого кода и страданий коллег-разработчиков.
Одна из баек про MIT всегда говорила о том, что «изучение SICP и Lisp — это тот момент, когда первокурсники начинают оставлять большую часть мира позади себя по части возможности решения проблем (имеется в виду problem solving) и умению делать свою работу»; более того — многие выпускники MIT в дальнейшем как раз и занимаются тем, что пишут библиотеки сами, а не используют чьи-то еще. Думается, что невзирая на жестокие реалии бизнеса, среди нас найдутся те, кому (втайне) гораздо больше удовольствия приносит процесс обучения программированию «с нуля», эффективное использование ресурсов и построение своих велосипедов, чем ежедневные разборки с чужими API и связывание уже готовых open source компонентов в стремлении сделать то, что требуется — то самое «get work done», о котором вел речь Сассман (хотя новый подход в этом отношении действительно ближе к производственным задачам). Однако, времена, когда студентам в ходе обучения приходилось заниматься созданием компиляторов/интерпретаторов, могут отойти в прошлое быстрее, чем нам кажется.
Разумеется, все это — не повод отказываться от знакомства с SICP. По сложившейся традиции, ссылки на саму книгу и лекции прилагаются.