Pull to refresh

Comments 14

Решить весь SICP и систематизировать свой опыт — огромный труд, поклон вам!


Как по-вашему, нужна ли первокурсникам реально часть относительно интерпретации?
Когда начинается написание интерпретатора — понятно, зачем брать один из Лиспов — выражения распарсить легко. То, что идёт до этого — как мне показалось, достаточно неплохо переносится практически на любой язык с динамической типизацией (кроме потоков языка для изображений, но они, как я понимаю, не входят даже в стандарт Scheme) и уже даёт неплохой фундамент для типичных студенческих задач. Написать интерпретатор на основе изученного — это красиво, конечно (eval-apply как электричество и магнетизм в уравнениях Максвелла), но не такое уж CS 101.


По итогу решения всех задач, использование списков в тех местах, где можно было бы сделать структуры с именованными полями, вам видится как полезный дидактический ход или введение затруднений на пустом месте? С одной стороны, понятно, что авторы хотят донести идею, что любые данные в конечном счёте можно построить на одной примитивной структуре (пусть в реальности это байт, а не список). С другой стороны, всякие cadadr для доступа к частям структуры не столь самоочевидны, как они подаются.

>Как по-вашему, нужна ли первокурсникам реально часть относительно интерпретации?

Это трудный вопрос… Джейми Завински как-то сказал, что любая, достаточно долго разрабатываемая программа, начинает включать в себя почтовый клиент. В наши дни, можно посмотреть на самые используемые программы вокруг, Firefox, Chrome, Excel, GDB, Blender, Gimp — они включают в себя интерпретаторы, можно сказать, начинают быть построенными вокруг интерпретатора. В этом смысле, пожалуй, да, я считаю, что без курса по интерпретации и курса по разбору грамматик (книга дракона), курс по программированию таковым не является.

>но не такое уж CS 101.

Я видел 101-курсы своими глазами, и у меня о них крайне негативное впечатление сложилось в целом. Это opinionated, конечно, позиция, у меня нет социологических данных чтобы её подтвердить, но вообще сама идея разделения высшего образования на бакалавриат (состоящий из 101-курсов чуть более, чем полностью), и магистратуру, где в студента пытаются за один год впихнуть всю бывшую программу Мехмата — это самая идиотская идея в жизни.

Достаточно логично поделить курс на «умею применять инструменты» и «умею делать инструменты», да, вполне. Но «умею применять инструменты» — это не высшее образование.

С другой стороны, вопрос может ставиться как «а как делать программирование для непрограммистов?». Не знаю. Нет у меня ответа на этот вопрос. Возможно, стоило бы вместо модуля по «написанию интерпретаторов» давать гораздо более короткий модуль «применение ffi какого-нибудь другого языка» или «написание ffi для собственной программы». Главное донести до студента идею о том, что программы могут и должны общаться друг с другом.

> использование списков в тех местах, где можно было бы сделать структуры с именованными полями, вам видится как полезный дидактический ход или введение затруднений на пустом месте?

К сожалению, в SICP не рассказывается про disjointness of types как про фундаментальную концепцию. В новых стандартах Схемы про это пишут, но не в r4rs. Без возможности создавать собственные типы (пускай даже это всего лишь маркер), непрозрачные структуры не реализовать, а значит ошибка (cond ((list? a) (other-fun a)) ((my-type? a) (my-fun a)) ) будет трудноуловима. Конечно, на уровне интерпретатора это можно реализовать, но это уже поздние главы. В общем, я легко привык жить с «кустарными объектами». Хотя, быть может, после прочтения The Art of Metaobject Protocol моё мнение изменится.

>всякие cadadr для доступа к частям структуры не столь самоочевидны, как они подаются.

Я, в общем, легко это понял. Плюс, это отдельно намекает на то, что привычная нам RAM вообще-то не очень R. Там внутри есть логарифм, хотя константа и очень маленькая. Так что педагогически мне скорее нравятся кададры.

Очень круто вышло, и спасибо, что так структурированно! Одного момента я не понял — а зачем вы такое внимание уделяли тому, чтобы выбирать инструменты, которые были во времена преподавания sicp? Оставляет ощущение какого-то стимпанка.

А что и чем бы вы заменили?

В целом, Fortran и правда не самый очевидный выбор, но язык живёт и развивается. Вышел, скажем, F2018, не так давно. В «жизненной ситуации» студенту пришлось бы учить новый язык для последних двух задач, и на том уровне, который требуется — указатели и ручная работа с памятью, написание своего сборщика мусора, не вижу чем какой-нибудь другой язык как-то фундаментально отличался бы.

Думаю, что Си. Насчёт фортрана, погуглил, признаю ошибку. Думал, что последняя версия была ещё в девяностых.

Си я уже знал к моменту начала проекта, то есть это было бы некорректно. Мне нужен был какой-нибудь язык, который нужно учить "с нуля", как первокурснику, и при этом умеющий вручную выделять и освобождать память.


То есть, на выбор из очевидного Fortran, Ada, Delphi, может быть, Rust или Go, точно не знаю, nasm/gas.


Плюс, интерьеров интерпретаторов Схемы на Си вагон.

Интересно, актуально ли бы было бы такое же исследование на тему прохождения «Искусства программирования» от Д. Кнута. Там наверное еще больше бы времени заняло.
Мне кажется, что актуальны были бы любые данные на эту тему вообще, тем более, что поскольку сейчас не так мало студентов учится из дома, исследование должно получаться чище.

Тут вопрос, наверное, в том, что прорешать всё «искусство программирования» целиком, наверное, менее осмысленно, чем SICP, в силу того, что там намного более разнообразные темы для изучения. Это, в каком-то смысле, больше справочник, чем учебник.

А вы хотите заняться? Если осилите хотя бы один том, то статья на конференцию у вас уже точно получится (я, наверное, по старой памяти, могу вас порекомендовать на Конференцию МФТИ, хотя, наверное, есть и по-приличнее места). Напишите мне, если что-нибудь путное выйдет, я тогда соберусь, сделаю сайт более цивильный, чем мой гитлаб кустарный, и можно будет сказать, что «исследование процесса обучения» — уже целый «проект».

Я-то хочу заняться, но объем работы конечно пугает :)
Наверное его (Д. Кнута) труды нужно рассматривать с позиций: «Я математик — хочу изучить программирование» и «Я программист — хочу понять теоретическую базу информатики». И разные траектории соответственно в прохождении.

P.S. А что у вас в планах следующее, если не секрет?

Любой университетский предмет — это где-то 300 часов. В этом смысле, заниматься надо не тем, что пугает или не пугает, а тем, что хочется. Объём там будет такой же.


Пока не решил, что будет ещё в принципе. Есть штук 20 непрочитанных книг, которые хочется осилить, но их, кажется, бессмысленно измерять. Из программирования, наверное, попробую Книгу Дракона, и, может, соберусь написать более качественный парсер для Схемы для Емакса. Но когда до этого руки дойдут — понятия не имею.


Сейчас Виттгенштейна читаю "с ручкой и бумажкой". На гитлабе есть заметка, но там процентов 30 сделано, и это не очень про программирование.

С нетерпением буду ждать! Вообще-то, было бы чудесно, если б все задачники и учебники были снабжены таким анализом. Как-то начинаешь верить в себя и в то, что реалистично можно проработать.

Ну, пока мне никто не задонатил на поклонение продолжение работы :).

Буквально пару дней назад (9 марта) в MIT Press вышла новая книга с участием Сассмана (соавтора SiCP) — "Software Design for Flexibility: How to Avoid Programming Yourself into a Corner."

Обложка
image

Оглавление
Foreword
Preface
Acknowledgments
1: Flexibility in Nature and in Design
2: Domain-Specific Languages
3: Variations on an Arithmetic Theme
4: Pattern Matching
5: Evaluation
6: Layering
7: Propagation
8: Epilogue
A Appendix: Supporting Software
B Appendix: Scheme
References
Index
List of Exercises

Как утверждается во введении, книга может рассматриваться как «продвинутое» продолжение курса SiCP.

Книга посвящена тому, как при разработке сложных систем оставлять их расширяемыми, не ограничивая себя ранее принятыми решениями по строению кода, выбранными формами структур данных и пр.

Линк на книгу:
на MIT Press
на Амазоне
Sign up to leave a comment.

Articles