Наскільки важливо знати, як програмувати для TCS?


66

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

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

Наскільки важливо знати, як кодувати TCS (у полях, де програмування не бере участь безпосередньо): чи є причини, які можуть привести теоретика CC (наприклад), щоб знати, як кодувати? Чи варто витрачати багато часу на вивчення кодування? І якщо є, чи є категорія (функціональна, імперативна, об'єктно-орієнтована ..) мова програмування, яка була б більше підходить?


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

6
Я погоджуюся з "Математики часто нічого не роблять". Простий тест на те, чи ніколи математик, що описує алгоритм, справді запрограмований, - це запитати "Що саме ви маєте на увазі під" Даним X ... "?"
Jeffε

4
Програмування, що це? Теореми - це мої програми. Процедура приготування їжі відрізняється від мистецтва приготування. На жаль, більше 20 років я не можу прочитати жодного програмного коду. Насправді, я ненавиджу цей «безладдя на ПК». (Вже ця нотація погана.) Евклід не міг програмувати. І все ж він робив програми протягом століть.
Стасіс

6
@StasysJukna: Евклід був насправді справді хитрим програмістом. Він не тільки ніколи не реалізовував свої алгоритми, він навіть не керував ними вручну по помірно складних тестових випадках.
Jeffε

3
@ Jɛ ff E: Так, Евклід був хитрим програмістом, саме це я хотів сказати. Ми, в TCS, прагнемо не розрізняти кулінарні книги та мистецтво коксування. Евклід міг. Я дуже поважаю людей, які можуть програмувати. Але я не думаю, що ця функція означає "один CAN в TCS". Це просто не зашкодить.
Стасіс

Відповіді:


55

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

По-перше, якщо ви розробляєте алгоритми для проблем, що мають практичне значення, реалізація алгоритмів та надання коду доступним для інших може бути великим плюсом. Наприклад, опукла оболонка проблема виникає в багатьох областях, і люди використовують програмні пакети , такі як CDD по Комому Фукуда і LRS Девід Avis , щоб вирішити цю проблему. Якби вони публікували свої алгоритми лише в роботах, напевно менше людей використовували б їх алгоритми. Більше користувачів означає більше відгуків і, можливо, також більше можливостей для співпраці, що неоціненно.

По-друге, навіть якщо ви не працюєте в алгоритмах, написання одноразового коду допоможе вам перевірити просту гіпотезу, коли гіпотеза підходить для чисельного обчислення. Наприклад, якщо вам цікаво, чи добуток із трьох позитивних визначених матриць завжди має позитивний слід, легко написати код, щоб перевірити його на деякі випадкові вибори з 2 × 2 або 3 × 3 позитивних певних матриць і знайти контрприклад. Хоча ви не рекламуєте, що ви написали будь-яку програму для тестування гіпотези, програмування може заощадити час, який марно витратили б, намагаючись довести помилкове твердження.

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

До речі, програмування теж може бути цікавим.


2
@SureshVenkat: Насправді, якщо програмування цікаве, питання "Наскільки важливе програмування?" Може бути не дуже актуальним. Але тоді більша частина моєї відповіді стане неактуальною. Як сумно! :)
Tsuyoshi Ito

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

@Gopi: З цього приводу, багато домислів не входять у цей «тест із простою програмою». Наприклад, ми зазвичай не можемо перевірити асимптотичну поведінку (принаймні, за допомогою простої програми). Але коли у вас є певна думка, яку можна перевірити, трохи програмування може стати потужним інструментом. Щодо розваги, так, я розумію. Я просто не хотів ігнорувати "веселу" точку зору, лише перераховуючи деякі мотивації з точки зору "корисності".
Цуйосі Іто

3
Примітки Кнута до класу вирішення проблем - чудовий приклад взаємодії гіпотез та коду (див. Проблему 1): www-cs-facturing.stanford.edu/~knuth/papers/cs1055.pdf (Особливо мені подобається образ когось мчає в клас з купою роздруківків)
Суреш Венкат

47

Я змушений цитувати Дорон Цайльбергер з цього приводу:

Думка 37 : Програмування є навіть веселішим, ніж доведення, і, що важливіше, воно дає стільки, якщо не більше, розуміння та розуміння.

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

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

Крім цього, якщо ви працюєте над алгоритмами та структурами даних, програмування дасть незамінну точку зору на питання ефективності та зручності використання. Моя думка тут дещо відрізняється від інших. Я думаю, що вивчення функціональної мови, щоб ви могли правильно писати докази, які правильно вводити, - це марна трата часу (я думаю, що це чудовий сенс, що люди, які мають досвід роботи з сильно набраною мовою, ймовірно, прагнуть писати більш ретельно структуровані докази; я просто не знаю я не думаю, що варто того, щоб пройти цю вправу). Функціональне програмування затьмарює питання проектування алгоритмів та часу роботи, підкреслює питання логіки та семантики (і, звичайно, вивчення функціонального програмування, мабуть, є обов'язковим і прийде дещо природно, якщо ви зацікавлені в семантиці логіки / PL). Аналогічно Я думаю, що потрапляння в деталі OO Java та C ++ також не є оптимальним способом витратити свій час, оскільки мета OO - написати модульний повторно використовуваний код. Це шлях, якщо ви будете створювати код для використання іншими. Але якщо ви хочете отримати уявлення про ефективність та час роботи, якщо ви дбаєте про дійсно ефективні алгоритми та структури даних, я повторюю пропозицію заглянути в C. Це дозволяє вам залишатися поруч із машиною, зберігаючи при цьому розумний рівень абстракції. . Таким чином ви відчуваєте, що швидко і що повільно, що є розумною структурою даних тощо. Але якщо ви хочете отримати уявлення про ефективність та час роботи, якщо ви дбаєте про дійсно ефективні алгоритми та структури даних, я повторюю пропозицію заглянути в C. Це дозволяє вам залишатися поруч із машиною, зберігаючи при цьому розумний рівень абстракції. . Таким чином ви відчуваєте, що швидко і що повільно, що є розумною структурою даних тощо. Але якщо ви хочете отримати уявлення про ефективність та час роботи, якщо ви дбаєте про дійсно ефективні алгоритми та структури даних, я повторюю пропозицію заглянути в C. Це дозволяє вам залишатися поруч із машиною, зберігаючи при цьому розумний рівень абстракції. . Таким чином ви відчуваєте, що швидко і що повільно, що є розумною структурою даних тощо.


10
"Функціональне програмування приховує питання розробки алгоритму та час роботи та підкреслює питання логіки та семантики". Бойові слова :)
Суреш Венкат

3
"Функціональне програмування приховує питання проектування алгоритму та часу роботи, а також наголошує на питаннях логіки та семантики." Ось чому це хороший вибір, якщо ви працюєте з логічної чи семантичної сторони TCS. :)
Radu GRIGо


3
@Sasho: Усі звичайні методи все ще працюють на функціональних мовах. Єдина «проблема» полягає в тому, що функціональне програмування заохочує стиль програмування та проектування структури даних, які звичайні методи алгоритмічного аналізу недостатньо оснащені для обробки. (Наприклад, яка велика О-функціональна композиція? Операція тривіальна , але вона повністю розбиває припущення про асимптотичну складність. Немає простої числової метрики розміру для функціонального вводу.)
Неель Кришнасвамі

3
@SashoNikolov: Кожного разу, коли я викладаю випускний клас структур даних, я дуже хочу, щоб я міг припустити, що кожен має якийсь функціональний досвід програмування. Замість того, щоб витратити три 90-хвилинні лекції для пояснення наполегливості, я міг би просто сказати "Ей, ви помітили, що ваші структури даних вже роблять це?"
Jeffε

33

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

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

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

Яку мову слід вивчити? Я б рекомендував об'єктно-орієнтовану мову, оскільки саме такі використовуються зараз, і я підозрюю, що це буде більш правдивим у майбутньому. Можливо, Python або Java - вони обидві об'єктно-орієнтовані мови, і хоча на практиці вони використовуються менше, ніж на C ++, моє враження, що вони обоє набагато набагато простіше вивчити. (Caveat: Я не знаю C ++, незважаючи на те, що працював у Bell Labs, тому, можливо, я помиляюся з цього приводу.)


2
Я бачу правду у вашому третьому абзаці :).
Гопі

1
"Однак для більшості людей навчитися програмувати не особливо складно" - мій досвід призводить до того, що я не згоден з цим, але більшість людей не є дослідниками ТКС.
Макс

2
З підйомом Sage можна працювати з приємною, популярною мовою на зразок Python, маючи все ще доступні математичні бібліотеки стилю Mathematica / Maple / Matlab.
Андраш Саламон

1
C ++ має найсучаснішу систему / метапрограмування будь-якої основної мови програмування загального призначення, яку я бачив, крім сімейства мов Lisp. Тож якщо ви займаєтеся теорією типів, мовою дизайну чи теорією компілятора, або в більш широкому плані - формальною семантикою, можливо, ви захочете ознайомитись з нею. На додаток до C ++, Java та C # є необхідними, якщо ви хочете займатися експериментальними комп'ютерними науками або сподіваєтесь влаштуватися на роботу програмістом чи інженером програмного забезпечення в галузі. Python слід викладати в середніх школах: D
Антоніо Валеріо Міцелі-Бароне

4
@ AntonioValerioMiceli-Barone: я, мабуть, не погоджуюся, принаймні щодо теорії типів, мовного дизайну, формальної семантики та теорії мов програмування (PLT) загалом: C ++ не є мовою для вивчення цих напрямків; TT та формальна семантика стосуються майже виключно функціонального програмування, тоді як спільнота PL є більш різноманітною, але віддає перевагу мовам більш елегантним, ніж C ++. Haskell - це "мейнстрім" з найсучаснішою системою типу, за нею йде Scala (менш розвинена, трохи більш мейнстрім). C ++ має цікаві функції, але занадто низький рівень для сучасного смаку.
Blaisorblade

33

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

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

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


Ваша відповідь може допомогти на запитання про емпіричні результати в TCS .
Гопі

Можливо: але ця нитка давно вимерла :)
Суреш Венкат

Дійсно, я не дивився на дату, це було в останньому бюлетені, який я отримав, у розділі "Найбільші звернення за попередні тижні" =).
Гопі

18

Три бали:

1) Існує підхід до математики, який називається Експериментальна математика (див. Також вікіпедію: // Комп'ютерне підтвердження ), де ви використовуєте комп'ютерні програми для дослідження закономірностей і структур об'єктів, щоб знайти аналітичні докази щодо цих об'єктів. Для цього підходу ви краще вмієте програмувати. Ви можете бути впевнені, що опинитесь у потребі такого підходу, щоб довести дуже теоретичні твердження. Я вважаю, що снобізм проти програмування часто виявляється не дуже корисним у дослідженнях TCS.

2) Коли ви навчитеся програмувати, як побічні продукти ви засвоюєте навички, корисні в TCS. Перший приклад: я з’ясував, що люди з фоном кодування схильні перевіряти свої докази більше. Ще краще, вони схильні дуже часто визначати тип об'єктів, які вони розглядають (напр .: "давайте розглянемо оператори і )". Це добре для читачів рукопису. Укладачі (та перекладачі) перетворюють нас на добрих науковців :) Для такого роду навичок я хочу запропонувати якусь сильно набрану функціональну мову.B L ( Y , C )AL(X,Y)BL(Y,C)

3) Якщо ви говорите "програмувати", ви також маєте на увазі " лінійну програму " чи " напіввизначену програму "? :)


2
Ніхто, кого я знаю, не використовує "програмувати" для "лінійної програми" або "для напіввизначеної програми". Ви б сказали "побудувати / вирішити лінійну програму".
Петро Шор

2
Точка 3 @PeterShor була несерйозною
Алессандро Косентіно

3
І звичайно, ви також повинні навчитися лінійній програмі та напіввизначеній програмі ... і корисним навичкам.
Петро Шор

3
+1 для пункту 2, мене фактично навчали трохи OCaml, коли я був малогранником, хоча я використовував його лише один рік, я взяв звичку перевіряти типи моїх доказів.
Гопі

4
Я програмую динамічно !
Jeffε

16

Дякую Гопі за це запитання. Я хотів би розповісти про багато цікавих відповідей в іншому вимірі, про який ще не було сказано.

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

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


"Якщо вам пощастить, вам доведеться викладати курси, які знаходяться далеко від вашої області спеціалізації".
Цуйоші Іто

3
@ Tsuyoshi: Ну, це змушує вас ознайомитися з новою предметною областю. У короткостроковій перспективі це означає багато роботи (яка амортизується в довгостроковій перспективі, оскільки ви, ймовірно, будете викладати цей матеріал не один раз). Водночас це значно розширює ваш інтелектуальний кругозір.
Мартін Бергер

@TsuyoshiIto: Так!
Jeffε

13

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

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

Щодо мови програмування, яку слід вивчити: "усі вони" - це моя відповідь.


2
Нарешті аргумент проти програмування :).
Гопі

1
@Gopi, я думаю, що програмування може бути дуже цікавим і що краще розуміння, яке ви отримуєте, дуже важливе. Інші відповіді дають чудові приклади того, як програмування допомагає зрозуміти. Тож я б закликав вас вивчати програмування, а не здаватися, якщо підприємство, здається, не швидко окупиться.
Radu GRIGо

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

@ Jɛ ff E, моя думка зберігається підстановкою [псевдокод-> доказ на папері, код-> доказ у асистенті з доказування].
Раду ГРИГо

12

Я спізнююсь на вечірку, і це все чудові відповіді, але у мене є ще одна причина:

Візуалізація.

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


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

@PeterShor: Тому що ви не використовуєте C ++! (Просто жартує)
Цуйосі Іто

1
@PeterShor: я не маю на увазі якусь конкретну мову чи середовище; MATLAB нараховує тут. Але вміння програмувати може отримати вам візуалізації, які інакше були б неймовірно незручними. Наприклад, простір двовимірних позитивно-визначених матриць є тривимірним, і я хотів візуалізувати сімейство конструкцій у цьому просторі. Мені довелося придумати перетворення, а потім зашифрувати його, щоб дійсно побачити мої об’єкти.
Джон Моеллер

@John ... ти маєш рацію, я не думаю, що ти міг би це зробити інакше.
Пітер Шор

7

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


Цуйосі Іто написав подібний аргумент у своїй відповіді (другий пункт :)).
Гопі

На жаль, ви праві - я пропустив це.
Лев Рейзін

5

Ніхто тут не займався практичними питаннями, чому хтось, хто вивчає TCS, повинен вчитися програмуванню.

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

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

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

Я рекомендую вивчити C (не C ++). Візьміть копію K&R та прочитайте її спереду. У C не так багато фантазійних особливостей сучасних мов, але він має простий, але елегантний синтаксис та семантику, які ви повинні мати можливість вивчити в повному обсязі. Однак, навіть коли ви розумієте мову в цілому, все одно потрібна практика освоєння написання хорошого елегантного коду без помилок у C. Тим не менш, якщо ви зможете освоїти кодування в C, ви зможете опанувати будь-яку мову програмування, з якою ви стикаєтеся. Крім того, ця дисципліна допоможе вам подумати, як думає обладнання, що буде корисно при розробці алгоритмів.

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


0

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

Мені довелося програмувати в 10 класі (середній школі), і я вже знав, як використовувати командний рядок, і це дійсно допомогло (це показати вам, як в CS розглядаються "основні" навички програмування).

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

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

  • Функціональне програмування ДУЖЕ орієнтоване на математику, вважається важче навчитися необхідному математичному фону, вважається дуже потужним (своїм "простим", математичним способом вирішення важких завдань за допомогою елегантних та "чистих" засобів).
  • Орієнтація на об'єкти хороша, коли ви не хочете розуміти основні алгоритми та принципи реалізації та просто хочете "повторно використовувати" вже існуючі об'єкти.

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

Також проблемою, яку варто вирішити (швидко звикнути руки до програмного середовища), буде встановити та використовувати Linux (це зробить Ubuntu Linux). Повірте, ви багато чого навчитесь, граючи з ним ...

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


4
Я не знаю, наскільки ви відповідаєте на початкове запитання: я не запитував "як це зробити", а більше "для чого".
Гопі

0

Прикладом впровадження інтерактивної системи доказування C ++ є наступний документ: Інтерактивні докази для оцінки ланцюга, оптимальні за часом, Джастін Талер. Він доступний на веб-сайті http://people.seas.harvard.edu/~jthaler/ . Схоже, це є кроком до мети розробки практичної реалізації інтерактивних систем загального призначення.

Подібні документи та пов'язані з ними вихідні коди з’являються на згаданому вище веб-сайті.


3
Чи пояснюєте ви, як ця стаття пов'язана з питанням, тобто наскільки важливо знати, як програмувати для TCS ?
scaaahu

Навіть якби це був приклад теоретичного результату, який виграв від програмування, він не відповів би на початкове запитання?
Джеремі

Питання задає питання, чи є необхідність теоретика складності, щоб знати кодування. У вищезгаданій роботі чітко використовуються експериментальні результати для доповнення теоретичних концепцій; для цього потрібно кодування. У будь-якому випадку мені знадобилося дуже багато часу, щоб знайти проект програмування, який так тісно пов'язаний з центральною концепцією теоретичної інформатики. Сподіваюся, ця публікація може бути корисною для когось із подібного пошуку.
lgidwani
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.