Почему Scheme мой первый язык в университете?

80

Я слышу о C, C ++, Java каждый день, когда люди начинают говорить о информатике, но на моем первом уроке информатики нас попросили написать на Scheme (DrRacket).

Почему это?

Как это повлияет на мое будущее понимание программирования?

ОБНОВЛЕНИЕ: я закончил свой первый семестр, но не полностью закончил со Схемой. Во время моего второго семестра (который сейчас) мы начали программировать на Си. Сначала было плохо учить указатели, но теперь я чувствую себя намного лучше.

Больше сказать нечего. Я пытаюсь научить себя Java (или C ++?) Для части ООП, которую мне не хватает. Пока что мне все еще нравится функциональное программирование. Лямбда просто очаровательна. :)

Эрика Сюй
источник
148
Поздравляю, это звучит (для меня), как будто вы собираетесь в одну из немногих оставшихся школ, которая на самом деле пытается преподавать информатику. Схема обучения в качестве первого языка (ИМО) очень хорошая вещь. Нет, он не такой коммерческий, как многие другие, но это отличный язык для изучения реальной сущности информатики.
Джерри Коффин
21
C, C ++ и Java являются побочными продуктами компьютерной науки. Все корни схемы в компьютерной науке. Коммерческие языки имеют такое же отношение к информатике, как McDonalds к кухне.
JasonTrue
33
Эти парни правы; Вы путаете компьютерное программирование с информатикой - как сказал Дейкстра, это все равно, что спутать конструкцию телескопа с астрономией. Схема о лучшем языке для изучения базовых понятий в информатике . Если вы ожидаете, что получение степени информатики связано с изучением написания бизнес-приложений на Java, вы можете быть зачислены не в ту программу.
Эрик Липперт
29
По той же причине, что курсы зоологии преподают эволюционную биологию, анатомию и поведение животных, а не то, как убирать стойло слона
jk.
4
Как только вы поймете, что понимаете основной синтаксис схемы, попробуйте прочитать «Маленький интриган». Это тонкая книга, но если вы сможете в ней все понять, вы действительно хорошо разберетесь в основах функциональных языков программирования.
Эрик Липперт

Ответы:

91

Похоже, отличная школа! Лиспские диалекты намного ближе следуют математической парадигме алгоритмов. Они заставляют программистов учиться рекурсии и функциональному стилю. Это отличный опыт. Ваша школа находится в строю с MIT, который все еще использует Абельсона и Суссмана для требуемого CS 6.001.

Вы можете найти эту статью обнадеживающим и полезным в понимании проблемы.

Джонатан Хенсон
источник
6
«Сила», вероятно, не очень хорошее слово для употребления. Как насчет "поезда"?
Барри Браун
4
На самом деле, за последние пару лет в программе EECS MIT произошли радикальные изменения. Их вступительный курс теперь разделен на два курса (см. Mit.edu/6.01/mercurial/fall11/www/index.html для первой половины), и большинство языковых инструкций написано на Python.
Джонса
4
Я согласен, что Scheme - отличный язык, и это хорошая идея, чтобы выучить его. Однако, давайте посмотрим правде в глаза; почти каждая реальная работа по программированию использует императивный язык; большинство действительно серьезных задач программирования требуют C ++, и программисты C ++ обычно активно отговаривают вас от использования всех хороших математических идей для разработки программ по той или иной причине. Рекурсия не будет играть большую роль в ваших императивных программах.
Феликс Домбек
4
@FelixDombek, ты уверен? Все идеи? В самом деле? Имейте в виду, что императивный цикл - это тоже математическая идея.
SK-logic
3
@FelixDombek, я вижу только причину использовать итерацию вместо хвостовой рекурсии в C ++. Все остальные формы рекурсии обслуживаются точно так же, как и в реализациях на функциональных языках. Поэтому я не могу согласиться с вашим замечанием. Чем больше математики вы вкладываете в код C ++, тем лучше. Я сомневаюсь, что вы попытаетесь реализовать, скажем, красно-черные деревья в C ++ без рекурсии.
SK-logic
37

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

Не беспокойся; вы в конечном итоге выучите Java / C / C ++, вероятно, начиная со второго курса. Если вы начали изучать Java 6 сейчас, к тому времени, как вы закончите, Java 8 выйдет. Или это будет заменено Python. Или какой-то другой язык, который еще не был изобретен, но покорил индустрию. Лучше отложить изучение «популярных» вещей как можно дольше, чтобы они не устарели, когда вы выходите на работу.

Схема / Ракетка поможет вам сосредоточиться на важных понятиях: проект алгоритма, структуры данных и манипулирование информацией. Вы знаете, материал, который является общим для всех языков.

Барри Браун
источник
36

Поздравляю, теперь вы стали эквивалентом вегана в компьютерном мире, и через два года вы не сможете закончить любую дискуссию, не проинформировав людей о более высоких моральных принципах, на которых вы стоите. ;)

В любом случае, вы получили очень хорошую школу. Школы, которые не бьют по отрасли , хороши.
Как кто-то еще сказал, они учат вас науке, из которой вы извлекаете ремесло .

Многие плохие фермы-обезьяны учат вас ремеслу, и тогда вы можете извлечь из этого науку, но это не гарантировано. (и вы можете закончить с довольно странными заблуждениями об этом)

В любом случае, как почетный член функциональной толпы, когда вы выходите оттуда, вы всегда будете чувствовать себя неправильно понятыми и недооцененными .

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

Вы находитесь в настоящее время для высокого риска:

  • пытаясь завершить академическую карьеру ,
  • приступить к поиску доктора философии ,
  • ... Emacs .

Вам также, вероятно, понравится открытый исходный код, но вы никогда не найдете достаточно соавторов для ваших функциональных проектов.

Zjr
источник
2
Извините, чтобы прокомментировать, но почему emacs? Мне любопытно. Я в той же лодке, что и OP (начинающий студент колледжа этой осенью), и мы собираемся использовать Racket (по аналогии со Scheme).
Кевин Джонсон
2
@KevinJohnson emacs часто называют операционной системой, написанной на LISP, которая случайно помогает многим людям редактировать код . Если вы используете функциональные парадигмы и (как вас учат), например, непристойные выражения LISP-подобных синтаксисов, это, скорее всего, вырастет в вас как в ваш любимый текстовый редактор.
ZJR
1
«научить вас науке, из которой вы черпаете свое мастерство»: +1
Джорджио
23

Как это повлияет на мое будущее понимание программирования?

Это все равно, что спросить, как чтение Шекспира поможет вам написать курсовые работы. Программирование (на любом языке) - это просто средство для выражения ваших идей в исполняемой форме. Информатика предоставляет концептуальные строительные блоки, которые могут дать вам что-то интересное. Синтаксис схемы относительно прост, поэтому вы можете быстро найти интересные идеи, не сталкиваясь с множеством ошибок компилятора, стандартных библиотек и т. Д.

Обратите особое внимание в классе - в этом семестре вы узнаете много интересного.

Калеб
источник
14

Кажется, что вы очень плохо знакомы с программированием, не имея никакого опыта в этом. Итак, вот некоторые разъяснения:

Почему Scheme, а не C / C ++ / Java ...?

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

Каждый язык может реализовывать (более или менее точно) одну или несколько парадигм. Парадигма - это способ структурировать вашу логику, и парадигма, реализованная в Scheme, называется функциональным программированием (FP).

Итак, реальный вопрос, который вы задаете: почему FP?

Как вы упомянули, C, C ++ и Java (которые не реализуют FP) гораздо более популярны. Фактически, (и по разным причинам, у каждого есть свое мнение) FP не очень популярен в отрасли.

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

Это похоже на школы, которые преподают латынь для изучения английской литературы.

rahmu
источник
1
Схему не нужно использовать функционально, хотя, скорее всего, вы это сделаете, чем в C, C ++ и Java.
Рикки Кларксон
«Это похоже на школы, которые преподают латынь для изучения английской литературы». Или классы операционных систем, которые обучают Unix-подобной ОС вместо других, более распространенных ОС.
Джорджио
11

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

Когда вы поняли концепции, их легко применить к другим языкам.

perdian
источник
4
«Обычные языки, используемые в большинстве компаний, могут хорошо подходить для производства программного обеспечения, необходимого сегодня». Учитывая типичные затраты, качество и показатели успеха, это довольно оптимистичное утверждение :-)
Jörg W Mittag
Это определенно правда! Вот почему я написал «может» вместо «есть» :-)
perdian
1
«Как только вы поняли концепции, их легко применить к другим языкам». - Это утверждение слишком верно. Я подозреваю, что мне понадобится около недели, чтобы подобрать синтаксис практически на любом новом языке и быть опытным. Меня учили C / C ++ и ассемблеру в школе, но я учил себя Python на стороне и Lisp для исследовательского проекта. Без фундаментального понимания, которое я получил от Python, Lisp и Assembly, я сомневаюсь, что стану почти таким же программистом, каким я являюсь сегодня.
Уэйн Вернер
9

Если вы учитесь с DrRacket, держу пари, что вы также используете учебный план «Как разрабатывать программы».

Вот что один из (предположительно предвзятых) авторов HtDP говорит о том, как Схема обучения подготовила магистрантов в Северо-Восточном университете к программе совместного обучения («кооператив»): студенты чередуют семестры академического обучения с семестрами полного дня трудоустройство).

До моего приезда Северо-Восточный регион в течение двух десятилетий использовал стандартную учебную программу: три термина современного модного языка (Pascal, C ++, Java), используя набор чрезвычайно насыщенных графикой упражнений, переплетенных с уроками практического применения. Учебный план был широко опубликован в SIGCSE и связанных с ним сообществах, но он не работал. В разгар веб-пузыря только около трети студентов получили программирование; большинство других оказались «технарями», как они себя называли: перемещение компьютеров, запуск сценариев, настройка маршрутизаторов и сетей и т. д. И все это обучение стоило 150 000 долларов за обучение.

После года в Северо-востоке наш декан попросил меня взять первый курс. Первый случай был успешным - вопреки предсказаниям некоторых местных преподавателей. Несмотря на то, что это считалось испытанием, мы переключились на TeachScheme! постоянный учебный план; декан предложил мне разработать мостовой курс, чтобы соединить курс HtDP с остальной частью учебной программы; это начало мое сотрудничество на HtDC с Viera Proulx. Смотрите постскриптум ниже. Через пару лет я начал слышать от нашего кооперативного факультета, что доля программистских должностей возрастает. К 2007 году - в последний раз, когда я принимал участие в курсе, - мне сказали, что коэффициент программирования в первом кооперативе вырос до двух третей и выше. А пока все TeachScheme! Курсы преподаются многочисленными преподавателями с разными стилями преподавания и личностями, чем у меня. Соотношение кооперативного программирования выросло до трех четвертей и более, и все последующие преподаватели рады навыкам программирования студентов.

Изменить: для тех, кто очень заинтересован в рациональном, стоящем за учебной программой, вот основное объяснение архитектора - http://www.youtube.com/watch?v=m3be1PHW5X0

pidge
источник
6

Моя школа началась и со Схемы. Одна причина, которая была упомянута, состояла в том, что это помогло выровнять игровое поле Большинство Compi Sci первого года могут иметь некоторую или большую подверженность распространенным языкам. Менее вероятно, что кто-либо из людей имел много знаний о Схеме.

темный фейдер
источник
4
Я согласен; Я начал CS, зная Pascal, C, Basic, x86 Assembler, в то время как другие имели опыт работы на разных языках или вообще не имели опыта. Мы познакомились с ML, с которым не только никто не имел опыта, но и с такой парадигмой, которая была настолько чужой, что это было все равно что начинать заново даже для самых опытных из нас. Позже я думаю, что ML (функциональная парадигма) - самая полезная вещь, которую я изучил в CS.
KaptajnKold
6

На самом деле, поскольку Lisp («Схема диалекта») является «Великой Дамой» функциональных языков (подумайте о F #, Groovy, Clojure, Haskell и т. Д.), То этот тренинг также не оставляет вам никаких коммерческих недостатков, так как это самый горячий тема на блоке разработки прямо сейчас.

adrianmcmenamin
источник
4

Схема поможет вам освоиться и правильно подумать об использовании функциональных языков программирования. Например, Scala является гибридом Functional / OO, который довольно блестящий, хотя и немного плотный. Такие языки, хотя и отмечают будущее - надеюсь.

Языки, похожие на Лисп, имеют чистоту и простоту в дизайне, что делает их немного легче в преподавании. Хорошая выгода в том, что вам будет намного легче учиться чему-то вроде Scala.

egervari
источник
3

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

Что касается вашего вопроса, почему выбрана Схема: ответ в том, что это один из самых простых языков, и он позволяет вам делать много (особенно когда мы позже начнем играть с ленивыми списками). Кроме того :

  1. Людям, у которых нет опыта программирования, легче учиться. Там не так много технических деталей и только несколько специальных форм.
  2. Это позволяет более высокий уровень абстракции. Хороший курс может быть сосредоточен на обучении программистов думать, а не на технических деталях, которые позволяют студентам стать лучшими программистами.
  3. Списки потрясающие. Есть так много, что вы можете сделать с ними. Car и cdr оказываются мощными инструментами, и только когда вы начинаете работать с указателями, вы понимаете, что Scheme великолепно справляется со списками.
Avian78
источник