Яким мовам програмування повинен навчати кожного студента з інформатики?


13

Якими мовами (або класами (як у парадигмах) мов програмування, а також рекомендованою мовою цього класу) слід навчати кожного студента інформатики у коледжі відповідно до вас? Мотивуйте свої відповіді; чому ця мова? Яку користь матиме від цього? Яким поняттям вчить (краще, ніж мова X)?

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


13
Псуедо-код повинен бути достатнім для CS.
Черга Jé

12
@Xepoch - не згоден. Не особливо природно виражати семантику оцінювання нетерплячих та ледачих оцінок, коваріації / протиріччя в підписах типів, теорії категорій тощо за допомогою псевдокоду. Псевдо-код чудово підходить для опису алгоритмів та структур даних, але CS є набагато більше, ніж це.
Айдан Каллі

6
Більше того, переважна більшість студентів з КС сподіваються отримати позаакадемічну роботу після закінчення навчання. Псевдо-код не буде коштувати багато на конкурентному ринку праці. Я не думаю, що ступінь CS повинен в першу чергу проходити навчання на роботі, але він повинен зробити певне розміщення в цьому напрямку.
Адам Кросленд

2
ВСЕ ЇХ . Якщо час обмежений, починайте букви алфавіту. A +, B, C, C #, D, E, F #, J, K, Q, R, T ... Це насправді не поганий список.
Джессі Мілікан

6
Вітаємо, що відкрили ще одну версію "Якої мови?" питання. Я не можу зачекати, щоб прочитати всі думки. Не забувайте посилання на SICP. О, зачекайте, ось воно.
Корбін березня

Відповіді:


21

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

  • Асамблея (відносно простий діалект): Важливо зрозуміти хоча б трохи основ
  • С: Процедурна мова, що використовується в багатьох місцях. Не обтяжує нових студентів абсолютно новими поняттями, такими як OOD.
  • Java / C # / Eiffel / C ++: Щось орієнтоване на об'єкти - це добре, будь-яка з них здійснить мету навчити студентів OOD, і коли вони зрозуміють одну з цих мов, вони зможуть вивчити інші. Є багато гарні мови, я перерахував Ейфель, тому що він також має дизайн за контрактом.
  • LISP та Prolog: навчає студентів абсолютно новий спосіб думати, що є немислимим, навіть якщо вони ніколи не використовують жодного з них «у реальному світі».
  • SQL та XML: представлені нові способи продумати дані та способи їх отримання та управління ними.

Студенти повинні хоча б зазнавати всіх цих парадигм . Не лише один чи два.

Я думаю, що багато людей запропонують Python висвітлити процедурний стиль, стиль OOP та, можливо, інші, але у мене недостатньо особистого досвіду роботи з Python, щоб можна було впевнено рекомендувати його.


Я дуже хотів би, щоб моя школа детальніше розглядала XML та SQL, у нас був один клас, який входив у обидва, і це було terribad.

я додав би сучасні динамічні мови, такі як Lua, Python, Javascript тощо
Хав'єр

4
ах, а також такі хардкор-функціонали, як haskell та erlang - дуже навчальні
Хав'єр

1
+1 для включення до списку SQL. Принаймні, ви думаєте про реляційну алгебру.
Черга Jé

1
Я б також відокремив керований від некерованого OO, C ++ та Java. Хоча я ніколи не використовував C ++ з uni, не дізнавшись про malloc, купу і стек, ви ніколи не будете так добре розуміти ОО.
markmnl

45

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


2
+1 Мій клас мов програмування був легко найціннішим класом, який я взяв.
HappyCodeMonkey

1
Як студент ІТ я безумовно згоден. Я маю перевагу працювати повним робочим часом у реальному світі, поки я навчаюся в школі, як молодший розробник веб-додатків, але я відчуваю, що навіть якби я пішов з повноцінним ступенем CS, я б пропустив багато висвітлення різних парадигми.
Кен

1
Дещо пов’язане з цим: youtube.com/watch?v=Ps8jOj7diA0 У Стенфорді є цілі лекції з програмування Paradigms 2008 на YouTube.
Inaimathi

4
Додати декларативний до списку (Prolog). Також деякі мови явно паралельні (Occam). Навчити учнів, як працює паралелізм, було б добре (ніхто не виправить це правильно).
Мартін Йорк

1
@Martin York: Prolog - це мова логічного програмування, яка є декларативною мовою. (Я згадую про це, оскільки функціональні мови програмування також є декларативними, загалом кажучи.)
mipadi

33

Я думаю, що добре збалансований студент CS повинен викладати мову в кожному з 4 типів мови програмування:

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

Об'єктно-орієнтована - Виберіть свій вибір. C # / Java / Python / Ruby / yadda yadda yadda. Цього типу потрібно навчати просто тому, що саме цього хоче сучасний бізнес.

Імператив - C / Fortran / Pascal. Вони рідше зустрічаються в ці дні, але їх все ж слід вивчити з практичної / історичної точки зору. Методи, якими вони користуються, досі практичні, оскільки в кожній мові все зводиться до інструкції. І загальномовні мови дуже хороші в переліку та дотриманні інструкцій.

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


6
Ви можете додати прототипи до цього списку - наприклад, JavaScript.
стусміт

@stusmith - Прототипичні варто згадати, але це дійсно підмножина об'єктно-орієнтованих мов, а JavaScript у кращому випадку є обмеженим прикладом. Я вважаю це, можливо, домашнім завданням з курсу мов програмування, але не фокусом.
Джоель Етертон

1
+1 для Prolog. Я бачив його практичне використання і регулярно використовую прототипи алгоритмів.
Фред Фоо

@larsmans - Мені буде цікаво дізнатися про ваше використання цього. Я не торкався її вже кілька років, тому я нечітко розуміюсь на хороших практичних програмах. Чи є у вас посилання на газети та подібні статті?
Джоел Етертон

Ознайомтеся з ECLiPSe ( eclipseclp.org ), діалектом з відкритим кодом Prolog, який промислово використовується декількома великими європейськими компаніями (на французьку залізничну компанію SNCF, якщо я правильно пам'ятаю; спробую знайти посилання).
Фред Фоо

6

Мова №1, яку повинен знати кожен випускник КС, є тією, яка максимізує свій потенціал для виходу на чудову роботу. Це зміниться з часом, воно зміниться, виходячи з визначення індивідуальної роботи про велику роботу , і залежатиме від географічного регіону.

На даний момент я скажу, що англійська мова є мовою №1, яку повинен знати кожен основний CS (це, звичайно, залежить від регіону.)


Чудова робота - це побічна дія ступеня CS. Ступінь CS - це саме те, що знає теорія обчислень. Я міг легко отримати кращу роботу в професійно-технічному навчанні замість того, щоб забивати голову з математики та КЗ за всі ці роки.
Черга Jé

2
+1 для англійської. Комп'ютерні мови - це деталі реалізації.
Wyatt Barnett

+1. Якщо хтось може добре вивчити англійську (-ю) мову, він може добре вивчити посібники. Я добре знав англійську. У мене не було проблем з вивченням будь-якої мови.
Шиплу Мокаддім

4

Я думаю, що це змінюється з часом, але в ідеалі - 3 мови з 3 дуже різних точок зору. У мої дні це були процедурні, OO та функціональні - Pascal, C ++ та LISP. Я не так продається на цих трьох. Але під час інтерв'ю я шукаю:

  • Деякий рівень досвіду роботи з мовою, де потрібно звернути увагу на управління пам'яттю (C / C ++ та багато інших)
  • Певний рівень досвіду роботи з об'єктно-орієнтованою мовою з очікуванням на використання API та різних доступних абстракцій (C ++ / Java)
  • Мова "розтягування" - щось дивне, важке та складне. Я не збираюся наймати, тому що хтось знає LISP, збірку чи якусь іншу складну мову, але я хочу побачити, що інженер зіткнувся з якоюсь проблемою, яка стосувалася серйозного вирішення проблем і безлічі "що за чорт це?" моменти.

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


4

Для студента CS шукайте мови програмування, які чітко відображені до CS-концепцій, про які йде мова. Я б запропонував:

  • Схема, щоб краще зрозуміти лямбдальне числення
  • Ерланг, щоб зрозуміти модель актора
  • Пролог для систем предикатів логіки та доказів
  • Haskell, для теорії типів / категорій, і тому, що лінива оцінка так повно виражена в мові
  • принаймні одну мову асемблера - якщо ви хочете порахувати її під цим банером, я б також переклав мову байтового коду, наприклад, байт-коди Java або CLR та ІК LLVM
  • ймовірно, апаратне визначення мови, наприклад Verilog або VHDL
  • Зубр для компіляторно-будівельного класу
  • щось із системою динамічного типу (на розум приходить Рубі) ...

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


3

yacc

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


2

Lisp (з CLOS для OOP) та Haskell. Це питання не обмежується студентами. Нові модні програми програмування запозичили (скопіювали, вкрали? ... ні, це не погано) багато функцій у цих двох. Ви можете підготуватися до майбутнього. Сьогодні важливіше функціональне програмування (стиль), яке впроваджується в таких імперативних мовах програмування, як C # (LINQ) або C ++ (лямбда) та багато інших. Дуже погано, що деякі студенти вивчають лише Java.


1
Хоча я погоджуюся з обома ними, ви, можливо, захочете викласти деякі міркування (також зазначу, що не було б особливо корисно знати їх як свої єдині мови).
Inaimathi

2

Я думаю, мова не так важлива, як люди вірять.

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

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

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


2

ЧИ МОЖЕ ВЗАЄМО?

Зазвичай свербіж, що стоїть за цим питанням, - "Які голосні слова я можу скласти у своєму резюме, яке стане для мене найбільш прибутковим / цікавим / складним / легким завданням?" Хоча питання має свої достоїнства, оскільки більшість резюме вперше оглядаються HR-людьми, які не розуміють того, що шукають. але це дуже неглибоко, як тільки ви пройшли ворота, вам потрібно доставити товар.

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

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

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

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

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

№1 дасть вам засоби для втілення ідей у ​​справжні робочі системи, але без 2 ваші системи будуть схильні до ракових безформних монстрів.


Так, це має значення. Перша мова, яку ви вивчаєте, формує ваш мозок щодо того, як ви будете дивитися на майбутні мови.

1

Я вважаю, ви частково самі відповіли на своє запитання.

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

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

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

OOP: .NET або Java

Принаймні 1 додаткова парадигма програмування, щоб ознайомити студента з іншими підходами.

Функціонал: Лисп?


функціональний, ні, будь ласка, не LISP. скоріше: haskell
mariotomo

1

Мова складання та мікрокод. Студент CS повинен розуміти всі основні шари абстрагування між булевими державними машинами та найновішими функціоналами високого рівня / OOP / тощо. парадигма мови програмування.

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

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


І C, так що ви розумієте 90% всього відкритого коду, який ви можете вивчити.
праворуч

1

Вибір 3-х і більше мов з різних парадигм не так вже й важкий, було дано багато хороших відповідей. Але якби мені довелося вибирати лише одну мову, я б пішов на Scala, оскільки вона функціонально і об'єктно орієнтована. Ви можете пояснити та порівняти різні підходи в межах однієї мови.


1

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

Класична мова - це Forth , але в наші дні я переживаю "Фактор" . Також варто перевірити Радість та Кішку . Не пропустіть конкітативну мову вікі . Це веселіше, ніж мішок, повний молотків!


0

Щось функціональне, Haskell чи Lisp були б моїм першим вибором, але, можливо, Ерланг. Функціональні мови дійсно вчать вас будувати абстракції дуже потужно.


Але чи слід обмежуватись студентами однією парадигмою? Що з функціональними мовами OOP на зразок Scala?
Анто

1
Ні, звичайно, ні, я припускав, що інші люди підкоряться цим!
Захарій К

0

Незважаючи на відсутність мейнстріму, я вважаю, що D, спеціально версія 2, дає цікаві уроки, які не можна легко вивчити в іншому місці. Це робить більш серйозну спробу, ніж будь-яка інша мова, про яку я можу подумати, щоб отримати імперативне / процедурне, об'єктно-орієнтоване та функціональне програмування, щоб грати добре один з одним і дозволити програмування на дуже низькому рівні (покажчики, ручне управління пам’яттю, вбудований асемблерна мова) і дуже високий рівень (загальне та генеративне програмування) однією і тією ж мовою.

Це цінно тим, що замість того, щоб парадигми бачити окремо так, ніби вони існували в різних всесвітах, ви можете побачити ліс через дерева. Ви зможете побачити сильні та слабкі сторони кожної парадигми на тонкому рівні, коли ви їх змішуєте у свої програми. Ви дізнаєтесь, як основні аспекти парадигм можуть бути реалізовані в бібліотеках з точки зору коду нижчого рівня. Стандартний модуль бібліотеки std.algorithm реалізує важливі функціональні примітиви програмування, але це прямий простий код D без магії. Аналогічно std.rangeреалізує ледачу оцінку, але знову ж таки досить простий код D. Ви розумієте витрати, пов'язані з примітивами кожної парадигми, тому що близькі до металу функції D роблять те, що дійсно відбувається під капотом, відносно прозорим. Ви навіть можете написати щось низького рівня, схоже на C, а потім створити гарний, високорівневий інтерфейс до нього, тією ж мовою, що ніяких магічних шарів клею не заважає.


0

Псевдокод.

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

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

редагувати: Ця відповідь частково мотивована нездатністю деяких програмістів написати псевдокод.

"Просто запишіть алгоритм у псевдокоді"

"Що це?"

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


Багато мов програмування досить потужні, що між фактичним кодом та псевдо-кодом є невелика різниця. Які синтаксичні елементи фактичних мов програмування ви заперечуєте?
кевін клайн

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

0

C.

  • Перш за все, він все ще використовується (широко використовується!), І не тільки для ядер. Наразі я підтримую діловий додаток, кодований у C. Отже, навіть із чистим та простим C, ви все одно можете влаштуватися на роботу. У великих компаніях, у промисловості майже скрізь (але у веб-розробниках).
  • Якщо ви збираєтеся працювати в середовищі Unix / Linux, не знати хоч трохи C - це схоже на покупки і не в змозі читати ціни на тегах.
  • Покажчики! Усі повинні розуміти покажчики (пор. Йоель Спольський ). Крім того, щойно ви схопили концепцію malloc, ви точно знаєте, які речі трапляються, коли ви недбало вводите "нове" в багаж OOP.
  • Більшість синтаксисів «популярних мов» походить від C.
  • Так, це не завжди зрозуміло. Так, навчитися важко. Так, струни - дещо кошмар для початківців. Але програмування не завжди зрозуміле і його важко засвоїти, і ви дійсно зрозумієте, що чудово в OOP, коли після вивчення C ви спробуєте C ++ і виявите std :: string.

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


0

Деякі з мов програмування, які застосовуються для набуття загальних навичок вирішення проблем, та концепції програмування - «Лого» та «Карел», їх слід викладати перед C / C ++ / Java / Lisp / PERL / Assembly / будь-якою парадигмою програмування.

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


-1

Що-небудь з предметами. Просто переконайтесь, що вони це добре засвоїли.

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

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