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

66

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

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

Насколько важно знать, как кодировать в TCS (в областях, где программирование напрямую не задействовано): есть ли причины, которые могли бы заставить теоретика CC (например) знать, как программировать? Стоит ли тратить много времени на изучение кодирования? И если есть, есть ли категория (функциональная, императивная, объектно-ориентированная ...) языка программирования, которая была бы более подходящей?

Гопи
источник
12
Вы должны были запрограммировать некоторые из них, чтобы написать значимый, то есть определенный и отражающий время выполнения псевдокод. Математики часто не делают ни того, ни другого. Кроме того, если вы действительно хотите использовать разработанную вами теорию, скорее всего, вам придется что-то реализовать. Что касается языков, вам, вероятно, лучше изучать что-то функциональное. C хорош для производительности, но трудно рассуждать и запутан во многих аспектах. (Как видите, YMMW)
Рафаэль
6
Я согласен с «Математики часто не делают ни того, ни другого». Простой тест на то, действительно ли математик, описывающий алгоритм, когда-либо запрограммирован, состоит в том, чтобы спросить: «Что именно вы имеете в виду под« Данным Х ... »?»
Джефф
4
Программирование, что это? Теоремы - мои программы. Процедура приготовления отличается от кулинарного искусства. Извините, более 20 лет я не могу прочитать ни одного программного кода. На самом деле, я ненавижу этот беспорядок "на ПК". (Уже эта запись делает плохо.) Евклид не мог программировать. И все же он создавал программы на протяжении веков.
Стасис
6
@StasysJukna: Евклид был действительно очень дурацким программистом. Он не только никогда не реализовывал свои алгоритмы, он даже никогда не запускал их вручную в умеренно сложных тестовых случаях.
Джефф
3
@ Jɛ ff E: Да, Евклид был дурацким программистом, именно это я и хотел сказать. В TCS мы стремимся не проводить различий между кулинарными книгами и искусством взвода. Евклид мог. Я очень уважаю людей, которые могут программировать. Но я не думаю, что эта функция означает «один МОЖЕТ в TCS». Это просто не повредит.
Стасис

Ответы:

55

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

Во-первых, если вы разрабатываете алгоритмы для задач, имеющих практическое значение, реализация ваших алгоритмов и обеспечение доступности кода для других может стать большим плюсом. Например, проблема выпуклой оболочки возникает во многих областях, и люди используют пакеты программ, такие как cdd от Komei Fukuda и lrs от David Avis, для решения этой проблемы. Если бы они опубликовали свои алгоритмы только в статьях, вероятно, меньше людей использовали бы их алгоритмы. Чем больше пользователей, тем больше отзывов и, возможно, больше возможностей для сотрудничества, что бесценно.

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

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

Кстати, программирование тоже может быть веселым.

Цуёси Ито
источник
2
@SureshVenkat: На самом деле, если программирование доставляет удовольствие, вопрос «Насколько важно программирование?» Может быть не очень актуальным. Но тогда большая часть моего ответа станет неактуальной. Как грустно! :)
Tsuyoshi Ito
Я не думал о вашем втором аргументе прежде, действительно, кажется, действительно хорошая идея проверить гипотезу с короткой программой! Что касается программирования, может быть весело, так что кажется, но я еще не посмотрел все долгое обучение в выходные дни =).
Гопи
@Gopi: Тем не менее, многие гипотезы не вписываются в эту структуру «тест с простой программой». Например, мы обычно не можем проверить асимптотику (по крайней мере, с помощью простой программы). Но когда у вас есть гипотеза, которую можно проверить, небольшое программирование может стать мощным инструментом. Что касается веселья, да, я понимаю. Я просто не хотел игнорировать точку зрения «веселья», перечисляя лишь некоторые мотивы с точки зрения «полезности».
Tsuyoshi Ito
3
Заметки Кнута о классе решения проблем являются прекрасным примером взаимодействия между гипотезами и кодом (см. Задачу 1): www-cs-faculty.stanford.edu/~knuth/papers/cs1055.pdf (мне особенно нравится изображение кого-то ворвавшись в класс с кучей распечаток)
Суреш Венкат
47

Я чувствую себя обязанным процитировать Дорон Цейлбергер по этому поводу:

Мнение 37 : программирование еще веселее, чем доказывать, и, что еще важнее, дает столько, если не больше, понимание и понимание.

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

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

Кроме того, если вы будете работать над алгоритмами и структурами данных, программирование даст незаменимый взгляд на вопросы эффективности и удобства использования. Мое мнение здесь несколько отличается от других. Я думаю, что изучение функционального языка так, чтобы вы могли писать корректные шрифты, - это пустая трата времени (я думаю, это замечательно, что люди, имеющие опыт работы со строго типизированным языком, вероятно, склонны писать более тщательно структурированные доказательства; я просто не думаю, что стоит потратить время, чтобы пройти это упражнение Функциональное программирование скрывает проблемы разработки алгоритма и времени выполнения, а также подчеркивает проблемы логики и семантики (и, конечно, изучение функционального программирования, вероятно, является обязательным и придет несколько естественным образом, если вы заинтересованы в семантике логики / PL). По аналогии, Я думаю, что знакомство с деталями OO Java и C ++ также не является оптимальным способом тратить ваше время, так как цель OO - писать модульный код многократного использования. Это путь, если вы будете создавать код для использования другими. Но если вы хотите получить представление об эффективности и продолжительности работы, если вам нужны действительно эффективные алгоритмы и структуры данных, я подкрепляю вас предложением взглянуть на C. Это позволяет вам оставаться рядом с машиной, в то же время обеспечивая разумный уровень абстракции. , Таким образом, вы получаете представление о том, что быстро и что медленно, что такое разумная структура данных и т. Д. Но если вы хотите получить представление об эффективности и продолжительности работы, если вам нужны действительно эффективные алгоритмы и структуры данных, я подкрепляю вас предложением взглянуть на C. Это позволяет вам оставаться рядом с машиной, в то же время обеспечивая разумный уровень абстракции. , Таким образом, вы получаете представление о том, что быстро и что медленно, что такое разумная структура данных и т. Д. Но если вы хотите получить представление об эффективности и продолжительности работы, если вам нужны действительно эффективные алгоритмы и структуры данных, я подкрепляю вас предложением взглянуть на C. Это позволяет вам оставаться рядом с машиной, в то же время обеспечивая разумный уровень абстракции. , Таким образом, вы получаете представление о том, что быстро и что медленно, что такое разумная структура данных и т. Д.

Сашо Николов
источник
10
«Функциональное программирование скрывает проблемы разработки алгоритма и времени выполнения и подчеркивает проблемы логики и семантики». Боевые слова :)
Суреш Венкат
3
«Функциональное программирование скрывает проблемы разработки алгоритма и времени выполнения и подчеркивает проблемы логики и семантики». Вот почему это хороший выбор, если вы работаете на стороне логики или семантики TCS. :)
Раду GRIGore
5
Гм.
Джефф
3
@Sasho: Все обычные методы все еще работают на функциональных языках. Единственная «проблема» заключается в том, что функциональное программирование поощряет стиль программирования и конструирование структуры данных, с которыми обычные методы алгоритмического анализа недостаточно приспособлены для обработки. (Например, что такое big-O композиции функций? Операция тривиальна , но она полностью нарушает предположения об асимптотической сложности - не существует простой числовой метрики размера для функционального ввода.)
Нил Кришнасвами,
3
@SashoNikolov: Всякий раз, когда я преподаю выпускникам класс структур данных, я действительно очень хотел бы предположить, что у каждого был некоторый опыт функционального программирования. Вместо того чтобы провести три 90-минутных лекции, чтобы объяснить постоянство, я мог бы просто сказать: «Эй, вы заметили, что ваши структуры данных уже делают ЭТО?»
Джефф
33

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

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

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

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

Питер Шор
источник
2
Я вижу правду в вашем третьем абзаце :).
Гопи
1
«Однако для большинства людей обучение программированию не представляет особой сложности» - мой опыт побуждает меня не соглашаться с этим, но большинство людей не являются исследователями TCS.
Макс
2
С появлением Sage стало возможным работать с хорошим, популярным языком, таким как Python, и в то же время иметь в своем распоряжении математические библиотеки в стиле Mathematica / Maple / Matlab.
Андрас Саламон
1
C ++ имеет самую продвинутую систему типов / метапрограммирования из всех основных языков программирования общего назначения, которые я когда-либо видел, кроме семейства языков Lisp. Поэтому, если вы знакомы с теорией типов, языковым дизайном или теорией компиляторов, или, в более широком смысле, с формальной семантикой, вы можете ознакомиться с ней. В дополнение к C ++, Java и C # необходимы, если вы хотите заняться исследованиями в области экспериментальных компьютерных наук или надеетесь получить работу программиста или программиста в отрасли. Питон должен преподаваться в старших классах: D
Антонио Валерио Мицели-Бароне
4
@ AntonioValerioMiceli-Barone: Я должен не согласиться, по крайней мере, с теорией типов, дизайном языка, формальной семантикой и теорией языка программирования (PLT) в целом: C ++ не является языком для изучения в этих областях; TT и формальная семантика относятся почти исключительно к функциональному программированию, в то время как сообщество PL более разнообразно, но предпочитает языки более элегантные, чем C ++. Haskell - это «основной» язык с наиболее продвинутой системой типов, за которым следует Scala (менее продвинутый, немного более распространенный). У C ++ есть интересные особенности, но он слишком низок для современного вкуса.
Blaisorblade
33

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

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

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

Суреш Венкат
источник
Ваш ответ может помочь в вопросе об эмпирических результатах в TCS .
Гопи
возможно: но эта нить давно вымерла :)
Суреш Венкат
Действительно, я не смотрел дату, она была в последней полученной мной новостной рассылке, в разделе «Лучшие хиты предыдущих недель» =).
Гопи
18

Три очка:

1) Существует подход к математике, называемый экспериментальной математикой (см. Также wikipedia: // Автоматизированное доказательство ), где вы используете компьютерные программы для исследования шаблонов и структур объектов, чтобы придумать аналитические доказательства об этих объектах. Для этого подхода вы лучше знаете, как программировать. Вы можете быть уверены, что вам понадобится этот подход, чтобы доказать очень теоретические утверждения. Я считаю, что снобизм против программирования часто оказывается не очень полезным в исследованиях TCS.

AL(X,Y)BL(Y,C)

3) Когда вы говорите «программировать», вы также подразумеваете « линейную программу » или « полуопределенную программу »? :)

Алессандро Косентино
источник
2
Никто из тех, кого я знаю, не использует "программировать" для "линейной программы" или "для полуопределенной программы". Вы бы сказали «построить / решить линейную программу» вместо этого.
Питер Шор
2
@PeterShor Точка 3 не была серьезной
Алессандро Косентино
3
И, конечно, вы также должны научиться линейному программированию и полуопределенному программированию ... оба полезные навыки.
Питер Шор
3
+1 к пункту 2, меня фактически научили немного OCaml, когда я был старшекурсником, хотя я и использовал его только в течение одного года, я привык проверять типы моих доказательств.
Гопи
4
Я программирую динамически !
Джефф
16

Спасибо Гопи за этот вопрос. Я хотел бы расширить много интересных ответов в другом измерении, которые еще не были упомянуты.

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

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

Мартин Бергер
источник
«Если вам повезет, вам придется преподавать курсы, которые находятся довольно далеко от вашей области специализации». Это везение…?
Цуёси Ито
3
@ Tsuyoshi: Ну, это заставляет вас ознакомиться с новой предметной областью. В краткосрочной перспективе это означает большую работу (которая в долгосрочной перспективе амортизирует, так как вы, вероятно, будете учить этот материал не раз). В то же время он значительно расширяет ваши интеллектуальные горизонты.
Мартин Бергер
@TsuyoshiIto: Да!
Джефф
13

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

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

Что касается языка программирования, который нужно выучить: «все они» - мой (насмешливый) ответ.

Раду ГРИГОРЕ
источник
2
Наконец, аргумент против программирования :).
Гопи
1
@ Гопи, я думаю, что программирование может быть очень увлекательным и что лучшее понимание, которое ты получаешь, очень важно. Другие ответы дают отличные примеры того, как программирование помогает понять. Поэтому я бы посоветовал вам научиться программированию, а не сдаваться, если предприятие, похоже, не окупается быстро.
Раду GRIGore
6
Доказательство теорем - это также хороший способ улучшить ваше понимание различных концепций, но это также опасный прием времени.
Джефф
@ Jɛ ff E, мое мнение сохраняется подстановкой [псевдокод-> доказательство на бумаге, код-> доказательство в помощнике по проверке].
Раду GRIGore
12

Я опаздываю на вечеринку, и это все отличные ответы, но у меня есть другая причина:

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

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

Джон Мёллер
источник
3
Я знаю, как программировать, и я абсолютно безнадежен в визуализации. Я также подозреваю, что есть инструменты, которые позволят вам визуализировать вещи без особого программирования; если нет, то должно быть, и, возможно, будет через несколько лет.
Питер Шор
@PeterShor: Потому что вы не используете C ++! (Шучу)
Цуёси Ито
1
@PeterShor: я не имею в виду какой-либо конкретный язык или среду; MATLAB считает здесь. Но зная, как программировать, вы можете получить визуализации, которые в противном случае были бы невероятно неудобными. Например, пространство двумерных положительно определенных матриц трехмерное, и я хотел визуализировать семейство конструкций в этом пространстве. Мне нужно было придумать преобразование, а затем написать его, чтобы действительно увидеть мои объекты.
Джон Мёллер
@ Джон ... ты прав, я не думаю, что ты мог бы сделать это любым другим способом.
Питер Шор
7

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

Лев Рейзин
источник
Цуёси Ито написал аналогичный аргумент в своем ответе (второй пункт :)).
Гопи
Ой, ты прав - я пропустил это.
Лев Рейзин
5

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

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

Когда вы заканчиваете докторскую диссертацию, большинство рабочих мест для TCS в академических кругах. Если вы работаете в академической среде, от вас ожидают, что вы будете преподавать, и от вас могут ожидать, что вы будете преподавать на старшекурсном курсе CS, который будет скорее программированием, чем теорией. Даже если вы преподаете теоретический класс для старшекурсников, как, например, «Алгоритмы», вы можете ожидать, что ваши студенты будут знать больше о программировании, чем теории, и, не зная, что знают ваши студенты, вам будет трудно преодолеть пробелы в их понимании , Я содрогаюсь при мысли о том, что старшекурсников CS преподают те, кто не знает программирования!

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

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

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

отметка
источник
0

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

Сначала мне пришлось программировать в 10 классе (средняя школа), и я уже знал, как использовать командную строку, и это действительно помогло (это покажет вам, как «базовые» навыки программирования рассматриваются в CS).

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

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

  • Функциональное программирование ОЧЕНЬ ориентировано на математику, его сложнее изучать из-за необходимого математического фона, оно считается очень мощным (в своем «простом», математическом способе решения сложных задач элегантными и «чистыми» средствами).
  • Объектная ориентация хороша, когда вы не хотите понимать лежащие в основе алгоритмы и принципы реализации и просто хотите «повторно использовать» уже существующие объекты.

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

Кроме того, задача, которую стоит решить (чтобы быстро привыкнуть к среде программирования), заключается в установке и использовании Linux (подойдет Ubuntu Linux). Поверьте мне, вы многому научитесь, играя с ним ...

Эти советы - лучший способ наверстать упущенное для математика в области компьютерных наук. Кроме того, сообщество open source очень дружелюбно и полезно, и если вы застряли, IRC - это самый прямой способ поговорить на любую тему по специализированным каналам (подключитесь по FreeNode). Помните: спрашивать это единственный способ решить вопросы, будь то для себя, на форуме, в поисковой системе или в чатах.

Сэмюэл Дюкло
источник
4
Я не знаю, сколько вы отвечаете на первоначальный вопрос: я спрашивал не «как», а больше «зачем».
Гопи
0

Примером реализации C ++ интерактивной системы доказательства является следующая статья: Джастин Талер: оптимальные по времени интерактивные доказательства для оценки цепей. Он доступен по адресу http://people.seas.harvard.edu/~jthaler/ . Похоже, это шаг к цели разработки практической реализации интерактивных систем доказательства общего назначения.

Аналогичные документы и соответствующие исходные коды появляются на веб-сайте, упомянутом выше.

lgidwani
источник
3
Не могли бы вы объяснить, как этот документ связан с вопросом, т.е. насколько важно знать, как программировать для TCS ?
scaaahu
Даже если бы это был пример теоретического результата, который выиграл от программирования, он не ответил бы на первоначальный вопрос?
Джереми
Вопрос состоит в том, нужен ли теоретик сложности знания кодирования. В упомянутом выше документе явно используются экспериментальные результаты, дополняющие теоретические концепции; это требует кодирования. В любом случае, мне потребовалось очень много времени, чтобы найти проект программирования, который так тесно связан с центральной концепцией теоретической информатики. Я надеюсь, что этот пост может быть полезен для кого-то в аналогичном поиске.
lgidwani