Критерии выбора языка для первого курса программирования

35

Как преподаватель CS на университетском уровне, вопрос о том, какой язык программирования преподавать на первом курсе программирования, часто поднимается для обсуждения. Есть тысячи языков на выбор и множество религиозных лихорадок (или лихорадок), поддерживающих один языковой лагерь над другим. Все это субъективное смещение, окружающее каждый язык программирования, очень затрудняет выбор педагогом.

Мой вопрос:

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

Примечание : я не хочу видеть список языков программирования и почему они являются лучшими для использования. Вопрос не в лучшем языке, а в критериях выбора языка . Ответы могут, однако, использовать языки программирования для иллюстрации конкретных моментов.


Этот вопрос был вдохновлен другим вопросом, который был сочтен не по теме: https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language .

Дэйв Кларк
источник
1
Открытая мета-ветка о том, является ли этот вопрос актуальным или не по теме: meta.cs.stackexchange.com/questions/362/…
Дейв Кларк
7
<Захватывает попкорн> Перефразируя Отто Нойгебауэра : ни один известный человеку язык программирования не способен испортить всех.
Джефф
3
@Raphael: Я думаю, что ответ Дейкстры, вероятно, будет следующим: « Каждый первый известный человеку язык программирования способен разрушить всех».
Джефф
2
@ edA-qamort-ora-y, да, они должны быть подвержены нескольким парадигмам программирования. Нет, этого нельзя сделать на первом курсе.
vonbrand
3
У нас было SMLпросто потому, что маловероятно, что любой студент знает этот язык заранее . Это уравновешивает каждого студента более или менее на том же уровне, чтобы начать курс.
Маркус Малкуш

Ответы:

14

Я добавлю свои два цента, хотя считаю, что эта тема - бездонная пропасть. Не поймите меня неправильно, я думаю, что это увлекательный вопрос, но, вероятно, не тот, который мы решим здесь, чтобы удовлетворить всех.

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

Мой собственный опыт основан на обучении нескольких поколений студентов первого и второго курса языку программирования Oberon . Люди, которые знают этот язык, признают его влияние в моих мнениях. Обратите внимание, что этот язык использовался для обучения «Алгоритмы и структуры данных». В то время (тогда) функциональное программирование и объектно-ориентированное проектирование преподавались на отдельных курсах, начиная со второго курса.

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

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

  • Простота : студенты обычно обучаются программированию, алгоритмам и структурам данных, а не особенностям и тонкостям какого-либо конкретного языка программирования. Вирт использовал цитату Эйнштейна «Сделай это как можно проще, но не проще» в качестве руководящего принципа при разработке Оберона, и есть несколько других языков, которые делают это так же хорошо. Выбранный вами язык программирования должен быть в состоянии реализовать все концепции, необходимые в вашей лекции, но он должен делать это с наименьшим возможным набором функций / деталей. Язык программирования, как правило, просто инструмент, а не цель.

  • Однозначность : близкий родственник простоты, для каждой концепции должна быть одна конструкция с минимальным перекрытием. Думайте об этом как о существующем только одном «правильном» способе реализации каждой концепции. Три разных типа циклов, которые семантически все делают одно и то же? Или пятнадцать различных способов увеличить переменную? Не хорошо. Это также делает исправление домашней работы или просто понимание кода ваших учеников намного проще. Ваши ассистенты по достоинству оценят это.

  • Переносимость : студенты будут ходить на занятия с компьютерами Linux, Windows и OSX, и среда программирования должна быть максимально похожа (идентична) для всех трех. Результаты любой программы также должны быть идентичными. Это еще один момент, который оценят помощники преподавателя, отвечающие за оценку домашней работы и решение вопросов / проблем.

  • Промышленные предпочтения : Серьезно, мы должны начать беспокоиться об этом только в том случае, если сама «Промышленность» решит, какой язык программирования ей больше нравится. Со времени изобретения компьютеров эта цель постоянно менялась. На данный момент, если ваши ученики действительно научатся программировать, то это не будет зависеть от языка. Однако в некоторых областях промышленности удается договориться о стандарте, например, VHDL для проектирования схем или SQL для запросов к базе данных, так что это все еще верный момент.

Опять же, то, как язык подходит этому списку, сильно зависит от того, чему вы пытаетесь научить!

Pedro
источник
4
На самом деле, в VHDL и Verilog существует принципиальное разделение схем.
Авакар
@avakar: Ой, дерьмо. Я исправлю это в своем ответе, спасибо за указание на это!
Педро
Yikes, прочитал это и подумал, что это один из моих преподавателей. +1 для Оберона, при условии, что автоматически включается переключатель использования строчных ключевых слов; так больно писать WHILE expr DO stmts ENDи т. д.
Каллум Роджерс
3
+1 за "каковы цели вашего курса?" и дополнительное примечание, одна из наиболее распространенных целей, даже если она не прописана, - дать основы для других вещей (курсов и стажировок), для которых программирование является обязательным условием.
AProgrammer
Важным моментом (по крайней мере, сегодня) является то, что он позволяет студентам создавать визуально привлекательные программы быстро и безболезненно. Они подвержены такому количеству графических приложений и игр, что, естественно, думают, что именно так компьютеры должны взаимодействовать с людьми.
vonbrand
13
  • Развитие алгоритмического мышления для решения проблем в качестве основной цели. Одна плохая вещь в использовании объектно-ориентированной парадигмы на первом курсе заключается в том, что привлечение новых учащихся к таким вещам, как наследование, полиморфизм и т. Д., Отвлекает их от вышеупомянутой главной цели. Фактически, введение каких-либо дополнительных соображений помимо этой основной цели, таких как разработка программного обеспечения, переносимость, полезность отрасли и т. Д., По указанной причине является контрпродуктивным.

  • Не объектно-ориентированный язык: в настоящее время большинство университетов начинают преподавать программирование прямо с объектно-ориентированного языка. Я думаю, что это ошибка. В мире есть вещи, которые можно по-настоящему понять только в противоположность противоположности. Не подвергаясь процедурной парадигме программирования (данные и функции - это два отдельных аспекта программы), многие могут упустить основную идею объектной ориентации (данные и поведение рассматриваются как неразрывно связанные друг с другом). И потому, что объектно-ориентированное программирование очень важно, упустить его основную идею не так уж и мало. Кроме того, поскольку, скорее всего, на более старших курсах студенты CS будут программировать в основном в ОО, они также должны быть ознакомлены с процедурной стороной.

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

Назар Мерза
источник
Вы можете довольно легко начать с подмножества, скажем, Java, чтобы сначала показать процедурный стиль. Затем вы открываете ящик Пандоры и показываете, как это выглядит с ООП.
Рафаэль
3
@Raphael: Невозможно избежать public static void main()в Java, которая должна быть в контексте некоторого класса. Это делает Java менее идеальным в качестве первого языка, хотя, конечно, препятствие не слишком велико.
Дейв Кларк
Хорошая IDE может отложить public static void main()на очень долгое время. BlueJ - хороший пример среды IDE, которая позволяет студентам писать программы без единого mainместа в нем.
Барри Браун
2
Проблема с ООП состоит в том, что для ряда игрушечных проблем, охватываемых в течение первого года программирования, он просто мешает, без какого-либо явного преимущества. ООП становится важным (и ценится), когда ваши программы имеют тысячу строк или около того. «Java без ООП» ужасна, множество совершенно непрозрачных вещей, которые «должны быть написаны таким образом», идут против людей, обучающихся , а не попугаев.
vonbrand
11

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

Я не согласен с мнением @ Kaveh о том, что актуальность отрасли важна; это может быть бонусом, но здесь это не так важно. Имея прочную основу принципов CS, изучение «промышленного» языка на последующих курсах будет относительно простым.

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

evilcandybag
источник
1
Актуальность отрасли можно считать вторичной, но я не думаю, что это второстепенная проблема. Так как это введение в курс программирования, я не понимаю, почему кто-то хотел бы преподавать в нем все концепции, часто есть второй курс по программированию и другой курс по теме языка программирования, где обсуждаются различные языки, и многие другие Курсы сосредоточены на конкретных областях применения, например, программирование для веб-сайтов и т. д.
Kaveh
@Kaveh: Для меня это звучит как учебный план технического университета.
Рафаэль
6
«Важно как можно скорее научить своих учеников другому, радикально другому языку». -- абсолютно правильно. Мы установили людей, которые думают, что они могут программировать прямо, сначала введя функциональное программирование: почти все новички в этой парадигме, и чем больше C (++) вы испытали, тем труднее, по-видимому, это.
Рафаэль
3
@Kaveh: Языки, предназначенные для достижения цели в реальном мире, не обязательно являются оптимальными для преподавания концепций или развития навыков. Цели очень разные.
Джефф
1
@Kaveh: я никогда не писал, что знание языков, используемых в промышленности, неважно. Я имею в виду, что при наличии твердого первого языка программирования у последующих курсов не будет проблем с обучением студентов тому, что они будут делать после окончания учебы. Будучи частью преподавания нескольких вводных курсов самостоятельно (в качестве ТП), я бы сказал, что приобретенные вами навыки не имеют ничего общего с теми, которые необходимы в промышленности (для этого слишком мало времени). Если это так, то я считаю, что лучше дать им основательные концепции, чтобы они могли стать лучшими программистами, а не только $ LANGUAGE-программистами.
evilcandybag
8

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

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

... но это только здравый смысл.

jmad
источник
1
С монадами, как в Haskell, можно утверждать, что этот критерий больше не применим к чисто функциональным языкам.
Дейв Кларк
@DaveClarke: монады - очень хороший способ делать нефункциональные вещи. Но не слишком ли рискованно сначала изучать этот материал с помощью монады, а не напрямую? (Может быть, это не так, я не знаю!)
Джмад
2
@jdam: Вы, наверное, правы. Проблема не в самих монадах, а в общности и сложности представления хороших сообщений об ошибках программисту. Вариант Haskell Helium решает эти проблемы и успешно используется со студентами первого курса.
Дейв Кларк
@DaveClarke: вау, я не слышал об этом. Это очень круто! К сожалению, хотя это очень полезно для изучения Haskell, это не решает проблему, которая может не помочь в изучении других языков.
Джмад
4
@ Бен: я чувствую, что ручное управление памятью - это то, что в настоящее время является специфическим для некоторых языков (и которое вы изучаете в этих конкретных случаях) больше, чем фундаментальная вещь программирования. Если вы не согласны с этим, то я думаю, что это указывает на C (или C ++).
Джмад
8

При выборе первого языка программирования, есть много вопросов, которые необходимо учитывать. Многие из них были рассмотрены в ответах выше. Я включил еще 3, так как они были частью моего ответа на закрытый вопрос ( https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language ), который первоначально вдохновил этот вопрос , Я скопировал свой ответ здесь (и изменил его) на основе текущей политики удаления закрытых вопросов.

Вот 3 момента, которые нужно рассмотреть, используя несколько языков программирования в качестве примеров.

Программирование в большом против программирования в маленьком

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

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

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

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

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

С другой стороны, такой язык, как Python, Ruby, Scheme или Haskell, значительно облегчает непосредственное написание программы.

Высокий уровень против низкого уровня

Такие языки, как C ++ и C, являются языком более низкого уровня. Они позволяют программисту напрямую манипулировать ссылками в памяти. Хотя это позволяет писать очень эффективный код, детали первого уровня могут быть трудными для первого программиста в изучении языка. Некоторые утверждают, что эти детали низкого уровня мешают написанию логики для решения проблемы.

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

Статически Типизированный против Динамически Типизированный

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

Python, Ruby и Scheme имеют динамическую типизацию. Это означает, что ошибки обнаруживаются во время работы программы. Можно утверждать, что уже слишком поздно обнаруживать ошибки (но можно также использовать тестирование, чтобы избежать таких ошибок). Опять же, избегая религиозного аргумента, преимущество типа ошибок, с которыми можно столкнуться при написании простых программ на динамически типизированном языке программирования, такого рода, что этот объект не знает, как выполнить эту операцию . В контексте небольшой программы эти ошибки легко понять и отследить.

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

другие

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

Дэйв Кларк
источник
От всей души согласен.
vonbrand
1
У меня также есть свои предпочтения в отношении конкуренции «статические и динамические типы». Тем не менее, в общей программе CS, пока оба преподаются как-то, я считаю, что порядок не имеет большого значения. Однако, если представлена ​​только одна сторона медали, это большая проблема для меня.
Чи
8

В качестве вступительного замечания рассмотрим возможность представления более чем одного языка (в одном курсе). В моем первом семестре мы показали SML и Java. Контраст имел свое собственное и важное сообщение: выбрать правильный инструмент для работы.

Но теперь по критериям, в произвольном порядке.

Трудность в изучении - это субъективный вопрос, но важный: вы не хотите, чтобы ваш ученик тратил время на изучение языка, а на то, чтобы с ним что- то делать . Можно утверждать, что динамические языки, такие как Ruby, могут выиграть на этом фронте: вы можете кормить их чем угодно, и в Интернете есть отличные «фиктивные» учебные пособия. Если я правильно помню, есть также исследования, которые показывают, что студенты, которые не программировали раньше, достигают лучших результатов с функциональными языками, чем с другими.

Богатство : язык (и) должен быть достаточно богат для всех понятий, которым вы хотите научить. Например, если вы хотите обсудить функции высшего порядка, вам нужен язык, где функции являются значениями, например, функциональные языки или Scala.

Масштабируемость . Скорее всего, ваши студенты не будут изучать больше языков самостоятельно, чем те, которые вы им показываете. Таким образом, вы хотите, чтобы выбранные вами языки расширялись в процессе обучения: им нужно написать ваши домашние упражнения сейчас, но они могут также атаковать проект среднего размера позже. Ява и языки с похожей экосферой - хороший выбор здесь.

Поддержка инструмента : это связано с масштабируемостью. Если вы ожидаете / хотите, чтобы ваши студенты работали с языком, то должны существовать хорошие IDE, менеджеры по сборке и библиотеки. Интерактивные оболочки (Ruby, Scala) также хороши, особенно для начинающих. Инструменты должны работать на всех основных платформах.

Документация : Вы, вероятно, не хотите на самом деле учить язык, но попросите студентов учить себя под вашим (абстрактным) руководством. Поэтому хорошая документация важна. Можно утверждать, что чем популярнее и устоявшийся язык, тем лучше документация. Например, документация Scala довольно скудная (но улучшается). Такие инструменты, как Hoogle, являются плюсом.

Доступность : На самом деле есть люди, которые преподают с использованием Matlab или Visual C ++. Учтите, что не у всех может быть лицензия или машина, которая может запускать необходимые программы. Возможно, вам следует отдать предпочтение бесплатным языкам, которые работают на различных платформах.

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

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

Рафаэль
источник
For example, if you want to discuss higher-order functions, you need a language where functions are values, such as functional languages or Scala. ... или C или Pascal, у которых оба были функциональные указатели почти навсегда. Практически единственным (основным) языком, который этот критерий фактически закрывает, является Java.
Мейсон Уилер
Попытка научить новичков путанице различных синтаксисов и основополагающих концепций - это просто скручивание мозгов.
vonbrand
6

Увлекательный вопрос; Мне нравится ваш акцент на объективных критериях. Мы хотим, чтобы первокурсники узнали:

концепции программирования : первый язык программирования должен поддерживать: вызовы функций, итерацию, рекурсию

фундаментальные идеи : первый язык программирования должен поддерживать массивы (для первых шагов в небольшом введении в то, как на самом деле работает память и как работают указатели)

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

тот факт, что предварительно написанные библиотеки существуют для таких вещей, как sort (), и как их использовать, то есть тот факт, что нет необходимости писать все с нуля.

Другие критерии для первого языка :

интерпретировать (быстрая обратная связь помогает процессу обучения).

интерактивная среда, которая ускоряет обучение, тестирование и отладку.

высококачественный исходный код доступен для чтения студентами на этом языке

«легко читаемый», «синтаксис, приближающийся к естественному языку» (чтобы было проще читать и оценивать SourceCode)

портативный (работает на Mac OS, Windows, Unix). По крайней мере, одна свободная программная реализация языка.

быстро обучать, «несколько ошибок» - например, «может быть, быстрее научить сначала начинающих Python, а затем Java, а не Java как первый OOPL». - «Сравнение объектно-ориентированных языков программирования» и TelescopeRule

Матиас Феллайзен разработал язык программирования с сообщениями об ошибках, предназначенными для начинающей аудитории. Он подчеркивает, что выбор конкретного языка не так важен, как обучение хорошей методологии проектирования. Фактически, он видит первый курс CS как класс гуманитарных наук, обучающий критическому мышлению, решению проблем и вниманию к деталям.

критерии для второго языка программирования

Вещи, которые мы хотим, чтобы студенты изучали, но, возможно, это может подождать второго языка программирования:

«соответствующий» язык, который не слишком эзотерический; что-то "популярное в отрасли"

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

вещи более высокого уровня: как выбрать правильный инструмент для работы , как использовать компилятор, структуры, объектно-ориентированное программирование, функциональное программирование, логическое программирование, проектирование компилятора, составление и манипулирование функциями (в смысле Lisp / ML), параллельное и распределенное программирование,

вещи низкого уровня: арифметика указателей, компьютерная архитектура. управление памятью, стековые фреймы, программирование сборки, архитектура машины, драйверы устройств и дизайн операционной системы (так что машина не будет «казаться пугающим черным ящиком, в который они не смогут проникнуть»)

РЕДАКТИРОВАТЬ: меня разочаровывает, что публикация резюме того, что я написал, в сотрудничестве со многими другими, "не может быть юридическим постом".

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

Этот ответ является кратким изложением «Первого языка первокурсника» (Anon 2011) в репозитории шаблонов в Портленде.

(Anon 2011) Многие анонимные и другие авторы. «Первый язык первокурсников». Портлендский репозиторий. 27 сентября 2011 г. http://c2.com/cgi/wiki?FreshmansFirstLanguage .

Дэвид Кэри
источник
Вы проверили у авторов оригинала, разрешено ли вам воспроизводить их содержание? Источником является корпоративный веб-сайт, и я не смог найти декларацию о том, что контент был бесплатным, поэтому это не может быть легальным постом!
Рафаэль
1
@Raphael Источник - вики (поэтому потенциально у него много разных авторов). Если автор (любой соавтор) этого материала не хочет, чтобы он был здесь включен, он должен отправить уведомление об удалении DMCA на [контактный адрес, указанный внизу этой страницы] (mailto: team+cs@stackexchange.com) , Кроме того, информация не защищена авторским правом, только в том виде, в котором она выражена. Немного рефакторинга и RemovingWordsRunTogetherWikiWikiStyle улучшит этот ответ и устранит любой риск нарушения авторских прав.
Жиль "ТАК - перестань быть злым"
1
+ Хороший ответ, но мне нужно выбрать один - профилировщики. За ними нет теории - просто «общеизвестно». Среди академиков обычно не понимают, что есть много проблем, которые они не находят, и другая техника делает. Проверьте эту ссылку.
Майк Данлавей
5

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

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

Третий критерий - это курсы, которые студенты будут изучать в последующие годы. Курсы, в частности обязательные курсы, предназначены не для самих себя, а в координации с другими курсами.

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

Я думаю, что многие университеты перенесли свое основное введение в курс программирования с Java / C ++ / C на Python, хотя они могут время от времени предоставлять введение в программирование на других языках (часто для не-компьютерных специальностей, например, C для электротехнических специальностей) хотя они могут проявлять гибкость, если инструктор хочет время от времени экспериментировать с преподаванием другого языка.

Кава
источник
3
Я бы не оценил полезность в индустрии ужасно высоко во вводном курсе программирования. Успешному программисту в дикой природе, вероятно, придется выучить несколько языков в течение своей карьеры, некоторые из них «на работе», поэтому умение подбирать и изучать новые языки является ключевым навыком, который необходимо изучать . Следовательно, я не ожидал бы, что первый язык, который будет преподаваться в университете, обязательно будет самым сильным, когда они закончат обучение.
Бен
1
@Ben: Полезность в отрасли особенно важна, если студенты не собираются изучать CS. Откуда я приехал, многие люди работают над биологией или другими науками, и, учитывая, что у них нет времени на изучение многих языков, изучение чего-то общего в их экосистеме, такого как Python, вероятно, будет более полезным, чем ML, Java или C.
hugomg
1
Говоря как кто-то из отрасли (одной конкретной отрасли, не обязательно представительной), я не думаю, что актуальность отрасли является фактором, когда речь идет о будущих программистах первого уровня. Использование нескольких парадигм делает программистов лучше, даже если в моей области (встроенное программирование) мы в основном используем C. Особенности языка можно выучить в руководстве, общие понятия лучше изучать в школе. Для случайных программистов (например, ученых) приоритеты разные - но слишком большое внимание к Фортрану может заставить людей игнорировать Numpy, когда им следует пользоваться.
Жиль "ТАК - перестань быть злым"
5

Итак, я немедленно откажусь от своей реакции коленного рефлекса, которая заключается в том, что каждый должен изучать программирование через SICP, потому что Lisp - это то, что нужно.

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

Хотя некоторые из этих постов предлагают отличные критерии, я хотел бы использовать определенный язык, чтобы проиллюстрировать, как выглядит «соответствие критериям».

Некоторые из этих проблем были рассмотрены (гораздо лучше, чем я мог попытаться) в блоге Джоэла Спольски « Опасности JavaSchools» . Выбор языков, таких как Java или Python, закрывает две более сложные (и самые важные) концепции в CS; а именно, указатели и рекурсия.

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

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

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

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

Я обосновываю это утверждение на мгновение, но сначала я хочу прокомментировать одну тенденцию, которая мешает мне в интро курсах CS. Я работаю в университете, который, как и многие школы, недавно перешел на использование Python для своих вступительных курсов. Я твердо верю, что Python - это новая ОСНОВНАЯ, и тенденция языка состоит в том, чтобы выбирать дружелюбие новичков вместо власти и выразительности, как я недавно доказывал в другом месте . Это плохая услуга, и нам нужно думать о программистах, которыми они станут, а не о новичках, которыми они являются в данный момент.

Во всяком случае, оправдывая Ruby как вводный язык ...

  • Ruby, хотя и не оптимизирован с помощью tail-call, делает рекурсию довольно хорошо. Вот и все.
  • Рубин - это мультипарадигма. Хотя это чисто объектно-ориентированный язык, он также включает функциональное программирование, а также имеет некоторые обязательные обучающие колеса, основанные на C. Сравните это с Python, который является процедурным языком с некоторым прикрепленным OO (хотя болты показывают), и некоторыми функциональными элементами (которые BDFL Python неоднократно пытался вырезать ).
  • CRuby (иначе MRI или Ruby Classic) написан и расширен на C. Вы можете научить студентов указателям, управлению памятью и богу ужаса malloc(), научив их расширять язык на C.
  • Даже если это высокоуровневый динамический язык, вы можете многому научиться о структурах данных, типах и т. Д .; Есть библиотеки (драгоценные камни) для всего, что вы только можете себе представить, от красно-черных деревьев до странных вещей с типизацией утки.

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

Во всяком случае ... это мои 0,02 доллара США. Я не пытаюсь убедить вас использовать Ruby, заметьте ... просто использую его как образец качеств, которые нужно искать в языке для преподавания вступительного курса.

Джейсон Льюис
источник
2
«Я твердо верю, что Python - это новый бейсик», - скопируйте это. «два самых сложных (и самых важных) понятия в CS, а именно, указатели и рекурсия» - я никогда не изучал язык, который явно имеет дело с указателями, и я никогда ничего не пропускал. Когда я узнал, как работают компиляторы, указатели там объяснялись достаточно быстро.
Рафаэль
Я согласен, что у мультипарадигмального языка есть своя прелесть (хотя обучение двум-трем «чистым» языкам может быть лучше), но я не буду выбирать Ruby по этой причине. Другие языки для лучшей работы, imho, в частности, в отношении базовой библиотеки. Например, у Scala есть целая библиотека неизменных коллекций.
Рафаэль
3
Я также считаю, что Python является новым бейсиком. Но почему это аргумент против Python?
Джефф
1
@ Рафаэль, указатели трудны только тогда, когда вы начинаете с C, что в некоторой степени заставляет вас подвергаться воздействию указателей, когда слишком много вещей не установлено и когда они имеют запутанные отношения с массивами. Указатели не были трудными для меня, когда я учил себя Паскалю. Указатели не были трудными для людей в моем классе, которых учили их в Алголе 68 (они называются там ссылками, но они являются указателями под другим именем, как в Java; в Алголе 68 сложнее правила автоматической разыменования), с C ++ нет ничего сложного, если вы не начнете с изучения подмножества C.
AProgrammer
1
@DaveClarke: отступы от пробелов, которые более чем восполняют.
Рафаэль
5

Моим первым языком программирования был язык ассемблера игрушек. Вторым был Фортран. В промежутке мне преподавали нотацию «алгоритмов», которая была примерно на Алголе 60. Я оказался вполне в порядке. На самом деле, я думаю, что то, чему меня учили, было в значительной степени идеальным.

Когда я впервые посмотрел на функциональное программирование, но в исследовательских работах, хотя и не на внедренном языке, я сказал: «Вау, это совершенно другое. Это довольно математично!» Большинство людей, которых обучают функциональному программированию, все еще имеют такой же опыт «вау». Я думаю, что это здорово.

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

Лучший первый язык программирования должен быть как можно более простым и максимально понятным, чтобы ученики могли сосредоточиться на том, как мыслить ясно. К сожалению, простота и понятность сборки, Fortran и Algol 60 не имеют аналогов в большинстве современных языков программирования. Хаскелл - хорошее исключение. Но Haskell сделает мой идеальный второй язык программирования, а не первый. Эйфель или Оберон, возможно, могли бы отвечать всем требованиям.

Удай Редди
источник
5

В Школе естественных наук и математики в Северной Каролине мы познакомили студентов с Python с 2004 года. Мы используем его для обучения процедурному программированию, потому что считаем, что способность писать короткие, правильные процедуры жизненно важна для дальнейшего развития с использованием более тяжелых инструментов, включая OO программирование.

Нам нравится это по этим причинам.

  1. Python не является языком свободного формата. Это заставляет студентов писать свой код в блоках, используя отступы. (В качестве технического примечания мы используем текстовый редактор vim и помещаем [ set tabstop=4 set et] в .vimrc, чтобы устранить надоедливые проблемы и сделать отступы кода заметными, но не вызвать уродливое чрезмерное горизонтальное отклонение). Наши студенты привыкли видеть иерархическую структуру программ, разделенных пробелами. В результате их привычки форматирования имеют тенденцию быть очень хорошими, поскольку они программируют на других языках.

  2. Синтаксическая простота Python делает его удобным для начинающих. Простые программы могут быть написаны с минимумом тайных ключевых слов и магических заклинаний. Мы хотим, чтобы студент, который обычно не думал о программировании, попробовал это. Обратите внимание на прекрасную простоту Python hello.py; кристально ясно, что происходит.

  3. Python динамически набирается и набирается уткой. Это позволяет легко вводить переменные. Я говорю своим ученикам, что переменные - это просто метки. Они указывают на объекты. Вы отправляете сообщение объекту, используя имя переменной, так же, как кто-то отправляет вам сообщение, позвонив вам по телефону.

  4. Python - это инструмент, который амбициозные студенты не перерастут. Он имеет сложные библиотеки, которые делают множество полезных вещей. Это мощный креативный инструмент, который доступен для начинающих.

  5. Python бесплатный и работает на всех основных платформах. Наша школа представляет собой гетерогенную среду ОС со всеми видами машин. Нам не нужно беспокоиться о таких проблемах, как совместимость. Он будет работать практически на любом компьютере.

  6. Python имеет отличную документацию. Мы призываем наших студентов исследовать, переделывать и красить за пределами линий. Они узнают об использовании документации Python рано и часто начинают изучать интересные вещи вне класса.

Мы были очень довольны Python.

ncmathsadist
источник
1
Добро пожаловать! Это хороший пример, но мало что дает для ответа на вопрос после критериев отбора, imho. Чтение ваших предметов задом наперед может сделать это, но я не уверен, что вы намеревались.
Рафаэль
Никакого конкретного заказа не было предназначено. Это «и».
ncmathsadist
3

Я бы сказал, что язык (с некоторыми ограничениями) не так важен, как то, что вы делаете с языком. Вы можете узнать примерно то же самое о разработке программного обеспечения, алгоритмах, объектно-ориентированном программировании, компьютерном оборудовании и т. Д. На большинстве языков. Ключ в том, чтобы разработать что-то интересное, которое использует все эти концепции.

(перенесенный ответ с https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language/ )

utdiscant
источник
1

TL; DR: нет никакого способа объективно ответить на это, потому что нет никаких объективных оснований для критериев позади этого. Это так же произвольно, как пытаться спорить, является ли синий, объективно , «лучшим» цветом, чем красный, или если ванильное мороженое объективно «вкуснее», чем шоколад.


Я думаю, что там уже есть несколько замечательных постов, но я добавлю свои 2 цента.

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

Этот вопрос сродни вопросу о том, существует ли способ объективно выбрать первый аромат мороженого, который кто-то еще должен попробовать при посещении места мороженого в первый раз. Нет, не существует объективного способа выбрать то, что по своей сути субъективно .

Зачем? Потому что даже если мы посмотрим на разумные критерии, упомянутые в ответе Педро , у каждого все равно будет субъективное представление о том, как каждый фактор «противостоит» взглядам кого-то другого.

Например, является ли Ruby объективно «проще», чем Python? Проще в каком смысле? По отношению к чему? Что значит «проще» для вас ? Означает ли это «меньше строк кода»? Означает ли это «легче читать и понимать»? А как насчет других? Почему кто-то должен согласиться с каким-то конкретным выбором здесь? Я не думаю, что мы можем ответить на этот вопрос объективно .

Это приводит к следующему вопросу.

На чем основаны эти критерии?

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

Например, почему нет

  • Эффективность: время выполнения и объем памяти могут быть измерены.
  • Размер: Наименьшее количество возможных зарезервированных слов облегчит изучение языка.
  • Набор функций: более широкий набор поддерживаемых функций (например, лямбда-выражения, обобщения, объектная ориентация, перегрузка операторов и т. Д.) Позволит вам обучать большему числу концепций без необходимости переключать языки и возвращаться к исходной точке.
  • Функциональная совместимость: язык, облегчающий работу с другими языками и собственными системами (например, Win32 API из C # или Python и т. Д.), Может быть повышен в качестве более долгосрочных временных вложений и т. Д.

Дело в том, что, хотя я мог бы придумать другой набор критериев оценки и при этом считаться разумным, мы не можем утверждать, что он объективно превосходит / уступает другим.

В заключение, нет объективной основы для критериев. Это так же произвольно, как пытаться спорить, является ли синий, объективно , «лучшим» цветом, чем красный, или если ванильное мороженое объективно вкуснее шоколада.

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

code_dredd
источник