Исходя из более математического фона, я так и не научился писать код. Я начинаю докторскую диссертацию в TCS, и многие были удивлены тем, как мало я знал о программировании (и о компьютере в целом). Я могу писать алгоритмы в псевдокоде, но я не знаю языка программирования.
Я могу себе представить, что когда-нибудь мне придется реализовать некоторые алгоритмы для своей работы, но тогда я могу подождать этого момента? Или есть что-то еще?
Насколько важно знать, как кодировать в TCS (в областях, где программирование напрямую не задействовано): есть ли причины, которые могли бы заставить теоретика CC (например) знать, как программировать? Стоит ли тратить много времени на изучение кодирования? И если есть, есть ли категория (функциональная, императивная, объектно-ориентированная ...) языка программирования, которая была бы более подходящей?
Ответы:
Теоретическая информатика является широкой областью, и важность программирования зависит от того, что вы делаете в TCS. Я упомяну два способа, которыми программирование может вам помочь, не подразумевая, что это единственные способы.
Во-первых, если вы разрабатываете алгоритмы для задач, имеющих практическое значение, реализация ваших алгоритмов и обеспечение доступности кода для других может стать большим плюсом. Например, проблема выпуклой оболочки возникает во многих областях, и люди используют пакеты программ, такие как cdd от Komei Fukuda и lrs от David Avis, для решения этой проблемы. Если бы они опубликовали свои алгоритмы только в статьях, вероятно, меньше людей использовали бы их алгоритмы. Чем больше пользователей, тем больше отзывов и, возможно, больше возможностей для сотрудничества, что бесценно.
Во-вторых, даже если вы не работаете в алгоритмах, написание одноразового кода поможет вам проверить простую гипотезу, когда эта гипотеза подходит для численного расчета. Например, если вам интересно, всегда ли произведение трех положительно определенных матриц имеет положительный след, легко написать код, чтобы проверить его на случайный выбор из 2 × 2 или 3 × 3 положительно определенных матриц и найти контрпример. Хотя вы не рекламируете, что написали какую-либо программу для проверки гипотезы, программирование может сэкономить время, которое было бы потрачено впустую, пытаясь доказать ложное утверждение.
Выбор языка программирования зависит от того, что вы хотите сделать с программированием, и, на мой взгляд, он может стать темой для целой книги. Но если вы разрабатываете алгоритмы и хотите реализовать свои алгоритмы, чтобы другие люди могли использовать реализацию, то одним из важных факторов является доступность. Хотя вы можете ожидать, что большинство потенциальных пользователей вашего кода имеют доступ к компилятору C, вы не можете ожидать, что одни и те же люди имеют доступ к компилятору Haskell. Для одноразовых программ выбор больше зависит от доступных библиотек и включает такие среды, как Matlab.
Кстати, программирование тоже может быть веселым.
источник
Я чувствую себя обязанным процитировать Дорон Цейлбергер по этому поводу:
Мнение 37 : программирование еще веселее, чем доказывать, и, что еще важнее, дает столько, если не больше, понимание и понимание.
Прочитайте мнение, это полно драгоценных камней (кстати, он имеет тенденцию быть преднамеренно провокационным). Например, «Лучший способ понять что-то - это научить этому. Но даже лучше, чем научить людей, - это научить этому компьютер».
Мой личный опыт показывает, что даже при чисто теоретической работе вам понадобятся некоторые вычислительные инструменты. Я избегаю множества утомительных рутинных алгебраических манипуляций с Mathematica. Я проверяю свои недоделанные домыслы, перебивая маленькие экземпляры на Matlab или Python. Я соавтором одной статьи - чистой комбинаторики, и эта работа больше всего выиграла от проведения обширных компьютерных экспериментов, чтобы понять, что происходит. Эйлер сделал огромные таблицы утомительных расчетов, чтобы понять проблемы. Мы обязаны ему использовать наши инструменты для автоматизации этого процесса, когда мы занимаемся математикой.
Кроме того, если вы будете работать над алгоритмами и структурами данных, программирование даст незаменимый взгляд на вопросы эффективности и удобства использования. Мое мнение здесь несколько отличается от других. Я думаю, что изучение функционального языка так, чтобы вы могли писать корректные шрифты, - это пустая трата времени (я думаю, это замечательно, что люди, имеющие опыт работы со строго типизированным языком, вероятно, склонны писать более тщательно структурированные доказательства; я просто не думаю, что стоит потратить время, чтобы пройти это упражнение Функциональное программирование скрывает проблемы разработки алгоритма и времени выполнения, а также подчеркивает проблемы логики и семантики (и, конечно, изучение функционального программирования, вероятно, является обязательным и придет несколько естественным образом, если вы заинтересованы в семантике логики / PL). По аналогии, Я думаю, что знакомство с деталями OO Java и C ++ также не является оптимальным способом тратить ваше время, так как цель OO - писать модульный код многократного использования. Это путь, если вы будете создавать код для использования другими. Но если вы хотите получить представление об эффективности и продолжительности работы, если вам нужны действительно эффективные алгоритмы и структуры данных, я подкрепляю вас предложением взглянуть на C. Это позволяет вам оставаться рядом с машиной, в то же время обеспечивая разумный уровень абстракции. , Таким образом, вы получаете представление о том, что быстро и что медленно, что такое разумная структура данных и т. Д. Но если вы хотите получить представление об эффективности и продолжительности работы, если вам нужны действительно эффективные алгоритмы и структуры данных, я подкрепляю вас предложением взглянуть на C. Это позволяет вам оставаться рядом с машиной, в то же время обеспечивая разумный уровень абстракции. , Таким образом, вы получаете представление о том, что быстро и что медленно, что такое разумная структура данных и т. Д. Но если вы хотите получить представление об эффективности и продолжительности работы, если вам нужны действительно эффективные алгоритмы и структуры данных, я подкрепляю вас предложением взглянуть на C. Это позволяет вам оставаться рядом с машиной, в то же время обеспечивая разумный уровень абстракции. , Таким образом, вы получаете представление о том, что быстро и что медленно, что такое разумная структура данных и т. Д.
источник
Вы можете быть довольно успешным теоретиком-программистом без программирования. Для некоторых людей программирование довольно сложно, и если вы один из них, не стоит отчаиваться и менять поля.
Однако для большинства аспирантов по математике и информатике обучение программированию не представляет особой сложности и является очень полезным навыком. Вы должны выучить язык программирования, и если вам это нравится, вы должны попытаться получить достаточно практики, чтобы стать достаточно опытным в этом. Затем, когда придет момент (и он будет), что в ваших исследованиях будет полезно написать программу, вы сможете это сделать.
Если вы не научитесь программировать сейчас, вполне вероятно, что когда вам в конце концов понадобится написать программу, у вас не будет времени на обучение, и поэтому вы можете не написать ее, и в итоге вы будете менее эффективны в своей области. исследовательская работа. Хотя заставить аспиранта или старшекурсника сделать это для вас не так уж и сложно, во многих случаях гораздо проще и менее затратно сделать это самостоятельно, чем объяснить им проблему.
Какой язык вы должны выучить? Я бы порекомендовал объектно-ориентированный язык, так как это те, которые в настоящее время используются чаще всего, и я подозреваю, что это будет более верно в будущем. Может быть, Python или Java - оба они являются объектно-ориентированными языками, и хотя они на практике используются реже, чем C ++, у меня сложилось впечатление, что они оба намного, намного проще в изучении. (Предостережение: я не знаю C ++, несмотря на то, что работал в Bell Labs, поэтому, возможно, я ошибаюсь по этому поводу.)
источник
Есть еще один ответ, который никто еще не выдвинул. Программирование может привести к интересной теории. Многие недавние разработки в области хэширования (особенно хэширования таблиц) мотивированы не теоретическими соображениями как таковыми, а тем, что теоретически оптимальные алгоритмы не так уж хороши на практике. Это, конечно, то, что вы не знаете, если не можете написать код.
Даже в сфере алгоритмов с точным экспоненциальным временем мотивация создает алгоритмы, которые действительно могут работать. SAT решатели являются каноническим примером этого.
Короче говоря, способность кодировать позволяет вам осознать недостатки и слабости в том, что может выглядеть как оптимальные теоретические результаты, и это, в свою очередь, открывает новые теоретические направления исследований.
источник
Три очка:
1) Существует подход к математике, называемый экспериментальной математикой (см. Также wikipedia: // Автоматизированное доказательство ), где вы используете компьютерные программы для исследования шаблонов и структур объектов, чтобы придумать аналитические доказательства об этих объектах. Для этого подхода вы лучше знаете, как программировать. Вы можете быть уверены, что вам понадобится этот подход, чтобы доказать очень теоретические утверждения. Я считаю, что снобизм против программирования часто оказывается не очень полезным в исследованиях TCS.
3) Когда вы говорите «программировать», вы также подразумеваете « линейную программу » или « полуопределенную программу »? :)
источник
Спасибо Гопи за этот вопрос. Я хотел бы расширить много интересных ответов в другом измерении, которые еще не были упомянуты.
Исследования - это не единственное, что мы делаем в университете: если вы хотите остаться в академической среде, вам в конечном итоге придется преподавать. Если вам повезет, вам придется преподавать курсы, которые находятся довольно далеко от вашей области специализации. Вполне вероятно, вам будут назначены курсы с существенным компонентом программирования. Вот где даже умеренная способность к программированию существенно помогает: вы будете намного лучше учителем, если знаете, как программировать. Прежде всего, вам будет удобнее работать с материалом, вы сможете лучше отвечать на вопросы учащихся и понимаете трудности, с которыми сталкиваются студенты при обучении программированию, поскольку вы сами испытали этот процесс обучения. Кроме того, вы можете создавать лучшие учебные материалы. Например, вы можете сами проверить упражнения по программированию, прежде чем давать их студентам,
Существует еще одно прагматическое измерение: обучение включает в себя различные повторяющиеся задачи, которые опытный программист часто может автоматизировать, например быстрое создание веб-сайта, который учащиеся могут использовать для подачи курсовой работы, и его автоматической оценки (в зависимости от количества автоматизированных тестов, которые проходит код).
источник
Программирование - это хороший способ улучшить ваше понимание различных концепций, но это также опасный прием времени.
Типичным аргументом против программирования является то, что он заставляет вас проводить время с неважными деталями; Типичный аргумент в пользу программирования заключается в том, что он заставляет вас осознать, что детали, которые вы считаете неважными, действительно важны. Быть хорошим в программировании означает, в основном, способность быстро справляться с неважными деталями. Чтобы стать хорошим, нужно много времени.
Что касается языка программирования, который нужно выучить: «все они» - мой (насмешливый) ответ.
источник
Я опаздываю на вечеринку, и это все отличные ответы, но у меня есть другая причина:
Визуализация.
Да, часто вы будете работать с вещами, которые невозможно визуализировать, но часто вы будете работать с вещами, которые могут. Знание того, как программировать, необходимо для этой задачи, а визуализация может дать вам глубокое понимание проблемы.
источник
Просто быстрый момент: знание того, как программировать, дает мне дополнительный инструмент в теоретических исследованиях. Когда у меня есть алгоритм, который, я думаю, будет работать, если он достаточно прост, я мог бы написать его и проверить, действительно ли он работает. Если моя идея (даже) не работает на практике, то вряд ли она сработает теоретически, и этот подход часто избавляет меня от затрачивания огромного количества времени, пытаясь доказать что-то, что является ложным.
источник
Никто здесь не обратился к практическим вопросам того, почему кто-то изучающий TCS должен изучать программирование.
Если вы планируете получить степень доктора философии в TCS в отделе компьютерных наук, есть большая вероятность, что вам нужно будет пройти курсы, не связанные с теорией, и они почти наверняка будут очень интенсивными в программировании. В зависимости от программы, в которой вы участвуете, вам также могут потребоваться знания предметов, не связанных с теорией, чтобы сдать квалификационные экзамены.
Когда вы заканчиваете докторскую диссертацию, большинство рабочих мест для TCS в академических кругах. Если вы работаете в академической среде, от вас ожидают, что вы будете преподавать, и от вас могут ожидать, что вы будете преподавать на старшекурсном курсе CS, который будет скорее программированием, чем теорией. Даже если вы преподаете теоретический класс для старшекурсников, как, например, «Алгоритмы», вы можете ожидать, что ваши студенты будут знать больше о программировании, чем теории, и, не зная, что знают ваши студенты, вам будет трудно преодолеть пробелы в их понимании , Я содрогаюсь при мысли о том, что старшекурсников CS преподают те, кто не знает программирования!
Если вас не волнуют эти практические проблемы, то вы, вероятно, можете получить результаты, не зная ничего о программировании. Конечно, у вас есть много компаний в сообществе TCS, но пробег будет варьироваться в зависимости от того, в какой именно области Теории вы работаете. Например, если вы занимаетесь чистой теорией вычислительной сложности, доказывая нижние границы для классов, которых никто не имеет когда-либо слышал о, то вполне вероятно, что программирование будет бесполезно для вас. Но если вы делаете что-то более алгоритмическое, то я чувствую, что возможность написать хороший чистый рабочий код укрепит вашу интуицию, если ничего больше.
Я рекомендую изучать C (не C ++). Возьмите копию K & R и прочитайте ее спереди назад. В C нет многих необычных возможностей современных языков, но он имеет простой, но элегантный синтаксис и семантику, которые вы должны быть в состоянии выучить полностью. Тем не менее, даже когда вы полностью понимаете язык, все еще требуется практика, чтобы освоить написание хорошего элегантного кода без ошибок на языке C. Тем не менее, если вы сможете освоить кодирование на C, вы сможете освоить любой язык программирования, с которым вы столкнетесь. Кроме того, эта дисциплина поможет вам думать, как думает аппаратное обеспечение, что будет полезно при разработке алгоритмов.
Такие идеи, как указатели, очень важны для всех, кто занимается разработкой алгоритмов, но, к сожалению, такие языки, как Java и Python, скрывают их от вас, поэтому я не рекомендую их в качестве первого языка для тех, кто имеет математическое образование. ООП важнее для людей, которые должны поддерживать огромные программные проекты, а не для тех, кто разрабатывает алгоритмы.
источник
Я бы посоветовал вам не ждать начала курса, поскольку компьютерные науки на любом уровне включают в себя реализацию алгоритмов через компьютер, чтобы выполнить / проверить / решить любую теорию, с которой вам придется столкнуться на протяжении всего курса, особенно на вашем уровне.
Сначала мне пришлось программировать в 10 классе (средняя школа), и я уже знал, как использовать командную строку, и это действительно помогло (это покажет вам, как «базовые» навыки программирования рассматриваются в CS).
Удивление ваших коллег вполне обосновано, так как псевдокод и алгоритмы являются одними из первых вещей, которые нужно изучить, чтобы программировать.
Тем не менее, вы не должны быть полностью потеряны в вашем предстоящем курсе, так как вы можете использовать свои более широкие математические навыки (самостоятельно) в своих интересах, чтобы пропустить объектно-ориентированное программирование, чтобы быстрее освоить функциональный язык программирования.
Я думаю, что вы могли бы заняться Haskell (обычно не родным языком), потому что он чисто математический, функциональный и может делать в основном все, что вы захотите. Изучение Хаскелла поставит вас на уровень, на котором вам не нужно будет много учиться, чтобы не отставать, и даже поставит вас в ситуацию контроля и контроля над своим курсом. Если вы увлекаетесь статистикой, изучение R - это плюс, но не так много, как у Haskell. Я видел сообщения от математиков, в которых говорилось о том, как они были удивлены его близостью к математике и тем, как она охватывает их образ мышления.
Кроме того, задача, которую стоит решить (чтобы быстро привыкнуть к среде программирования), заключается в установке и использовании Linux (подойдет Ubuntu Linux). Поверьте мне, вы многому научитесь, играя с ним ...
Эти советы - лучший способ наверстать упущенное для математика в области компьютерных наук. Кроме того, сообщество open source очень дружелюбно и полезно, и если вы застряли, IRC - это самый прямой способ поговорить на любую тему по специализированным каналам (подключитесь по FreeNode). Помните: спрашивать это единственный способ решить вопросы, будь то для себя, на форуме, в поисковой системе или в чатах.
источник
Примером реализации C ++ интерактивной системы доказательства является следующая статья: Джастин Талер: оптимальные по времени интерактивные доказательства для оценки цепей. Он доступен по адресу http://people.seas.harvard.edu/~jthaler/ . Похоже, это шаг к цели разработки практической реализации интерактивных систем доказательства общего назначения.
Аналогичные документы и соответствующие исходные коды появляются на веб-сайте, упомянутом выше.
источник