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

13

Какие языки (или классы (как в парадигмах) языков программирования плюс рекомендуемый язык этого класса) должен преподавать каждый студент, изучающий информатику, в колледже, по вашему мнению? Мотивировать ваши ответы; почему этот язык? Какая польза от этого? Каким концепциям он учит (лучше, чем язык X)?

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

Anto
источник
13
Псевдо-код должен быть достаточным для CS.
Jé Queue
12
@Xepoch - не согласен. Не совсем естественно выражать семантику нетерпеливых и ленивых вычислений, ковариацию / контравариантность в сигнатурах типов, теорию категорий и т. Д. С использованием псевдокода. Псевдокод отлично подходит для описания алгоритмов и структур данных, но в CS есть гораздо больше.
Эйдан Калли
6
Более того, подавляющее большинство студентов CS надеются получить неакадемическую работу после выпуска. Псевдокод не будет иметь большого значения на конкурентном рынке труда. Я не думаю, что степень CS должна быть прежде всего профессиональной подготовкой, но она должна быть приспособлена в этом направлении.
Адам Кроссленд
2
ВСЕ ИХ . Если время ограничено, начните с букв алфавита. A +, B, C, C #, D, E, F #, J, K, Q, R, T ... Это неплохой список, на самом деле.
Джесси Милликен
6
Поздравляем с открытием еще одной версии "Какой язык?" вопрос. Я не могу ждать, чтобы прочитать все мнения. Не забудьте ссылку на SICP. Ой, подождите, вот оно.
Корбин, март,

Ответы:

21

Я собираюсь дать список:

  • Ассамблея (относительно простой диалект): важно понять хотя бы немного из основ
  • C: процедурный язык, используемый во многих местах. Не обременяет новых студентов совершенно новыми концепциями, такими как OOD, одновременно.
  • Java / C # / Eiffel / C ++: что-то объектно-ориентированное - это хорошо, любой из них позволит достичь цели обучения студентов OOD, и как только они поймут один из этих языков, они смогут научиться другим. Есть много хорошие языки, я перечислил Eiffel, потому что у этого также есть дизайн по контракту.
  • LISP и Prolog: Обучает студентов совершенно новому способу мышления, что важно, даже если они никогда не используют ни один из них «в реальном мире».
  • SQL и XML: вводит новые способы анализа данных, а также способов их извлечения и управления ими.

Студенты должны как минимум подвергаться воздействию всех этих парадигм . Не только один или два.

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

FrustratedWithFormsDesigner
источник
Мне бы очень хотелось, чтобы в моей школе было больше подробностей по XML и SQL, у нас был один класс, который входил в оба, и это было ужасно.
я бы добавил современные динамические языки, такие как Lua, Python, Javascript и т. д.
Хавьер
4
ах, также некоторые хардкорные функции, такие как haskell и erlang, очень познавательны
Хавьер
1
+1 за листинг SQL. По крайней мере, вы думаете о реляционной алгебре.
Jé Queue
1
Я бы тоже отделил управляемые OO, C ++ и Java. Хотя я никогда не использовал C ++ с тех пор, пока не узнал о malloc, куче и стеке, вы никогда не будете так хорошо разбираться в OO.
Markmnl
45

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

Майкл Браун
источник
2
+1 Мой класс языков программирования был, пожалуй, самым ценным классом, который я выбрал.
HappyCodeMonkey
1
Как студент IT, я определенно согласен. У меня есть преимущество работать полный рабочий день в реальном мире, пока я хожу в школу в качестве разработчика веб-приложений младшего уровня, но я чувствую, что даже если бы я пошел с полноценной степенью CS, я бы упустил много освещения различных парадигм.
Кен
1
Несколько связано: youtube.com/watch?v=Ps8jOj7diA0 У Стэнфорда есть свои полные лекции 2008 года «Парадигмы программирования» на YouTube.
Инамати
4
Добавить декларативный список (Пролог). Также некоторые языки явно параллельны (оккам). Было бы хорошо учить студентов тому, как работает параллелизм (никто не понял его правильно).
Мартин Йорк,
1
@Martin York: Пролог - это язык логического программирования, который является типом декларативного языка. (Я упоминаю об этом, поскольку функциональные языки программирования также являются декларативными, вообще говоря.)
mipadi
33

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

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

Объектно-ориентированный - выбирай. C # / Java / Python / Ruby / Ядда Ядда Ядда. Этому типу нужно учить просто потому, что этого хочет современный бизнес.

Императив - С / Фортран / Паскаль. Они менее распространены в наши дни, но их все же следует изучать с практической / исторической точки зрения. Методы, которые они используют, все еще имеют практичность, потому что на каждом языке все сводится к инструкции. И императивные языки очень хороши в перечислении и следовании инструкциям.

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

Joel Etherton
источник
6
Возможно, вы захотите добавить прототип в этот список - например, JavaScript.
Стусмит
@stusmith - Prototypical стоит упомянуть, но на самом деле это подмножество объектно-ориентированных языков, и javascript - в лучшем случае ограниченный пример. Я бы посчитал это, возможно, домашним заданием в курсе языков программирования, но не фокусом.
Джоэл Этертон
1
+1 за пролог. Я видел его практическое использование, и я регулярно использую для создания прототипов алгоритмов.
Фред Фу
@larsmans - мне было бы интересно услышать о вашем использовании. Я не касался этого в течение нескольких лет, поэтому я не очень хорошо разбираюсь в его практическом применении. Есть ли у вас ссылки на технические документы или аналогичные статьи?
Джоэл Этертон
Посмотрите ECLiPSe ( eclipseclp.org ), диалект Prolog с открытым исходным кодом, используемый в промышленных масштабах несколькими крупными европейскими компаниями (например, французская железнодорожная компания SNCF, если я правильно помню; я постараюсь найти ссылку).
Фред Фу
6

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

На данный момент я скажу, что английский является языком № 1, который должен знать каждый майор CS (это, конечно, зависит от региона).

oosterwal
источник
Отличная работа является побочным эффектом степени CS. Степень CS для этого, знание вычислительной теории. Я мог бы легко получить лучшую работу в профессиональном училище, вместо того, чтобы ломать голову над математикой и КС за все эти годы.
Jé Queue
2
+1 для английского. Компьютерные языки являются деталями реализации.
Уайетт Барнетт
+1. Если кто-то может хорошо выучить английский язык, он может хорошо выучить руководства. Я хорошо знал английский. У меня не было проблем с изучением любого языка.
Шиплу Мокаддим
4

Я думаю, что это меняется со временем, но в идеале - 3 языка с 3 очень разных точек зрения. В мои дни это были процедурные, ОО и функциональные - Паскаль, С ++ и LISP. Я не так продан на этих трех. Но когда я беру интервью, я ищу:

  • Некоторый уровень опыта работы с языком, когда вы должны обращать внимание на управление памятью (C / C ++ и многие другие)
  • Некоторый уровень опыта работы с объектно-ориентированным языком с ожиданиями использования API и различными доступными абстракциями (C ++ / Java)
  • «Растянутый» язык - что-то странное, сложное и сложное. Я не собираюсь нанимать, потому что кто-то знает LISP, ассемблер или какой-то другой сложный язык, но я хочу видеть, что инженер столкнулся с какой-то проблемой, которая включала в себя решение серьезных проблем и множество «что это, черт возьми, это?» моменты.

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

bethlakshmi
источник
4

Для студентов CS ищите языки программирования, которые тесно связаны с обсуждаемыми концепциями CS. Я бы предложил:

  • Схема, чтобы лучше понять лямбда-исчисление
  • Эрланг, чтобы понять модель актера
  • Пролог, для логики предикатов и систем доказательства
  • Haskell, для теории типов / категорий, а также потому, что ленивая оценка полностью выражена в языке
  • по крайней мере, один язык ассемблера - если вы хотите посчитать его под этим баннером, я бы также добавил язык байт-кода, такой как байт-коды Java или CLR, и IR LLVM
  • возможно, язык аппаратного определения, например, Verilog или VHDL
  • Зубр для класса компилятора
  • что-то с динамической системой типов (на ум приходит Ruby) ...

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

Эйдан Калли
источник
3

Yacc

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

mariotomo
источник
2

Лисп (с CLOS для ООП) и Хаскелл. Этот вопрос не ограничивается студентами. Новые модные языки программирования заимствовали (скопировали, украли? ... нет, это неплохо) из множества возможностей. Вы можете подготовить себя к будущему. Функциональное программирование (стиль) сегодня более важно и вводится в императивных языках программирования, таких как C # (LINQ) или C ++ (лямбда) и многих других. Жаль, что некоторые студенты изучают только Java.

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

Я думаю, что язык не так важен, как полагают люди.

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

Студенты могли бы с некоторыми уроками о том, как программировать в реальном мире, а не только о методах книги, это сделало бы их более «округленными» и, по моему выбору, лучшими разработчиками / выпускниками.

Я узнал больше о программировании и разработке программного обеспечения после того, как я покинул университет и начал работать!

оборота user18041
источник
2

ДЕЙСТВИТЕЛЬНО ЛИ ЭТО?

Обычно зуд за этим вопросом звучит так: «Какие умные слова я могу добавить в свое резюме, которое принесет мне самую прибыльную / интересную / сложную / легкую работу?». Хотя этот вопрос имеет свои достоинства, так как большинство резюме сначала проверяются специалистами отдела кадров, которые не понимают, что они ищут. но это очень мелко, так как после того, как вы прошли ворота, вам нужно доставить товар.

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

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

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

На мой взгляд, вам нужны оба. # 1 обеспечит краткосрочные навыки, а при грамотном выборе облегчит вам работу с HR, но # 2 останется с вами на протяжении всей вашей карьеры и определит вас как программиста.

№ 2 предоставит руководство и организует ваш ход мыслей в направлении рабочего решения стоящей перед вами проблемы, но без 1 он остается идеей, навсегда проплывающей в объятиях испепеляющего рая (или ада, в зависимости от того, откуда вы на него смотрите).

# 1 даст вам возможность воплощать идеи в реальные рабочие системы, но без 2 ваши системы будут стремиться к раковым бесформенным монстрам.

Newtopian
источник
Да, это важно Первый язык, который вы изучаете, формирует у вас мысли о том, как вы будете смотреть на будущие языки.
1

Я считаю, что вы частично ответили на свой вопрос самостоятельно.

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

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

Так конкретно:

ООП: .NET или Java

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

Функциональный: Лисп?

Стивен Джеурис
источник
функционал, нет, пожалуйста, не LISP. скорее: haskell.
Мариотомо
1

Язык ассемблера и микрокод. Студент CS должен понимать все основные уровни абстракции между булевыми конечными автоматами и последним высокоуровневым функционалом / OOP / и т.д. парадигма языка программирования.

Basic или Logo или Squeak (et.al.), если они когда-либо захотят понять, как научить маленьких детей компьютерной грамотности.

Фортран, Кобол и Лисп, если они хотят понять историю языков программирования и узнать, какие реальные проблемы решают современные практики.

оборота hotpaw2
источник
И C, так что вы понимаете 90% всего открытого исходного кода, который вы можете изучить.
правостороннее
1

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

Шон Патрик Флойд
источник
1

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

Классический язык - это Forth , но сейчас я перехожу на Factor . Также стоит проверить Джой и Кэт . Не пропустите сочинительный язык вики . Это веселее, чем мешок с молотками!

Скудный Роджер
источник
0

Что-то функциональное, Haskell или Lisp будет моим первым выбором, но, возможно, Erlang. Функциональные языки действительно научат вас, как создавать абстракции очень мощным способом.

Захари К
источник
Но следует ли ученикам ограничиваться одной парадигмой? А как насчет функциональных языков ООП, таких как Scala?
Anto
1
Нет, конечно, нет, я предполагал, что другие люди будут охотиться за ними!
Захари К
0

Несмотря на отсутствие мейнстрима, я обнаружил, что D, а именно версия 2, предоставляет некоторые интересные уроки, которые нельзя легко выучить где-либо еще. Это более серьезная попытка, чем любой другой язык, который я могу придумать, чтобы заставить императивное / процедурное, объектно-ориентированное и функциональное программирование хорошо играть друг с другом и позволить программированию на очень низком уровне (указатели, ручное управление памятью, inline ассемблер) и очень высокий уровень (общее и генеративное программирование) на одном языке.

Это ценно, потому что вместо того, чтобы рассматривать парадигмы изолированно, как если бы они существовали в разных вселенных, вы можете видеть лес сквозь деревья. Вы можете увидеть сильные и слабые стороны каждой парадигмы на детальном уровне, когда будете смешивать их в свои программы. Вы увидите, как основные аспекты парадигм могут быть реализованы в библиотеках с точки зрения низкоуровневого кода. Модуль стандартной библиотеки std.algorithm реализует важные примитивы функционального программирования, но представляет собой простой, простой D-код без всякой магии. Так же, std.rangeреализует ленивую оценку, но опять-таки довольно простой D-код. Вы понимаете затраты, связанные с примитивами каждой парадигмы, потому что черты D, близкие к металлическим, делают то, что на самом деле происходит под капотом, относительно прозрачным. Вы даже можете написать что-то низкоуровневое, похожее на C, а затем создать симпатичный, высокоуровневый интерфейс к нему на том же языке, не мешая волшебным слоям клея.

dsimcha
источник
0

Псевдокод.

Специалисты в данной области должны быть в состоянии объяснить свои идеи последовательным, структурированным образом без жаргона, специфичного для фреймворка или синтаксиса. Мне не нужно знать разницу между вашими квадратными скобками и скобками, чтобы понять ваш алгоритм. Мне не нужно знать, что ??значит, или чтоgrep переключатели.

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

редактировать: этот ответ частично мотивирован неспособностью некоторых программистов писать псевдокод.

«Просто напиши алгоритм в псевдокоде»

"Что это?"

Преимущества псевдокода в том, что непрограммные заинтересованные стороны могут его понять. Я не предполагаю, что вы хотите, чтобы БА и пользователи проверяли ваш код, однако это может помочь, когда непрограммист понимает требуемый алгоритм. Psuedocode устраняет необходимость объяснения for (int i = 0; i < j; i++)и что по сути является шаблонным жаргоном.

Кирк Бродхерст
источник
Многие языки программирования достаточно мощные, поэтому разница между реальным кодом и псевдокодом невелика. На какие элементы синтаксиса реальных языков программирования вы возражаете?
Кевин Клайн
@kevin cline - мне комфортно с синтаксическими элементами, о которых я знаю, - это те, о которых я не знаю, против которых я мог бы возразить. Конечно, я могу их расшифровать, но дело в том, что у псевдокода не должно быть таких проблем (мне еще предстоит увидеть язык программирования, который действительно выглядит как псевдокод)
Кирк Бродхерст,
0

C.

  • Прежде всего, он все еще используется (широко используется!), И не только для ядер. В настоящее время я поддерживаю бизнес-приложение, написанное на языке C. Таким образом, даже с чистым и простым C вы все равно можете получить работу. В больших компаниях, в промышленности почти везде (но в веб-разработке).
  • Если вы собираетесь работать в среде Unix / Linux, незнание хотя бы небольшого числа Си немного похоже на поход по магазинам и невозможность прочитать цены на тегах.
  • Указатели! Все должны понимать указатели (ср. Джоэл Спольски ). Кроме того, как только вы схватили концепцию malloc, вы точно знаете, что происходит, когда небрежно вводите «новый» в языке ООП.
  • Большинство синтаксисов "популярных языков" происходит от C.
  • Да, это не всегда понятно. Да, это трудно учиться. Да, струны - это своего рода кошмар для начинающих. Но программирование не всегда понятно и его трудно изучить, и вы действительно поймете, что хорошего в ООП, когда, изучив C, вы попробуете C ++ и обнаружите std :: string.

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

Raveline
источник
0

Некоторыми языками программирования, которые применялись для приобретения общих навыков решения проблем, и концепциями программирования являются Logo и Karel, их следует изучать перед C / C ++ / Java / Lisp / PERL / Assembly / любой парадигмой программирования.

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

umlcat
источник
-1

Что-нибудь с объектами. Просто убедитесь, что они хорошо это изучают.

Я бы нанял отличного Java-программиста для C # в любое время, но у меня было бы много сомнений нанять человека, который никогда не писал реальный код

Эрик
источник