TCS 프로그래밍 방법을 아는 것이 얼마나 중요합니까?


66

좀 더 수학적 배경에서 나온 코드 작성법을 배우지 못했습니다. 나는 TCS에서 박사 학위를 시작하고 있으며 많은 사람들이 프로그래밍에 대해 (그리고 일반적으로 컴퓨터에 대해) 거의 알지 못하는 것에 놀랐습니다. 의사 코드로 알고리즘을 작성할 수는 있지만 실제로 프로그래밍 언어를 모릅니다.

언젠가 내 작업에 알고리즘을 구현해야한다고 생각할 수 있지만이 순간을 기다릴 수 있습니까? 아니면 뭔가 더 있습니까?

프로그래밍이 직접 관련되지 않은 분야에서 TCS로 코딩하는 방법을 아는 것이 얼마나 중요합니까? 코딩하는 법을 배우는 데 많은 시간을 할애 할 가치가 있습니까? 그리고 있다면, 더 적합한 프로그래밍 언어 범주 (기능적, 명령 적, 객체 지향 ..)가 있습니까?


12
의미 있고 런타임에 반영되는 의사 코드를 작성하기 위해 일부를 프로그래밍해야합니다. 수학자들은 종종 둘 다하지 않습니다. 또한 실제로 개발 한 이론을 사용 하려면 무언가를 구현해야 할 가능성이 있습니다. 언어의 경우 기능적인 것을 배우는 것이 좋습니다. C는 성능에는 좋지만 여러 측면에서 추론하기가 어렵고 복잡합니다. (보시다시피, YMMW)
Raphael

6
나는 "수학자들이 종종하지 않습니다"와 동의합니다. 알고리즘을 설명하는 수학자가 실제로 프로그램 한 적이 있는지에 대한 간단한 테스트는 " 'Given a X ...'가 정확히 무엇을 의미합니까?"
Jeffε

4
프로그래밍, 그게 뭐야? 정리는 나의 프로그램입니다. 요리 절차는 요리 기술과 다릅니다. 죄송합니다. 20 년 이상 동안 프로그램 코드를 읽을 수 없습니다. 사실, 나는이 "PC에서 실현되고있는"엉망이 싫습니다. (이미이 표기법은 이미 아프다.) 유클리드는 프로그래밍 할 수 없었다. 그러나 그는 수세기 동안 프로그램을 만들었습니다.
Stasys

6
@StasysJukna : 유클리드는 실제로 정말 엉뚱한 프로그래머였습니다. 그는 알고리즘을 구현하지 않았을뿐만 아니라, 복잡한 테스트 사례에서 직접 알고리즘을 실행하지도 않았습니다.
Jeffε

3
@ Jɛ ff E : 예, Euclid는 엉터리 프로그래머였습니다. 정확하게 말하고 싶었습니다. 우리는 TCS에서 요리 책과 코킹 아트를 구분하지 않는 경향이 있습니다. 유클리드 나는 프로그램을 할 수있는 사람들에게 큰 존경을 받고 있습니다. 그러나이 기능이 "TCS에서 하나의 CAN"을 의미한다고 생각하지 않습니다. 아프지 않을 것입니다.
Stasys

답변:


55

이론적 인 컴퓨터 과학은 광범위한 분야이며 프로그래밍의 중요성은 TCS에서하는 일에 달려 있습니다. 나는 이것이 유일한 방법임을 암시하지 않고 프로그래밍이 당신을 도울 수있는 두 가지 방법을 언급 할 것이다.

첫째, 실제적으로 중요한 문제에 대한 알고리즘을 설계하는 경우 알고리즘을 구현하고 다른 사람이 코드를 사용할 수있게하는 것이 큰 도움이 될 수 있습니다. 예를 들어, 볼록 껍질 문제는 많은 분야에서 발생하며 사람들 은 Komei Fukuda의 cdd 및 David Avis의 lrs 와 같은 소프트웨어 패키지를 사용 하여이 문제를 해결합니다. 그들이 논문으로 만 알고리즘을 발표했다면 아마도 더 적은 사람들이 알고리즘을 사용했을 것입니다. 사용자가 많을수록 더 많은 피드백과 더 많은 공동 작업 기회가 제공되므로 귀중한 가치가 있습니다.

둘째, 알고리즘에서 작업하지 않더라도 일회성 코드를 작성하면 추측이 수치 계산에 적합한 경우 간단한 추측을 테스트하는 데 도움이됩니다. 예를 들어, 3 개의 양의 정한 행렬의 곱이 항상 양의 트레이스를 갖는지 궁금하다면 2x2 또는 3x3의 양의 정한 행렬의 임의의 선택을 테스트하고 이에 대한 반례를 찾기 쉬운 코드를 작성하는 것이 쉽습니다. 추측을 테스트하기 위해 프로그램을 작성했다고 광고하지는 않지만, 프로그래밍은 허위 진술을 증명하는 데 허비 된 시간을 절약 할 수 있습니다.

선택할 프로그래밍 언어는 프로그래밍으로 무엇을하고 싶은지에 달려 있으며, 제 생각에는 전체 책의 주제가 될 수 있습니다. 그러나 알고리즘을 설계하고 다른 사람들이 구현을 사용할 수 있도록 알고리즘을 구현하려는 경우 한 가지 중요한 요소는 가용성입니다. 대부분의 잠재적 코드 사용자가 C 컴파일러에 액세스 할 것으로 예상 할 수 있지만 동일한 사용자가 Haskell 컴파일러에 액세스 할 것으로 기대할 수는 없습니다. 일회성 프로그램의 경우 선택은 사용 가능한 라이브러리를 기반으로하며 Matlab과 같은 환경을 포함합니다.

그건 그렇고, 프로그래밍도 재미있을 수 있습니다.


2
@SureshVenkat : 실제로 프로그래밍이 재미 있다면,“프로그래밍이 얼마나 중요한가?”라는 질문은 그다지 관련성이 없을 수 있습니다. 그러나 내 대답의 대부분은 관련이 없습니다. 얼마나 슬픈! :)
Tsuyoshi Ito

나는 당신의 두 번째 주장을 전에 생각하지 않았으며, 실제로 짧은 프로그램으로 추측을 테스트하는 것이 정말 좋은 생각 인 것 같습니다! 프로그래밍에 관해서는 재미있을 수 있지만, 나는 아직 모든 긴 주말 학습 =)을 보지 못했습니다.
Gopi

@Gopi : 많은 추측은이 "단순한 프로그램으로 테스트"프레임 워크에 맞지 않습니다. 예를 들어, 우리는 일반적으로 (단순한 프로그램으로) 점근 적 행동을 테스트 할 수 없습니다. 그러나 테스트 할 수있는 추측이있을 경우 작은 프로그래밍이 강력한 도구가 될 수 있습니다. 재미에 관해서는 그렇습니다. 나는“유용성”관점에서 일부 동기 만 열거함으로써“재미”관점을 무시하고 싶지 않았습니다.
이토 쓰요시

3
문제 해결 수업에 대한 Knuth의 노트는 추측과 코드 사이의 상호 작용에 대한 훌륭한 예입니다 (문제 1 참조) : www-cs-faculty.stanford.edu/~knuth/papers/cs1055.pdf (특히 누군가의 이미지를 좋아합니다 ) 출력물의 힙 베어링 교실로 돌진
수레 쉬 벤 카트

47

나는 이것에 대해 Doron Zeilberger를 인용해야한다고 생각합니다.

의견 37 : 프로그래밍은 증명하는 것보다 훨씬 재미 있으며, 더 중요한 것은 더 많지 않더라도 통찰력과 이해력을주는 것입니다.

의견을 읽으십시오. 보석으로 가득 차 있습니다 (btw는 의도적으로 도발적인 경향이 있습니다). 예를 들어, "무엇을 이해하는 가장 좋은 방법은 그것을 가르치는 것입니다. 그러나 인간에게 가르치는 것이 더 나은 방법은 컴퓨터로 가르치는 것입니다."

내 개인적인 경험은 순전히 이론적 인 작업을 수행 할 때 몇 가지 컴퓨팅 도구가 필요하다는 것입니다. 나는 Mathematica와 함께 많은 지루한 일상적인 대수 조작을 피합니다. Matlab 또는 Python에서 작은 인스턴스를 무차별 강제 실행하여 반 구운 추측을 테스트합니다. 나는 순수한 조합론 인 논문을 한 권 썼는데, 이것이 진행중인 일을 이해하기 위해 광범위한 컴퓨터 실험을 실행함으로써 가장 많은 혜택을 얻은 작품입니다. 오일러는 문제에 대한 통찰력을 얻기 위해 지루한 계산 테이블을 만들었습니다. 우리는 수학을 할 때 도구를 사용하여이 과정을 자동화해야합니다.

그 외에도 알고리즘과 데이터 구조에 대해 작업 할 경우 프로그래밍은 효율성 및 유용성 문제에 대해 대체 할 수없는 관점을 제공합니다. 여기에 내 의견은 다른 사람과 약간 다릅니다. 제대로 입력 한 증명을 작성하기 위해 기능적 언어를 배우는 것은 시간 낭비라고 생각합니다. (강력한 언어를 경험 한 사람들이 더 신중하게 구조화 된 증명을 작성하는 경향이 있다는 것이 큰 요점이라고 생각합니다. '이 운동을 겪는 것이 가치가 있다고 생각하지 않습니다.) 함수형 프로그래밍은 알고리즘 설계 및 실행 시간 문제를 모호하게하고 논리 및 의미론 문제를 강조합니다 (물론, 함수형 프로그래밍 학습은 논리 / PL 의미론에 관심이있는 경우 자연스럽고 다소 자연스럽게 이루어질 것임). 비슷하게, OO의 목적은 모듈 재사용 가능한 코드를 작성하는 것이기 때문에 Java 및 C ++의 OO 세부 정보를 얻는 것이 시간을 보내는 최적의 방법이 아니라고 생각합니다. 다른 사람이 사용할 수있는 코드를 생성 할 수있는 방법입니다. 그러나 효율성과 실행 시간에 대한 통찰력을 얻고 싶다면 정말로 효율적인 알고리즘과 데이터 구조에 관심이 있다면 C를 살펴볼 것을 제안합니다. 합리적인 수준의 추상화를 제공하면서 시스템에 가까이 머물 수 있습니다. . 이 방법을 사용하면 빠르고 느린 것과 합리적인 데이터 구조 등을 느낄 수 있습니다. 그러나 효율성과 실행 시간에 대한 통찰력을 얻고 싶다면 정말로 효율적인 알고리즘과 데이터 구조에 관심이 있다면 C를 살펴볼 것을 제안합니다. 합리적인 수준의 추상화를 제공하면서 시스템에 가까이 머물 수 있습니다. . 이 방법을 사용하면 빠르고 느린 것과 합리적인 데이터 구조 등을 느낄 수 있습니다. 그러나 효율성과 실행 시간에 대한 통찰력을 얻고 싶다면 정말로 효율적인 알고리즘과 데이터 구조에 관심이 있다면 C를 살펴볼 것을 제안합니다. 합리적인 수준의 추상화를 제공하면서 시스템에 가까이 머물 수 있습니다. . 이 방법을 사용하면 빠르고 느린 것과 합리적인 데이터 구조 등을 느낄 수 있습니다.


10
"기능 프로그래밍은 알고리즘 설계 및 실행 시간 문제를 가리고 논리 및 의미 문제를 강조합니다." 싸우는 단어 :)
Suresh Venkat

3
"기능 프로그래밍은 알고리즘 설계 및 실행 시간 문제를 가리고 논리 및 의미 문제를 강조합니다." 그렇기 때문에 TCS의 논리 또는 의미 측면에서 작업하는 경우 좋은 선택입니다. :)
Radu GRIGore


3
@Sasho : 모든 일반적인 기술은 여전히 ​​기능적인 언어로 작동합니다. 유일한 "문제"는 기능적 프로그래밍이 알고리즘 분석의 일반적인 기술이 처리 할 수없는 프로그래밍 스타일과 데이터 구조 설계를 장려한다는 것입니다. (예를 들어, 함수 구성의 큰 O는 무엇입니까? 연산은 사소 하지만, 점근 적 복잡성에 대한 가정을 완전히
깨뜨

3
@ SashoNikolov : 대학원 데이터 구조 수업을 가르 칠 때마다 모든 사람들이 기능적 프로그래밍 경험을 가지고 있다고 가정 할 수 있기를 정말로 바랍니다. 지속성을 설명하기 위해 90 분 동안 세 번의 강의를하는 대신 "데이터 구조가 이미이 작업을 수행하고 있음을 알았습니까?"
Jeffε

33

당신은 프로그래밍없이 상당히 성공적인 이론적 컴퓨터 과학자가 될 수 있습니다. 소수의 사람들에게는 프로그래밍이 매우 어려우며, 그 중 하나라면 필드를 절망하거나 전환해서는 안됩니다.

그러나 대부분의 수학 및 컴퓨터 과학 대학원생의 경우 프로그램 학습은 그리 어렵지 않으며 매우 유용한 기술입니다. 당신은 프로그래밍 언어를 배워야하고, 그것을 즐기면, 그것을 능숙하게 숙달하기 위해 충분한 연습을하도록 노력해야합니다. 그런 다음 연구를 통해 프로그램을 작성하는 것이 유용 할 것이라는 요점이 올 때 (그럴 것입니다), 그렇게 할 수있을 것입니다.

지금 프로그래밍하는 법을 배우지 않으면 결국 프로그램을 작성해야 할 때 배울 시간이 없으므로 실제로 작성하지 못할 수도 있습니다. 연구. 대학원생이나 학부생이 당신을 위해 그렇게하는 것은 그리 어렵지 않지만, 문제를 설명하기보다는 스스로하기가 훨씬 쉽고 시간이 덜 걸리는 경우가 많습니다.

어떤 언어를 배워야합니까? 현재 가장 많이 사용되는 언어이기 때문에 객체 지향 언어를 권장합니다. 앞으로 이것이 더 사실이라고 생각합니다. 아마도 파이썬이나 자바는 둘 다 객체 지향 언어이며 C ++보다 실제로는 덜 사용되지만, 배우고 배우기가 훨씬 쉽다는 인상이 있습니다. (주의 : Bell Labs에서 근무했지만 C ++을 알지 못하므로 이것에 대해 틀릴 수 있습니다.)


2
나는 세 번째 단락에서 진실을 본다 :).
Gopi

1
"그러나 대부분의 사람들에게 프로그램을 배우는 것은 특별히 어렵지 않습니다."-제 경험에 따르면 이에 동의하지 않지만 대부분의 사람들은 TCS 연구원이 아닙니다.
Max

2
Sage가 등장함에 따라 Mathematica / Maple / Matlab 스타일의 수학 라이브러리를 즉시 사용할 수있는 동시에 Python과 같이 훌륭하고 대중적인 언어로 작업 할 수 있습니다.
András Salamon

1
C ++에는 Lisp 언어 계열을 제외하고 내가 본 주류 범용 프로그래밍 언어 중 가장 진보 된 유형 / 메타 프로그래밍 시스템이 있습니다. 따라서 유형 이론, 언어 설계 또는 컴파일러 이론 또는 공식 의미론에 더 광범위하게 익숙한 경우 익숙 할 수 있습니다. C ++ 외에도 실험적인 컴퓨터 과학에 대한 연구를하거나 업계의 프로그래머 또는 소프트웨어 엔지니어로 취업하려면 Java 및 C #이 필수입니다. 파이썬은 고등학교에서 가르쳐야합니다 : D
Antonio Valerio Miceli-Barone

4
@ AntonioValerioMiceli-Barone : 최소한 타입 이론, 언어 디자인, 형식적 의미론 및 프로그래밍 언어 이론 (PLT)에 대해서는 동의하지 않습니다 . C ++은 이러한 분야에서 배우는 언어 가 아닙니다 . TT와 형식적 의미론은 거의 독점적으로 함수형 프로그래밍과 관련이있는 반면, PL 커뮤니티는 더 다양하지만 C ++보다 더 우아한 언어를 선호합니다. Haskell은 가장 진보 된 유형 시스템을 가진 "주류"언어이며, 그 뒤에 Scala (보다 진보 된, 약간 더 주류 인)가 뒤 따릅니다. C ++에는 흥미로운 기능이 있지만 현대적인 취향으로는 너무 낮은 수준입니다.
Blaisorblade

33

아무도 실제로 일어나지 않았다는 또 다른 대답이 있습니다. 프로그래밍은 실제로 흥미로운 이론으로 이어질 수 있습니다. 최근 해싱 (특히 테이블 해싱)의 많은 발전은 이론적 인 문제 자체가 아니라 이론적으로 최적의 알고리즘이 실제로 그렇게 크지 않다는 사실에 의해 동기가 부여됩니다. 물론 이것은 코드를 작성할 수 없다면 모르는 것입니다.

정확한 지수 시간 알고리즘의 영역 에서조차도 동기 부여는 실제로 작동 할 수있는 알고리즘을 생성합니다. SAT 솔버가 이에 대한 표준 예입니다.

간단히 말해서, 코드 작성 능력을 통해 최적의 이론적 결과처럼 보일 수있는 단점과 단점을 실현할 수 있으며 결과적으로 새로운 이론적 연구 방향이 열립니다.


귀하의 답변은 TCS의 실증 결과에 관한 질문에 도움이 될 수 있습니다.
Gopi

어쩌면 :하지만 그 스레드는 오래 죽었다 :)
Suresh Venkat

실제로, 나는 날짜를 보지 못했다. "이전 주에서 가장 큰 타격을 입었다"=) 섹션에서 마지막으로받은 뉴스 레터에 있었다.
Gopi

18

세 가지 점 :

1) 컴퓨터 프로그램을 사용하여 객체의 패턴과 구조를 조사하여 이러한 객체에 대한 분석적 증거를 도출하는 Experimental Mathematics ( wikipedia : // Computer-aided proof 참조) 수학에 대한 접근 방식 이 있습니다. 이 방법을 사용하면 프로그래밍 방법을 더 잘 알 수 있습니다. 당신은 매우 이론적 인 진술을 증명하기 위해이 접근법이 필요하다는 것을 확신 할 수 있습니다. 프로그래밍에 대한 스노 버 (snobbery)는 종종 TCS 연구에 실제로 도움이되지 않는 것으로 판명되었습니다.

2) 프로그래밍 방법을 배우면 부산물로서 TCS에 유용한 기술을 배우게됩니다. 무엇보다도 예 : 코딩 배경을 가진 사람들이 증명을 더 많이 확인하는 경향이 있음을 알았습니다. 더 좋은 점은 고려중인 객체의 유형을 정의하는 경향이있는 경우가 많습니다 (예 : "연산자 및 ). 컴파일러 (및 통역사)는 우리를 훌륭한 과학자로 변신시킵니다. :) 이런 종류의 기술을 위해, 나는 강력하게 형식화 된 기능적 언어를 제안하고 싶습니다.B L ( Y , C )AL(X,Y)BL(Y,C)

3) "프로그램으로"라고 말하면 " 선형 프로그램 "또는 "반 확정 프로그램으로 "를 의미합니까? :)


2
내가 아는 사람은 "선형 프로그램"또는 "반 확정 프로그램"에 "프로그램"을 사용하지 않습니다. 대신 "선형 프로그램 구성 / 해결"이라고 말하십시오.
피터 쇼어

2
@PeterShor 포인트 3은 심각하지 않았습니다
Alessandro Cosentino

3
물론, 당신 또한 선형 기술과 반 정확한 프로그램, 둘 다 유용한 기술을 배워야합니다.
피터 쇼어

3
포인트 2에 +1을했을 때, 저학년 때 실제로 약간의 OCaml을 배웠지 만, 1 년 동안 만 사용해도 증거의 유형을 확인하는 습관을 들었습니다.
Gopi

4
나는 동적으로 프로그램한다 !
Jeffε

16

이 질문에 대해 Gopi에게 감사합니다. 아직 언급되지 않은 다른 차원에서 많은 흥미로운 답변을 확장하고 싶습니다.

대학에서 우리가하는 일은 연구뿐이 아닙니다. 학계에 머물고 싶다면 결국 가르쳐야합니다. 운이 좋으면 전문 분야에서 멀리 떨어진 코스를 가르쳐야합니다. 상당한 프로그래밍 구성 요소가있는 과정이 배정 될 것입니다. 이것은 적당한 수준의 프로그래밍 능력조차도 실질적으로 도움이되는 곳입니다. 프로그램하는 방법을 알고 있으면 훨씬 더 나은 교사가 될 것입니다. 가장 먼저, 당신은이 자료에 더 편안하고, 학생의 질문에 더 잘 대답 할 수 있으며,이 학습 과정을 직접 경험 한 학생들이 프로그램을 배우는 데 따르는 어려움을 이해합니다. 또한 더 나은 교육 자료를 만들 수 있습니다. 예를 들어 프로그래밍 연습을 학생들에게주기 전에 직접 테스트 할 수 있습니다.

추가적인 실용적 차원이 있습니다. 교육에는 학생들이 강의를 제출하는 데 사용할 수있는 웹 사이트를 신속하게 작성하고 코드가 통과하는 자동 테스트의 수에 따라 자동으로 등급을 매기는 것과 같이 숙련 된 프로그래머가 자주 자동화 할 수있는 다양한 반복 작업이 포함됩니다.


"운이 좋으면 전문 분야에서 멀리 떨어져있는 코스를 가르쳐야합니다."
이토 쓰요시

3
@ 츠요시 : 글쎄, 그것은 당신이 새로운 주제 영역에 익숙해 지도록 강요합니다. 단기적으로, 그것은 많은 일을 의미합니다 (이 자료를 두 번 이상 가르 칠 가능성이 있기 때문에 장기적으로 상각됩니다). 동시에 지적 지평을 상당히 넓 힙니다.
Martin Berger

@ 츠요시 이토 : 그렇습니다!
Jeffε

13

프로그래밍은 다양한 개념에 대한 이해를 높이는 좋은 방법이지만 위험한 시간 싱크입니다.

일반적인 인수 에 대한 프로그램은 당신이 중요하지 않은 세부 사항과 함께 시간을 보낼 수 있다는 것입니다; 일반적인 인수 를위한 프로그램은 당신이 생각 세부 사항은 중요하지 실제로 중요하다는 것을 깨닫는 것입니다. 프로그래밍에 능숙하다는 것은 주로 중요하지 않은 부품을 신속하게 처리 할 수 ​​있다는 의미입니다. 좋은 사람이 되려면 오랜 시간 이 걸립니다 .

프로그래밍 언어는 "모든 언어"가 나의 (뺨에있는) 대답입니다.


2
프로그래밍에 대한 논쟁을 마무리하십시오 :).
Gopi

1
@Gopi, 나는 프로그래밍이 재미있을 수 있다고 생각합니다. 이해하는 것이 더 중요합니다. 다른 답변은 프로그래밍이 이해를 돕는 방법에 대한 훌륭한 예입니다. 따라서 프로그래밍을 배우고 기업이 빨리 돈을 지불하지 않는 경우 포기하지 않는 것이 좋습니다.
Radu GRIGore

6
이론을 증명하는 것은 다양한 개념에 대한 이해를 향상시키는 좋은 방법이지만 위험한 시간 싱크이기도합니다.
Jeffε

@ Jɛ ff E, 내 의견은 '의사 코드-> 종이에 증거, 증거 조수의 코드-> 증거'로 대체되어 보존됩니다.
Radu GRIGore

12

나는 파티에 늦었고 이것들은 모두 훌륭한 답변이지만 다른 이유가 있습니다.

심상.

그렇습니다. 종종 시각화 할 수없는 것들을 다루지 만 종종 할 수있는 것들을 다루게됩니다. 프로그래밍하는 방법을 아는 것은이 작업에 반드시 필요하며 시각화는 문제에 대한 많은 통찰력을 제공 할 수 있습니다.


3
프로그래밍 방법을 알고 있으며 시각화에 대해 절망적입니다. 또한 많은 프로그래밍을하지 않고도 사물을 시각화 할 수있는 도구가 있다고 생각합니다. 없다면 몇 년 안에있을 것이며 아마도 몇 년 안에있을 것입니다.
피터 쇼어

@PeterShor : C ++을 사용하지 않기 때문에! (그냥 농담)
이토 쓰요시

1
@PeterShor : 특정 언어 나 환경을 언급하지 않습니다. MATLAB이 여기에 포함됩니다. 그러나 프로그래밍 방법을 알면 믿을 수 없을 정도로 불편한 시각화를 얻을 수 있습니다. 예를 들어, 2 차원 양의 유한 행렬의 공간은 3 차원이며,이 공간에서 일련의 구성을 시각화하고 싶었습니다. 나는 변형을 생각해 내고 객체를 실제로 볼 수 있도록 코딩해야했습니다.
John Moeller

@ 존 ... 당신 말이 맞아, 나는 당신이 다른 방법으로 그것을 할 수 있다고 생각하지 않습니다.
피터 쇼어

7

간단한 요점 : 프로그래밍 방법을 알면 이론 연구에 추가 도구를 제공합니다. 내가 작동 할 것으로 생각되는 알고리즘이있을 때, 충분히 쉬운 경우, 그것을 코딩하고 실제로 작동하는지 확인할 수 있습니다. 내 아이디어가 실제로 작동하지 않는다면 이론 상으로는 효과가 없을 가능성이 높으며,이 접근법은 종종 잘못된 것을 증명하려고 많은 시간을 허비하지 못하게합니다.


이토 쓰요시 (Tsuyoshi Ito)는 그의 대답에서 비슷한 주장을 썼습니다 (두 번째 요점).
Gopi

죄송합니다.보고 싶었습니다.
레브 레이 진

5

TCS를 공부하는 사람이 왜 프로그래밍을 배워야하는지에 대한 실질적인 문제는 여기에서 다루지 않았습니다.

컴퓨터 과학 부서의 TCS에서 박사 학위를 받으려는 경우 이론 이외의 과정을 수강해야 할 확률이 높으며 프로그래밍에 매우 집중적 일 것입니다. 해당 프로그램에 따라 자격 시험에 합격하기 위해서는 비 이론 과목에 대한 지식이 필요할 수도 있습니다.

박사 학위를 마치면 TCS에 대한 대부분의 직업 기회는 학계에 있습니다. 학계에서 일하는 경우 가르 칠 것으로 예상되며 이론보다 프로그래밍 수준이 높은 인트로 레벨 저학년 CS 수업을 가르 칠 것으로 예상 될 수 있습니다. 알고리즘과 같이 학부생들에게 이론 수업을 가르치더라도, 학생들은 이론보다 프로그래밍에 대해 더 많이 알 것으로 기대할 수 있으며, 학생들이 아는 것을 모르면 이해의 격차를 해소하기가 어려울 것입니다 . 저는 CS를 모르는 사람이 프로그래밍을 모르는 CS 학부생들의 생각에 떨었습니다!

이러한 실제적인 문제에 관심이 없다면 프로그래밍에 대해 전혀 몰라도 연구를 통해 얻을 수 있습니다. 확실히 당신은 TCS 커뮤니티에 많은 회사를 가지고 있지만 마일리지는 당신이 일하고있는 이론의 정확한 영역에 따라 달라질 것입니다. 예를 들어, 순수한 계산 복잡도 이론을 수행하고 있다면 아무도 가지고 있지 않은 클래스에 대한 하한을 증명합니다 들어 본다면 프로그래밍이 당신에게 소용이 없을 것입니다. 그러나 더 알고리즘적인 일을하고 있다면 좋은 깨끗한 작업 코드를 작성할 수 있으면 다른 것이 없다면 직관이 강화 될 것이라고 생각합니다.

C (C ++ 아님)를 배우는 것이 좋습니다. K & R 사본을 픽업하여 앞뒤로 읽습니다. C에는 현대 언어의 멋진 기능이 많지 않지만 단순하지만 우아한 구문과 의미가 있으므로 전체적으로 배울 수 있습니다. 그러나 언어를 완전히 이해하더라도 C에서 버그가없는 훌륭한 코드 작성을 마스터하는 것은 여전히 ​​실습이 필요합니다. 그럼에도 불구하고 C에서 코딩을 마스터 할 수 있으면 발생하는 모든 프로그래밍 언어를 마스터 할 수 있습니다. 또한이 원칙은 하드웨어의 사고 방식을 생각하는 데 도움이되며 알고리즘을 설계 할 때 유용합니다.

포인터와 같은 아이디어는 알고리즘 설계를하는 모든 사람에게 매우 중요하지만 불행히도 Java 및 Python과 같은 언어는 사용자를 가리지 않으므로 수학 배경을 가진 사람에게 제 1 언어로 추천하지 않습니다. OOP는 알고리즘을 설계하는 사람이 아니라 거대한 소프트웨어 프로젝트를 유지 관리해야하는 사람들에게 더 중요합니다.


0

모든 수준의 컴퓨터 과학은 컴퓨터를 통해 알고리즘을 구현하여 강의 전반에 걸쳐 직면해야 할 이론을 성취 / 확인 / 해결하는 과정을 수반하므로 강의 시작을 기다리지 말 것을 권합니다.

나는 10 학년 (고등학교)에 먼저 프로그램을해야했고, 이미 커맨드 라인을 사용하는 방법을 알고 있었고 이것이 실제로 도움이되었습니다 (CS에서 "기본"프로그래밍 기술이 어떻게 고려되는지 보여줍니다).

의사 코드와 알고리즘이 프로그래밍을 위해 배우는 첫 번째 항목 중 하나이기 때문에 동료의 놀랍게도 잘 알려져 있습니다.

그러나 앞으로 다가오는 과정에서 완전히 길을 잃지 않아도됩니다. 기능적 프로그래밍 언어를 더 빨리 배우기 위해 객체 지향 프로그래밍을 건너 뛰기 위해 더 넓은 수학 기술을 스스로 활용할 수 있기 때문입니다.

  • 함수형 프로그래밍은 매우 수학 지향적이며, 필요한 수학 배경을 배우기가 더 어렵고, 매우 강력합니다 ( "단순", 우아하고 "깨끗한"수단을 통해 어려운 문제를 수행하는 수학적인 방법).
  • 객체 지향은 기본 알고리즘 및 구현 원칙을 이해하지 않고 기존 객체를 "재사용"하려는 경우에 유용합니다.

하스켈 (보통 제 1 언어는 아님)은 순전히 수학적이고 기능적이며 기본적으로 원하는 모든 것을 할 수 있기 때문에 해결할 수 있다고 생각합니다. Haskell을 배우면 훨씬 더 많은 것을 배울 필요가없는 수준에 도달하게되며 코스를 통제하고 통제 할 수있는 상황에 처하게됩니다. 통계에 관심이 있다면 R을 배우는 것이 더하지만 Haskell만큼 가까이 있지는 않습니다. 나는 수학자들이 수학과의 친밀감에 대해 얼마나 놀랐는지와 그것이 그들의 사고 방식을 어떻게 받아들 였는지에 대해보고 한 것을 보았다.

또한 (프로그래밍 환경에 익숙해지기 위해) 다루어야 할 과제는 Linux를 설치하고 사용하는 것입니다 (우분투 리눅스가 할 것입니다). 날 믿어, 너는 그것을 가지고 놀면서 많은 것을 배울 것이다 ...

이 조언은 컴퓨터 과학의 수학자에게 빠르고 확실하게 따라 잡는 가장 좋은 방법입니다. 또한 오픈 소스 커뮤니티는 매우 친절하고 도움이되며 갇힌 경우 IRC는 전문 채널 (FreeNode에서 연결)을 통해 모든 주제에 대해 이야기 할 수있는 가장 직접적인 방법입니다. 기억하십시오 : 질문은 자신, 포럼, 검색 엔진 또는 대화방에서 질문을 해결할 수있는 유일한 방법입니다.


4
나는 당신이 원래의 질문에 얼마나 대답하고 있는지 잘 모르겠습니다.
Gopi

0

대화 형 증명 시스템의 C ++ 구현 예는 다음과 같습니다. Justin Thaler의 회로 평가를위한 시간-최적의 대화 형 증명. http://people.seas.harvard.edu/~jthaler/ 에서 사용 가능 합니다. 이는 범용 대화 형 증명 시스템의 실제 구현을 개발하려는 목표를 향한 단계 인 것으로 보입니다.

위에서 언급 한 웹 사이트에도 비슷한 문서와 관련 소스 코드가 나타납니다.


3
이 백서가 질문과 어떻게 관련되어 있는지 설명 하시겠습니까? 즉 , TCS 프로그래밍 방법을 아는 것이 얼마나 중요 합니까?
scaaahu

프로그래밍의 혜택을 얻은 이론적 결과 의 일지라도 원래 질문에 대답하지 않습니까?
제레미

이 질문은 복잡한 이론가가 코딩을 알아야 할 필요가 있는지 묻습니다. 위에서 언급 한 논문은 이론적 개념을 보완하기 위해 실험 결과를 명확하게 사용합니다. 코딩이 필요합니다. 어쨌든 이론적 인 컴퓨터 과학의 중심 개념과 밀접한 관련이있는 프로그래밍 프로젝트를 찾는 데 오랜 시간이 걸렸습니다. 이 게시물이 비슷한 검색을하는 사람에게 유용 할 수 있기를 바랍니다.
lgidwani
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.