Критерії вибору мови для першого курсу програмування


35

Як викладач КС на університеті, питання про те, яку мову програмування викладати в першому курсі програмування, часто виходить на обговорення. Є тисячі мов на вибір, і багато релігійної лихоманки (або гарячки), яка підтримує один мовний табір над іншим. Весь цей суб'єктивний ухил, що оточує кожну мову програмування, учителеві дуже важко вибрати його.

Моє запитання:

Які об’єктивні критерії викладач може використовувати для вибору мови програмування, яка використовуватиметься як основа для першого курсу програмування університету? На чому ґрунтуються ці критерії?

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


Це питання надихнуло ще одне питання, яке було визнано поза темою: https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language .


1
Відкрито мета-нитку про те, чи це питання не в темі: чи це тема: meta.cs.stackexchange.com/questions/362/…
Дейв Кларк

7
<Схоплює попкорн> Перефразовуючи Отто Нойгебауера : Жодна перша відома людині мова програмування не здатна знищити всіх.
JeffE

3
@Raphael: Я думаю, що відповідь Дейкстри, ймовірно, буде " Кожна перша мова програмування, відома людині, здатна знищити всіх".
JeffE

2
@ edA-qamort-ora-y, так, вони повинні зазнавати декількох парадигм програмування. Ні, цього не можна зробити на першому курсі.
vonbrand

3
У нас це було SMLпросто тому, що навряд чи хтось із студентів знає цю мову раніше. Це врівноважує кожного студента більш-менш на одному рівні для початку курсу.
Маркус Малкуш

Відповіді:


14

Я кину свої два центи, хоча я вважаю, що ця тема є бездонною ямою. Не зрозумійте мене неправильно, я думаю, що це захоплююче питання, але, мабуть, не те, що ми вирішимо тут на задоволення всіх.

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

Мій власний досвід випливає з навчання кількох поколінь студентів першого та другого курсу мовою програмування Oberon . Люди, які знають цю мову, визнають її вплив у моїй думці. Зауважте, що ця мова використовувалася для викладання "Алгоритмів та структур даних". У той час (тоді) функціональне програмування та об'єктно-орієнтоване проектування викладалися в окремих курсах, починаючи з другого курсу.

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

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

  • Простота : Студенти зазвичай там навчають програмуванню, алгоритмам та структурам даних, а не особливостям і тонкощам будь-якої конкретної мови програмування. Вір використовував цитату Ейнштейна "Зробити це максимально просто, але не простіше" як керівний принцип в дизайні Оберона, і там є кілька інших мов, які роблять це так само добре. Ваша мова програмування, яка вибирається, повинна вміти реалізовувати всі концепції, необхідні у вашій лекції, але це має робити з найменшим можливим набором функцій / деталей. Мова програмування зазвичай просто інструмент, а не мета.

  • Однозначність : Близький простір простоти, має бути одна конструкція для кожної концепції, з якомога меншим перекриттям. Подумайте про це, як існує лише один «правильний» спосіб реалізації кожної концепції. Три різні типи петель, які семантично всі роблять те саме? Або п’ятнадцять різних способів збільшення змінної? Не добре. Це також робить виправлення домашніх завдань або взагалі просто розуміння коду ваших студентів набагато простіше. Ваші асистенти вчителів оцінять це.

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

  • Галузеві переваги : Серйозно, ми повинні почати хвилюватися з цього приводу лише в тому випадку, якщо "Індустрія" сама коли-небудь вирішить, яка мова програмування їй найбільше подобається. З часу винайдення комп'ютерів це було ціллю, що постійно рухається. На даний момент, якщо ваші студенти дійсно навчаться програмувати, то це не буде залежно від мови. Однак є деякі сфери, де промисловості вдається домовитися про стандарт, наприклад, VHDL для розробки схем або SQL для запитів баз даних, тому це все-таки є дійсною точкою.

Знову ж, те, як мова підходить до цього списку, сильно залежить від того, чого ви намагаєтесь навчити!


4
Насправді існує розкол у схемі дизайну між VHDL та Verilog.
авакар

@avakar: Ой, лайно. Я виправлю це у своїй відповіді, дякую, що вказав на це!
Педро

Yikes, прочитав це і подумав, що це один з моїх лекторів. +1 для Oberon, до тих пір, поки перемикач ключових слів на малі ключові слова буде автоматично включений; так боляче писати WHILE expr DO stmts ENDтощо
Callum Rogers

3
+1 за "які цілі вашого курсу?" і додаткова примітка, одна з найпоширеніших цілей, навіть якщо вона не написана - дати основи іншим речам (курси та стажування), які є необхідною умовою програмування.
AProgrammer

Важливим моментом (принаймні сьогодні) є те, що він дозволяє студентам будувати візуально привабливі програми незабаром і безболісно. Вони піддаються такій кількості інтенсивно графічних програм та ігор, що вони, природно, думають, що саме так комп'ютери повинні взаємодіяти з людьми.
vonbrand

13
  • Розвиток алгоритмічного мислення для вирішення завдань як основної мети: Одна погана річ у використанні об'єктно-орієнтованої парадигми на першому курсі полягає в тому, що отримання нових учнів у такі речі, як спадщина, поліморфізм тощо, відволікає їх від вищезазначеної основної мети. Насправді, впровадження будь-яких вторинних міркувань поруч із цією основною метою, як-от інженерія програмного забезпечення, портативність, корисність галузі тощо, є контрпродуктивними з зазначеної причини.

  • Не об'єктно-орієнтована мова: в наш час більшість університетів починають викладати програмування правильно з об'єктно-орієнтованою мовою. Я думаю, що це помилка. У світі є речі, які можна по-справжньому зрозуміти лише на відміну від її протилежності. Не піддаючись процедурній парадигмі програмування (дані та функції як два окремі аспекти програми), багато хто може пропустити основну ідею орієнтації на об'єкти (дані та поведінку як внутрішньо пов'язані між собою). А тому, що об'єктно-орієнтоване програмування настільки важливо, що відсутня його основна ідея - не маленька річ. Крім того, оскільки, швидше за все, на старших курсах студенти ЦС будуть програмувати переважно в ОО, вони також повинні піддаватися процесуальній стороні речей.

Отже, врешті-решт, я б пішов на процедурну мову, уникаючи розширених функцій, зосередившись на розвитку алгоритмічного мислення. Але, уникаючи розширених функцій, я не маю на увазі уникання складних проблем. Я маю на увазі, що навіть складні проблеми, від учнів слід вимагати їх вирішення, використовуючи перші принципи, прості інструменти.


Ви можете досить легко почати з підмножини, скажімо, Java спочатку, щоб показати процедурний стиль. Потім ви відкриваєте скриньку Пандори і показуєте, як виглядають ті самі речі з OOP.
Рафаель

3
@Raphael: Не можна уникнути public static void main()Java, яка повинна бути в контексті якогось класу. Це робить Java менш ідеальною як першою мовою, хоча, звичайно, перешкода не надто велика.
Дейв Кларк

Хороший IDE може відкластись public static void main()на дуже довгий час. BlueJ - хороший приклад IDE, який дозволяє студентам писати програми без жодного mainмісця в ній.
Баррі Браун

2
Проблема OOP полягає в тому, що для цілого ряду проблем із іграшками, які охоплені в перший рік програмування, він просто перешкоджає без явної переваги. OOP стає важливим (і цінується), коли ваші програми мають тисячу рядків. "Java без OOP" - жахлива, багато абсолютно непрозорих речей, які "треба писати таким чином", суперечать людям, які навчаються , а не папугують.
vonbrand

11

Оскільки ми говоримо про перший курс програмування в програмі Computer Science, я б сказав, що найважливішим аспектом було б, яким фундаментальним поняттям CS він навчить своїх учнів. Оскільки не існує мови, яка зможе навчити всі поняття одразу, вам потрібно розглянути, які поняття знадобляться далі.

Я не згоден з думкою @ Kaveh про важливість галузі; це може бути бонусом, але це має незначне значення. З міцним підґрунтям в принципах CS, вивчення "промислової" мови на наступних курсах буде відносно легким.

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


1
Актуальність галузі можна вважати вторинною, але я не думаю, що це другорядне питання. Оскільки це вступ до курсу програмування, я не бачу, чому б хотіли викладати всі поняття в ньому, часто є другий курс програмування та ще один курс на тему мови програмування, де обговорюються різні мови та багато інших курси, зосереджені на конкретних областях застосування, наприклад програмування для Інтернету тощо.
Kaveh

@Kaveh: Це для мене звучить як навчальний план технічного університету.
Рафаель

6
"Важливо якомога швидше піддавати своїх учнів іншій, докорінно різною мовою". - абсолютно правильно. Ми встановлюємо свіжих, які думають, що вони можуть запрограмувати прямо, запровадивши функціональне програмування спочатку: майже всі новачки в цій парадигмі, і тим більше C (++) ви виявились тим важче, як здається.
Рафаель

3
@Kaveh: Мови, розроблені для того, щоб зробити речі, зроблені в реальному світі, не обов'язково є оптимальними для викладання концепцій або розвитку навичок. Цілі дуже різні.
JeffE

1
@Kaveh: Я ніколи не писав, що знання мов, які використовуються в промисловості, не має значення. Я маю на увазі те, що за умови твердої першої мови програмування, пізніші курси не матимуть проблем навчати студентів чомусь, що вони насправді будуть робити, коли закінчать навчання. Будучи частиною викладання декількох вступних курсів (як технічна допомога), я б сказав, що навички, які ви засвоїте, є нічим подібними до тих, що потрібні в галузі (на це замало часу). Якщо це так, то я вважаю, що краще дати їм тверді поняття, щоб вони могли стати кращими програмістами, а не просто $ LANGUAGE-програмістами.
evilcandybag

8

Моя головна турбота - універсальність , в тому сенсі, що вивчення цієї мови програмування повинно змусити учня обробляти більшість мов програмування.

Наскільки я шкодую, цей критерій виключає чисті функціональні мови. Це стосується і курсу, який не повинен використовувати екзотичні особливості мови.

... але це лише здоровий глузд.


1
З монадами, як у Haskell, можна стверджувати, що цей критерій вже не застосовується до чисто функціональних мов.
Дейв Кларк

@DaveClarke: монади - це дуже приємний спосіб робити нефункціональні речі. Але хіба не надто ризиковано спочатку вивчити цей матеріал із монадою накладними, а не безпосередньо? (Можливо, це не так, я не знаю!)
jmad

2
@jdam: Ви, мабуть, праві. Проблема полягає не в монадах самих по собі, а в загальності і труднощах представити програмісту хороші повідомлення про помилки. Варіант " Гескель" Гелій вирішує ці питання і успішно застосовується зі студентами першого курсу.
Дейв Кларк

@DaveClarke: Нічого, я про це не чув. Це дуже круто! На жаль, хоча це дуже корисно для вивчення Haskell, це не вирішує проблему, яка може не допомогти вивчити інші мови.
jmad

4
@Ben: я відчуваю, що ручне управління пам’яттю - це те, що сьогодні є специфічним для деяких мов (і що ви дізнаєтесь у цих конкретних випадках) більше, ніж принципова річ програмування. Якщо ви не згодні з цим, то, мабуть, це вказує на C (або C ++).
jmad

8

Вибираючи першу мову програмування, існує багато питань, які потрібно враховувати. Багато з них було розглянуто у відповідях вище. Я включаю ще 3, оскільки вони були частиною моєї відповіді на закрите запитання ( https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language ), що спочатку надихнуло це питання . Свою відповідь я скопіював тут (і змінив) на основі поточної політики видалення закритих питань.

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

Програмування у великому проти програмування у малому

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

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

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

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

Мова програмування, такий як C ++, має багато функцій, які допомагають програмуванню в цілому, але важче сісти і почати писати дуже просту програму. Java схожа.

З іншого боку, така мова, як Python, Ruby, Scheme або Haskell, значно полегшує безпосередньо написання програми.

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

Такі мови, як C ++ та C, - мова нижчого рівня. Вони дозволяють програмісту безпосередньо маніпулювати посиланнями в пам'ять. Хоча це дозволяє написати дуже ефективний код, деталі низького рівня можуть бути важкими для першого програміста, який вивчить мову. Дехто може стверджувати, що ці деталі низького рівня перешкоджають написанню логіки для вирішення проблеми.

Мова вищого рівня, як Python, полегшує висловлення понять більш прямо з точки зору проблемної області.

Статистично набрано проти динамічно набране

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

Python, Ruby та Scheme динамічно набираються. Це означає, що під час роботи програми виявляються помилки. Можна стверджувати, що для виявлення помилок це занадто пізно (але можна також скористатися тестуванням, щоб уникнути таких помилок). Знову ж таки, уникаючи релігійних аргументів, переваги виду помилок, з якими стикаються під час написання простих програм на динамічно набраній мові програмування, є таким, яким цей об'єкт не знає, як зробити цю операцію . У контексті невеликої програми ці помилки легко зрозуміти та відстежити.

Такі мови, як C, мають слабку типізацію, це означає, що, хоча компілятор допомагає з деякими помилками, час виконання не вдається захопити інші, які трапляються, наприклад, недійсний доступ до пам'яті. В результаті повідомлення про помилку, повернене програмісту, схоже на "Програма завершена". Динамічно набрана мова дозволить захопити ці помилки та перетворити їх у більш зрозуміле повідомлення про помилку.

Інші

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


Сердечно погоджуйтесь.
vonbrand

1
У мене також є власні переваги щодо суперечки "статичні проти динамічних типів". Однак, у загальній програмі CS, якщо обидва навчаються як деякий момент, я вважаю, що порядок не має великого значення. Якщо представлена ​​лише одна сторона монети, це для мене велике питання.
чі

8

В якості вступного зауваження розглянемо можливість представлення більше однієї мови (за один курс). На моєму першому терміні ми показали як SML, так і Java. Контраст мав своє дуже важливе повідомлення: виберіть правильний інструмент для роботи.

Але тепер щодо критеріїв, у довільному порядку.

Складність у навчанні - це суб'єктивне питання, але важливо: ви не хочете, щоб ваш учень витрачав час на вивчення мови, а на те, щоб робити з нею справи. Напевно, на цьому фронті можуть виграти такі динамічні мови, як Рубі: ви можете їх нагодувати чим завгодно, а в Інтернеті є чудові підручники "манекенів". Якщо я правильно пам’ятаю, є також дослідження, які показують, що студенти, які раніше не програмували, досягають кращих результатів за допомогою функціональних мов, ніж з іншими.

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

Масштабованість : Цілком ймовірно, що ваші студенти не вивчать більше мов самостійно, ніж ті, які ви їм показуєте. Тож ви хочете, щоб вибрані вами мови розмахували впродовж навчання: їм потрібно писати вправи для вашого улюбленця зараз, але пізніше вони можуть також атакувати середній проект. Ява та мови з подібною екосферою тут хороший вибір.

Підтримка інструментів : це пов’язано зі масштабуванням. Якщо ви очікуєте / хочете, щоб ваші студенти були продуктивними з мовою, тоді повинні існувати хороші ІД, менеджери для побудови та бібліотеки. Інтерактивні мушлі (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 або Паскаль, які обоє мали вказівники функції майже назавжди. Практично єдиною (основною) мовою, яку цей критерій фактично вимикає, є Java.
Мейсон Уілер

Намагатись навчити новачків змішати різні синтаксиси та основні поняття - це просто суперечка мозку.
vonbrand

6

Захоплююче питання; Мені подобається ваш акцент на об'єктивних критеріях. Ми хочемо, щоб першокурсники навчалися:

Концепції програмування : Перша мова програмування повинна підтримувати: виклики функцій, ітерація, рекурсія

основні ідеї : Перша мова програмування повинна підтримувати масиви (для перших кроків у легкому вступі до того, як реально працює пам'ять і як працюють покажчики)

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

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

Інші критерії для першої мови :

інтерпретовано (швидкий зворотний зв'язок допомагає навчальному процесу).

інтерактивне середовище, яке прискорює навчання, тестування та налагодження.

для студентів доступний високоякісний вихідний код для читання такою мовою

"легкий для читання", "синтаксис, що наближається до природної мови" (щоб полегшити читання та класифікацію SourceCode)

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

швидко навчати, "декілька хатчей" - наприклад, "[I] t може бути швидше спочатку навчити початківців Python, а потім Java, а не Java як перший OOPL." - "Порівняння об'єктно-орієнтованих мов розмовлянь" та TelescopeRule

Маттіас Феллейзен розробив мову програмування з повідомленнями про помилки, пристосованими для початківців аудиторії. Він підкреслює, що конкретний вибір мови не настільки важливий, як навчання хорошій методиці проектування. Насправді він бачить перший курс CS як клас Liberal Arts, який навчає критичному мисленню, вирішенню проблем та уваги до деталей.

критерії для другої мови програмування

Ми хочемо, щоб студенти вивчали, але, можливо, це може зачекати другої мови програмування:

"відповідна" мова, яка "не надто езотерична"; щось "популярне в галузі"

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

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

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

EDIT: Мені прикро, що розміщення резюме того, що я написав у співпраці з багатьма іншими, "може не бути юридичною посадою".

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

Ця відповідь є коротким викладом першої мови першокурсника (Anon 2011) у сховищі Портлендського зразка.

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


Чи перевірили ви з оригіналами авторів, чи дозволено вам відтворювати їхній вміст? Джерело - це корпоративний веб-сайт, і я не міг знайти декларацію про те, що вміст є безкоштовним, тому це може бути не законним повідомленням!
Рафаель

1
@Raphael Джерелом є вікі (тому потенційно є багато різних авторів). Якщо автор (будь-який співавтор) цього матеріалу не хоче, щоб його тут було включено, він повинен надіслати повідомлення про зняття DMCA на [контактну адресу, вказану внизу цієї сторінки] (mailto: team+cs@stackexchange.com) . Крім того, інформація не охоплюється авторським правом, лише те, як вона виражена. Трохи рефакторингу та видаленняWordsRunTogetherWikiWikiStyle покращить цю відповідь та усуне будь-який ризик порушення авторських прав.
Жил "ТАК - перестань бути злим"

1
+ Хороша відповідь, але у мене є одна нитка для вибору - профілі. За ними немає ніякої теорії - просто "загальновідомі". Як правило, серед вчених не цінується, що існує багато проблем, які вони не знаходять, і інша техніка є. Перевірте це посилання.
Майк Данлаве

5

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

Ще один критерій - корисність мови в галузі. Ми не хотіли б навчати мові, яка не є корисною в галузі. Ясна більшість студентів збирається працювати в галузі, тому слід мати прислів до того, що використовується (і буде використовуватися, коли студенти закінчать) у цій галузі.

Третім критерієм будуть курси, які студенти мають пройти в наступні роки. Курси, особливо необхідні курси, розроблені не самі, а узгоджуються з іншими курсами.

Остання, про яку я зараз можу придумати, - це те саме, що відповідь jmad, мова повинна забезпечити легкість у вивченні інших важливих мов. Це повинно бути досить багатим, і добирати пізні важливі мови було б просто (тут важливі засоби, важливі з точки зору учнів).

Я думаю, що багато університетів перенесли свій основний вступ до курсу програмування з Java / C ++ / C на Python, хоча вони можуть час від часу пропонувати введення в програмування іншими мовами (часто для спеціальностей, які не є інформатикою, наприклад, C для спеціальностей з електротехніки) хоча вони можуть проявити гнучкість, якщо викладач хоче експериментувати з викладанням іншої мови раз у раз.


3
Я б не оцінив корисність у галузі дуже високо на вступному курсі програмування. Успішному програмісту на природі, ймовірно, доведеться вивчити низку мов протягом своєї кар’єри, деякі з них "на роботі", тому вміння підбирати та вивчати нові мови - це ключовий навик, якого потрібно навчати. Отже, я не очікував, що перша мова, яка буде викладатися в університетському курсі, обов'язково буде їх найсильнішою після закінчення навчання.
Бен

1
@Ben: Корисність у галузі є особливо важливою, якщо студенти не збираються здобувати спеціальності в КС. Звідки я приходжу від багатьох людей, які працюють над біологією чи іншими науками, і, враховуючи те, як вони не встигають вивчити багато мов, вивчення чогось загального в їх екосистемі, наприклад, Python, швидше за все, буде кориснішим, ніж ML, Java або C.
hugomg

1
Виступаючи як хтось із галузі (одна конкретна галузь, не обов'язково репрезентативна), я не думаю, що галузева актуальність є фактором, коли мова йде про майбутніх програмістів першого рівня. Опромінення декількох парадигм робить програмістів кращими, навіть якщо в моєму домені (вбудованому програмуванні) ми здебільшого використовуємо C. Деталі мови можна вивчити в посібнику, загальні поняття краще навчаються в школі. Для випадкових програмістів (наприклад, вчених) пріоритети різні, але занадто велика концентрація уваги на Fortran може змусити людей ігнорувати Numpy, коли це те, що вони повинні використовувати.
Жиль "ТАК - перестань бути злим"

5

Тож я негайно відмовляюся від своєї реакції на коліна, а це те, що всі повинні навчитися програмуванню через SICP, тому що Lisp - це правильна річ.

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

Хоча деякі з цих інших постів пропонують чудові критерії, я хотів би використовувати певну мову, щоб проілюструвати, як виглядає "відповідність критеріям".

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

Звичайно, викладання вступного курсу на мові C буде неймовірно щільним, а також, ймовірно, не вистачить багатьох важливих понять, пов'язаних з рекурсією. Крім того, курс викладається в Ліспі доведеться адресними покажчики під кожухами, так carі cdrмає на увазі важливі поняття , пов'язані з пов'язаними списками, в той час дозволяючи на мові обробляти деталі.

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

Я також не згоден з пропозицією не використовувати об'єктно-орієнтовану мову. Я вважаю, що корисність об'єктно-орієнтованих мов для моделювання реального світу є позитивним надбанням для нових програмістів, доки ясна невідповідність імпедансу, і що об'єктно-орієнтовані мови є однією парадигмою серед багатьох.

Я б запропонував, щоб Рубі (запропонована як можливість також іншою посадою) демонструє багато якостей, які потрібно шукати мовою, яку використовувати для вступу до курсу програмування.

Я виправдаю це твердження на мить, але спершу хочу прокоментувати одну тенденцію, яка мене заважає на курсах введення CS. Я працюю в університеті, який, як і багато шкіл, останнім часом перейшов на використання Python для своїх вступних курсів. Я твердо вірю, що Python - це нова БАЗА, і схильність мови полягає у виборі дружнього сприятливості щодо сили та виразності, як я нещодавно доводив деінде . Це несправедливе обслуговування, і нам потрібно думати про програмістів, якими вони стануть, а не про новичок, якими вони є на даний момент.

Так чи інакше, виправдовуючи Рубі як вступну мову ...

  • Рубін, хоча і не оптимізований заклик до хвоста, робить рекурсію досить добре. Так ось це.
  • Рубі - мультипарадигма. Хоча це чиста об'єктно-орієнтована мова, вона також охоплює функціональне програмування, а також має деякі необхідні навчальні колеса, похідні від С. Порівняйте це з Python, що є процедурною мовою з деякими зафіксованими OO (хоча показані болти) та деякими функціональними елементами (які BDFL Python не раз намагався вирізати ).
  • CRuby (він же MRI або "Ruby Classic") пишеться і розширюється в C. Ви можете навчити учнів про покажчики, управління пам’яттю та богобоязного бога malloc(), навчивши їх розширювати мову на C.
  • Навіть думав, що це динамічна мова високого рівня, ви можете багато чого навчити структурам даних, типам тощо; Є бібліотеки (дорогоцінні камені) для всього, що ви могли собі уявити, від червоно-чорних дерев до занять дивними речами з набором качок.

У будь-якому випадку, ви не можете замінити вивчення багатьох мов з багатьох парадигм, незалежно від того, використовуєте ви їх професійно чи ні. В основному, я думаю, кожен повинен розуміти , якщо не використовувати , C та Lisp. Рубі - найкращий компроміс, про який я можу придумати вступний семестр.

Так чи інакше ... це мої $ 02. Я не намагаюся переконати вас використовувати Рубі, майте на увазі ... просто використовую це як зразок якостей, щоб шукати мову для викладання вступного курсу.


2
"Я твердо вірю, що Python - це нова БАЗА" - скопіюйте це. "два найскладніших (і найважливіших) поняття в CS; а саме - покажчики та рекурсія" - я ніколи не вивчив мову, яка чітко займається вказівниками, і я ніколи нічого не пропускав. Коли я дізнався, як працюють компілятори, вказівники де пояснюються досить швидко.
Рафаель

Я погоджуюсь, що багатопарадигмічна мова має свою принадність (хоча викладання двох-трьох «чистих» мов може бути кращим), але я не вибираю Рубі з цієї причини. Інші мови для кращої роботи, що стосується основної бібліотеки. Скала, наприклад, має цілу бібліотеку незмінних колекцій.
Рафаель

3
Я також вважаю, що Python - це нова БАЗА. Але чому це аргумент проти Python?
JeffE

1
@Raphael, покажчики важкі лише тоді, коли ви починаєте з C, що дещо змушує вас піддаватися покажчикам, коли занадто багато речей не влаштовується і де вони мають заплутані стосунки з масивами. Покажчики мені не були важкими, коли я самоучка себе Паскаль. Покажчики не були важкими людям у моєму класі, які навчали їх у Algol 68 (там вони названі посиланнями, але вони вказують іншим ім'ям, як у Java; те, що важко в Algol 68, це автоматичні правила відміни), покажчики навіть не важкі з C ++, якщо ви не починаєте з викладання підмножини C.
AProgrammer

1
@DaveClarke: Він відступає пробілам, що більше, ніж компенсує їх.
Рафаель

5

Моєю першою мовою програмування була мова складання іграшок. Другий - Фортран. Між ними мене навчали нотації "алгоритмів", яка була приблизно Algol 60. У мене вийшло цілком нормально. Насправді, я вважаю, що мене вчили, було майже ідеальним.

Коли я вперше подивився на функціональне програмування, в дослідницьких роботах, хоча і не на реалізованій мові, я пішов "вау, це зовсім інше. Це зовсім математично!" Більшість людей, які навчаються функціональному програмуванню, все ще мають однаковий досвід "вау". Я думаю, що це чудово.

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

Найкращою мовою програмування має бути те, що є максимально простим і зрозумілим, щоб студенти могли зосередитись на тому, як чітко мислити. На жаль, простота та чіткість складання, Fortran та Algol 60 не мають собі рівних у більшості сучасних мов програмування. Haskell - хороший виняток. Але Haskell зробив би мою ідеальну другу мову програмування, а не першу. Ейфель або Оберон, можливо, могли відповідати рахунку.


5

У Науково-математичній школі в Північній Кароліні ми знайомили студентів з Python з 2004 року. Ми використовуємо це для навчання процедурному програмуванню, оскільки вважаємо, що вміння писати короткі, правильні процедури є життєво важливим для подальшого прогресування більш важкими інструментами, включаючи О.О. програмування.

Нам це подобається з цих причин.

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

  2. Синтаксична простота Python робить його сприятливим для початківців. Прості програми можуть бути написані з мінімальними прихованими ключовими словами та магічними закликами. Ми хочемо, щоб студент, який зазвичай не думав про програмування, спробував це. Зауважте чудову простоту Python's hello.py; кристально зрозуміло, що відбувається.

  3. Python динамічно набирається і набирається качка. Це полегшує введення змінних. Я кажу своїм студентам, що змінні - це лише мітки. Вони вказують на предмети. Ви надсилаєте повідомлення об’єкту, використовуючи ім'я змінної, наскільки хтось надсилає вам повідомлення, зателефонувавши вам по телефону.

  4. Python - це інструмент, який амбітні студенти не переростуть. У ньому є складні бібліотеки, в яких є безліч корисних речей. Це потужний творчий інструмент, доступний для початківців.

  5. Python безкоштовний і працює на всіх основних платформах. Наша школа - це неоднорідне середовище ОС з усілякими машинами. Нам не потрібно турбуватися про головні болі, такі як проблеми сумісності. Він працюватиме на будь-якому комп’ютері.

  6. У Python є відмінна документація. Ми заохочуємо наших студентів досліджувати, погладжувати та кольори поза межами ліній. Вони дізнаються про використання документації Python на ранніх етапах, і часто виявляють цікаві речі поза класом.

Ми були дуже задоволені Python.


1
Ласкаво просимо! Це приємне тематичне дослідження, але мало відповідає на питання після критеріїв відбору, imho. Читання ваших предметів може зробити це вроду, але я не впевнений, чи ви це задумали.
Рафаель

Ніякого конкретного замовлення не передбачалося. Це "і".
ncmathsadist

3

Я б сказав, що мова (за деякими обмеженнями) має значення не стільки, скільки те, що ви робите з мовою. Ви можете дізнатися приблизно те саме про розробку програмного забезпечення, алгоритми, об'єктно-орієнтоване програмування, апаратне забезпечення комп'ютера тощо тощо на більшості мов. Головне - розробити щось цікаве, що використовує всі ці концепції.

(міграційна відповідь з https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language/ )


1

TL; DR: Немає можливості об'єктивно відповісти на це, оскільки немає об'єктивних підстав для критеріїв, що стоять за ним. Це так само довільно, як намагатися дебатувати, якщо блакитний є об'єктивно "кращим" кольором, ніж червоний, або якщо ванільне морозиво об'єктивно "смачніше", ніж шоколадне.


Я думаю, що вже є чудові пости, але я додам свої власні 2 центи.

Які об’єктивні критерії викладач може використовувати для вибору мови програмування, яка використовуватиметься як основа для першого курсу університетського програмування?

Це питання схоже на запитання, чи є спосіб об’єктивно вибрати перший аромат морозива, хтось інший повинен спробувати, коли вперше відвідає місце морозива. Ні, немає об'єктивного способу вибору того, що по суті є суб'єктивним .

Чому? Тому що навіть коли ми подивимось на розумні критерії, згадані у відповіді Педро , у кожного все одно буде суб’єктивне уявлення про те, як кожен фактор "тримається" проти поглядів когось іншого.

Наприклад, чи Рубі об'єктивно "простіший", ніж Python? Простіше в якому сенсі? Щодо чого? Що для вас означає "простіше" ? Чи означає це "менше рядків коду"? Чи означає це "легше читати та розуміти"? А як щодо інших? Чому хтось повинен погодитися з яким-небудь конкретним вибором тут? Я не думаю, що ми можемо відповісти на це питання об'єктивно .

Це призводить до наступного питання.

На чому ґрунтуються ці критерії?

Наскільки розумними можуть бути деякі критерії, я вважаю, що це більше ґрунтується на суб'єктивних перевагах, ніж будь-що інше. Наприклад, немає жодної причини, чому я повинен просто приймати критерії Педро простоти , однозначності , портативності та галузевих уподобань - незалежно від того, наскільки розумно це може вважати. Насправді, галузева перевага суб'єктивна за визначенням і просто призведе до порочного кола. (Усі навчаються в ньому, тому кожен використовує його в промисловості, тому всі в ньому навчаються, ...)

Наприклад, чому б ні

  • Ефективність: фактично можна виміряти час виконання та слід пам'яті.
  • Розмір: Найменша кількість зарезервованих слів може полегшити вивчення мови.
  • Набір функцій: Більш широкий набір підтримуваних функцій (наприклад, лямбда, генерики, орієнтація на об’єкти, перевантаження оператора тощо) дозволить вам навчити більше понять без необхідності перемикання мов і повернення до квадратного.
  • Інтероперабельність: мова, яка спрощує роботу з іншими мовами та рідними системами (наприклад, API Win32 від C # або Python тощо), може бути використана як краща довгострокова інвестиція тощо.

Справа в тому, що, хоча я можу придумати інший набір оціночних критеріїв і все ще вважатись розумним, ми не можемо стверджувати, що він об'єктивно перевершує / поступається чужому.

На закінчення, немає об'єктивних підстав для критеріїв. Це так само довільно, як намагатися дебатувати, якщо блакитний є об'єктивно "кращим" кольором, ніж червоний, або якщо ванільне морозиво об'єктивно смачніше шоколадного.

Це не означає, що ви не можете мати вагомих причин, щоб виправдати свої вподобання, але в кінці дня - це лише ваші вподобання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.