문제

수업시간에는 정지문제, 튜링머신, 환원 등에 대해 배웠습니다.많은 급우들은 이것이 모두 추상적이고 쓸모없는 개념이며, 그것들을 아는 데 실질적인 의미가 없다고 말합니다(즉, 코스가 끝나면 잊어버리고 아무것도 잃지 않을 수 있습니다).

이론이 왜 유용한가?일상적인 코딩에 사용해 본 적이 있나요?

도움이 되었습니까?

해결책

대학을 졸업했을 때, 나는 다른 모든 사람들과 동등한 것으로 생각했습니다. "나는 CS에 BS가 있고 다른 많은 사람들도 그렇게하고 우리 모두는 본질적으로 같은 일을 할 수 있습니다." 나는 결국 내 가정이 거짓이라는 것을 발견했다. 나는 눈에 띄었고, 내 배경은 그것과 많은 관련이있었습니다.

나는 CS에 "BS"가 있다는 점에서 하나의 "약간의"차이가 있다는 것을 알았습니다. 왜냐하면 CS에 "BS"가 있다는 것을 알았습니다. 2 등석에서 그 인증을 받기 위해 졸업했습니다. 당시에는 그것이 많이 중요하다고 생각하지 않았습니다.

또한 고등학교와 대학에서 CS에서 특히 동료보다 더 잘했으며 많은 선생님보다 훨씬 낫다는 것을 알았습니다. 나는 많은 도움을 요청 받았고,지도를했고, 연구 프로젝트를 도와 달라는 요청을 받았으며, 아무도 없었을 때 독립적 인 연구를 할 수있었습니다. 나는 도울 수있어서 기뻤지 만 그 차이에 대해별로 생각하지 않았다.

대학 (USAFA) 후, 나는 공군에서 4 년을 보냈으며 그 중 2 명은 CS 학위를 적용했습니다. 그곳에서 나는 동료들 중 몇 명이 컴퓨터와 관련된 학위 나 훈련을 받았다는 것을 알았습니다. 공군은 5 개월간의 인증 훈련으로 나를 보냈다. 그러나 여기서 나는 그 차이를 알아 차리기 시작했다. 내가 겪은 많은 사람들이 그들이 무엇을하고 있는지 알지 못했고 훈련이나 학위를 가진 사람들을 포함한다는 것은 완전히 분명해졌다. 설명 해주세요.

공군 인증 훈련에서 총 13 명 (나 포함)이있었습니다. 공군 장교 또는 이와 동등한 사람으로서 우리 모두는 BS 학위를 가졌습니다. 나는 나이와 계급을 기준으로 중간에 있었다 (나는 6 개의 O-1과 6 개 이상의 O-2였다). 이 훈련이 끝날 무렵, 공군은 국방부의 모든 부분에 대해 컴퓨터 또는 통신 시스템을 획득, 구축, 설계, 유지 및 운영하는 데 동일하게 우리를 고무시켜주었습니다.

그러나 우리 중 13 명 중 6 명만이 어떤 형태의 컴퓨터 관련 학위를 가졌다. 다른 7 명은 항공에서 화학/생물학, 심리학에 이르기까지 정도의 정도를 가졌습니다. CS 학위를 가진 우리 중 6 명 중 2 명은 어떤 종류의 프로그램도 작성한 적이 없으며 컴퓨터를 우연히 사용한 적이 없다는 것을 알게되었습니다 (종이 작성, 게임 연주 등). 나는 우리 중 두 사람이 CS 학위 프로그램 중에 단일 컴퓨터에 정확히 하나의 프로그램을 작성했다는 것을 알게되었습니다. 한 사람과 나 자신만이 하나 이상의 프로그램을 작성하거나 두 종류 이상의 컴퓨터를 사용했습니다. 우리는 두 사람이 많은 프로그램을 작성하고 많은 종류의 컴퓨터를 사용했다는 것을 알았습니다.

5 개월간의 훈련이 끝날 무렵, 우리 수업에는 프로그래밍 프로젝트가 배정되었고 우리는이를 별도로 수행하기 위해 4 개의 그룹으로 나뉘 었습니다. 우리의 강사는 "프로그래밍 인재"를 공정하게 전파하기 위해 수업을 나누고 팀 리드, 기술 리드 및 개발자의 역할을 할당했습니다. 각 그룹은 강사가 제공 한 비행 기계 라이브러리 위에 비행 시뮬레이터를위한 전체 화면, 텍스트 기반 사용자 인터페이스 (1990)를 구현하기 위해 일주일이 주어졌습니다. 나는 4 명의 팀의 기술 책임자로 지정되었습니다.

컴퓨터 학위가 없었던 팀 리드 (컴퓨터 학위가 없었던)는 다른 세 사람에게 프로젝트를 작업으로 나누고 3 분의 1을 우리 각자에게 할당하도록 요청했습니다. 나는 그 첫날 한가운데까지 세 번째 작업을 마친 다음 다른 두 팀원을 돕고 팀 리드 (bsing;^)와 대화하고 컴퓨터에서 연주하는 하루의 나머지 시간을 보냈습니다.

이 morning 날 아침 (2 일째), 우리 팀장은 개인적으로 다른 두 팀원이 진전을 보이지 않았다는 사실을 개인적으로 알려주었습니다 (실제로는 컴파일 할 "만약"진술을 작성할 수 없었습니다). 오후 중반까지 전체 프로젝트를 마쳤으며 팀은 하루 종일 시뮬레이터를 비행하는 데 보냈습니다.

비슷한 CS 학위를 가진 다른 사람도 그의 팀의 기술 리드로 배정되었으며 3 일째에 끝났습니다. 그들은 또한 시뮬레이터를 비행하기 시작했습니다. 다른 두 팀은 이번 주 말까지 끝나지 않았거나 심지어 큰 진전을 이루지 못했습니다. 우리는 다른 팀을 도울 수 없었으므로 그에 남겨졌습니다.

한편, 3 일 중반까지 나는 비행 시뮬레이터가 "잘못된"행동을하는 것처럼 보였다. 내 반 친구 중 한 명이 항공 학위를 받았기 때문에 나는 그에 대해 물었다. 그는 신비화되어 비행기가 무엇을 만들었는지 실제로 알지 못했다고 고백했다!?! 나는 멍청했다! 그의 전체 학위 프로그램은 안전 및 충돌 조사에 관한 것이며, 비행 뒤에 실제 수학이나 과학이 없었습니다. 다른 한편으로, 나는 항공의 미성년자가 있었을 것입니다 (USAFA를 기억하십니까?). 그러나 우리는 날개를 디자인하고 실제 풍동 테스트를 수행했습니다. 따라서, 나는 시뮬레이터가 "오른쪽"이 날 때까지 강사가 제공 한 비행 기계 라이브러리를 재 작성하는 데 조용히 보냈습니다.

그 이후로 저는 거의 20 년 동안 계약자로, 때로는 직원으로 보냈으며 항상 소프트웨어 개발과 관련 활동 (DBA, 건축가 등)을 수행했습니다. 나는 계속해서 같은 것을 찾았고 결국 나는 젊음의 가정을 포기했다.

그렇다면 정확히 무엇을 발견 했습니까? 모든 사람이 평등 한 것은 아니며 괜찮습니다. 효과적으로 프로그래밍 할 수 있기 때문에 더 나은 사람은 아닙니다. 그러나 그것이 당신이 나에게 필요한 것이라면 더 유용합니다. 나는 내 배경이 정말로 중요하다는 것을 배웠다 : 전기 기술자와 전기 엔지니어 가족에서 자라며, 전자 키트를 구축하고, 실제 컴퓨터에 액세스 할 수 없기 때문에 학교/공공 도서관의 모든 컴퓨터 책을 문자 그대로 읽은 다음 새로 이동했다. 내 고등학교가 컴퓨터를 가지고 있었던 City는 내 컴퓨터를 선물로 가져 와서 다양한 크기와 종류의 컴퓨터 (PCS에서 메인 프레임)를 가진 학교에 가서 아주 좋은 공학 학교에서 공인 학위를 받고 글을 써야합니다. 다양한 종류의 컴퓨터에 대한 다른 언어로 된 많은 프로그램으로, 맞춤 어셈블리 언어가있는 내 자신의 가상 머신 또는 Huffman 압축 구현 등의 하드 프로그램을 작성 해야하는 하드 프로그램을 작성해야합니다. 부품 및 모든 소프트웨어 설치 등

궁극적으로, 나는 내 능력이 전자 구성 요소, 회로, 서브 시스템, 서브 시스템, 인터페이스, 프로토콜, 비트, 바이트, 프로세서, 장치, 드라이버, 라이브러리, 프로그램, 라이브러리, 프로그램 , 시스템, 네트워크, 내가 지금 일상적으로 일하는 대규모 엔터프라이즈 급 대기업까지. 그래서, 망할 일이 잘못 행동 할 때, 나는 정확히 어떻게 그리고 왜 알고 있습니다. 그리고 나는 무엇을 할 수없고 무엇을 할 수 있는지 알고 있습니다. 그리고 나는 무엇을했는지, 시도한 것, 그리고 상대적으로 탐구되지 않은 것에 대해 많은 것을 알고 있습니다.

가장 중요한 것은 모든 것을 배운 후에, 나는 저주받은 것을 모른다는 것을 알게되었습니다. 잠재적으로 알아야 할 모든 것에 직면하여, 나의 지식은 미미하다.

그리고 나는 그것에 꽤 만족합니다. 그러나 나는 당신이 시도하는 것이 좋습니다.

다른 팁

사실 이야기 :

대학원에서 첫 번째 프로그래밍 직업을 얻었을 때, 내가 일한 회사를 소유 한 사람들은 조종사였습니다. 내가 고용 된 지 몇 주 후, 그들 중 하나는이 질문을했습니다.

아칸소에는 106 개의 공항이 있습니다. 각각에 착륙하는 데 필요한 가장 짧은 경로를 찾을 수있는 프로그램을 작성할 수 있습니까?

나는 그가 여행하는 세일즈맨 문제와 NP- 완전성에 대한 나의 지식으로 나를 퀴즈하고 있다고 진지하게 생각했다. 그러나 그는 그렇지 않은 것으로 밝혀졌습니다. 그는 그것에 대해 아무것도 몰랐습니다. 그는 가장 짧은 길을 찾을 프로그램을 정말로 원했습니다. 그는 106- 인수 솔루션이 있다고 설명했을 때 놀랐고 최고의 솔루션을 찾는 것은 잘 알려진 계산적으로 다루기 쉬운 문제라고 놀랐습니다.

그래서 그것은 한 가지 예입니다.

물론 유용합니다.

템플릿 엔진에서 작업하는 개발자를 상상해보십시오. 당신은 일종의 것을 알고 있습니다 ...

Blah blah blah ${MyTemplateString} blah blah blah.

건방진 작은 정규 표현으로 교체품을 확인하기 위해 간단하게 시작합니다.

그러나 점차 템플릿은 조금 더 화려하게되며 개발자는 템플릿 목록 및 문자열지도를위한 기능을 포함합니다. 이를 달성하기 위해 그는 간단한 작은 문법을 작성하고 파서를 생성합니다.

매우 교활한 템플릿 엔진에는 결국 조건부 논리에 대한 구문이 포함되어있어 인수 값에 따라 다른 텍스트 블록을 표시 할 수 있습니다.

CS에 대한 이론적 배경을 가진 사람은 템플릿 언어가 서서히 튜링이 완료되고 있음을 인식하고 통역 패턴이이를 구현하는 좋은 방법 일 것입니다.

컴퓨터 과학자는 템플릿을위한 통역사를 구축 한 후 대부분의 템플릿 요청이 복제되어 동일한 결과를 반복해서 재생성한다는 것을 알 수 있습니다. 따라서 캐시가 개발되고 비싼 변환을 수행하기 전에 모든 요청이 캐시를 통해 라우팅됩니다.

또한 일부 템플릿은 다른 템플릿보다 훨씬 더 복잡하고 렌더링하는 데 훨씬 오래 걸립니다. 어쩌면 누군가가 각 템플릿의 실행을 추정하기 전에 아이디어를 얻을 수 있습니다.

하지만 기다려!!! 팀의 누군가가 템플릿 언어가 실제로 완료되면 각 렌더링 작업의 실행 시간을 추정하는 작업은 중단 문제의 인스턴스라고 지적합니다! Yikes, 그렇게하지 마십시오 !!!

실제로 이론에 관한 것은 모든 실천이 이론을 기반으로한다는 것입니다. 이론적으로.

내가 가장 많이 사용하는 것 :

  • 계산 복잡성은 우아하게 확장되는 알고리즘을 작성합니다
  • 메모리 할당, 페이징 및 CPU 캐싱 작동 방식에 대한 이해를 통해 효율적인 코드를 작성할 수 있습니다.
  • 데이터 구조 이해
  • 스레딩, 잠금 및 관련 문제에 대한 이해

Turing Machines 등에 대한 내용에 관해서는 그것이 우리 모두가 작동하는 제약을 정의하기 때문에 중요하다고 생각합니다. 감사하는 것이 중요합니다.

학습 대수 학습과 계산기 사용 방법의 차이점입니다.

대수를 알고 있다면, 동일한 문제가 다른 형태로 나타날 수 있다는 것을 알고 있으며 문제를보다 간결한 형태로 변환하는 규칙을 이해합니다.

계산기를 사용하는 방법 만 알고 있다면 (a) 이미 해결 된 문제, (b)를 해결할 수 없거나 (c)가 다른 문제 (해결 또는 해결 또는 해결 된 것과 같습니다. 해결되지 않은) 다른 형태이기 때문에 인식하지 못한다는

컴퓨터 과학이 물리학이라고 생각하는 척 ... 질문이 어리석은 것처럼 보입니까?

내 친구가 몇 가지 템플릿을 사용하여 언어 작업을 하고 있습니다.간단한 상담을 해달라고 요청받았습니다.논의의 일부는 템플릿 기능에 관한 것이었습니다. 왜냐하면 템플릿이 Turing 완전한 경우 VM과 같은 속성과 컴파일러가 이를 지원하는 방법/여부를 실제로 고려해야 하기 때문입니다.

내 이야기는 이렇습니다.오토마타 이론은 여전히 ​​관련성을 갖고 있기 때문에 여전히 가르쳐지고 있습니다.정지 문제는 여전히 존재하며 수행할 수 있는 작업에 제한을 제공합니다.

자, 이러한 것들이 C# 코드를 망치는 데이터베이스 기수와 관련이 있습니까?아마도 그렇지 않을 것입니다.그러나 더 고급 수준으로 이동하기 시작하면 뿌리와 기초를 이해하고 싶을 것입니다.

나는 일상적인 일에 직접 적용하지는 않지만 공식적인 컴퓨터 과학에 대한 나의 교육이 나의 사고 과정에 영향을 미쳤다는 것을 알고 있습니다. 나는 공식적인 접근 방식에서 배운 교훈이 있기 때문에 분명히 발병으로부터의 특정 실수를 피합니다.

그들이 배우는 동안 쓸모없는 것처럼 보일 수 있습니다. 그러나 나는 당신의 반 친구가 결국 그들이 가르친 것을 사용할 문제, 또는 적어도 그 뒤에있는 사고 패턴을 만날 것이라고 확신합니다.

왁스에 ... 왁스 오프 ... 왁스 오프 ... 왁스 ... 어쨌든 가라데와 어떤 관련이 있습니까?

한 작업에서 나는 그들이 사용하고있는 것과 너무 느리기 때문에 전기 분배 모델의 네트워크 추적 알고리즘을 개선하는 작업이 할당되었습니다. 3 상 네트워크는 본질적으로 3 개의 N- 트리였습니다 (전기 네트워크에서는 루프가 허용되지 않기 때문에). 네트워크 노드는 데이터베이스에 있었고 원래 팀 중 일부는 메모리 내 모델을 구축하는 방법을 알 수 없었기 때문에 각 단계에서 필터링하는 데이터베이스에서 연속적인 깊이 선택으로 추적을 수행했습니다. 따라서 변전소의 노드 10 개 노드를 추적하려면 최소 10 개의 데이터베이스 쿼리가 필요합니다 (원래 팀 구성원은 데이터베이스 Whizzes이지만 알고리즘에 대한 적절한 배경이 부족했습니다).

나는 데이터베이스의 3 개의 N- 트리 네트워크를 데이터베이스에서 노드 구조 어레이에 한 번 저장하고 N- 트리 관계가 이중으로 연결된 포인터를 사용하여 3 개의 이진 트리로 변환되는 데이터 구조로 변환 한 솔루션을 작성했습니다. 네트워크가 어느 방향 으로든 쉽게 추적 될 수 있도록 배열.

그것은 최소한 2 배 더 빠르고, 실제로는 3 배 더 빠르며, 실제로는 실력이 길었습니다.

슬픈 점은 알고리즘을 이해하기 위해 데이터베이스 및 VB에 대해 교육을받은 다른 프로그래머들에게 N- 트리, 이진 나무, 포인터 및 이중 연결 목록에서 수업을 실질적으로 가르쳐야한다는 것입니다.

"어떻게"와 "뭐"사이의 고전적인 이분법입니다. 반 친구들은 소프트웨어를 프로그래밍하는 "방법"을보고 있으며, 거의 초점에 초점을 맞추고 있습니다. 이러한 관점에서, 구현의 관점에서 볼 때, 상태를 정지시키는 것과 튜링 머신과 같은 것을 아는 것은 중요하지 않은 것 같습니다.

"어떻게"는 컴퓨터 과학과 관련이있는 실제 작업이 거의 없습니다. 실제로, 내가 아는 대부분의 성공적인 엔지니어는 아마도 실제 작업의 20 % 미만을 넣을 것입니다. "무엇을해야 할 일"은 훨씬 더 중요합니다. 이를 위해 컴퓨터 과학의 기초는 중요합니다. "당신이하고 싶은 것"은 구현보다 디자인과 훨씬 더 관련이 있습니다. 그리고 좋은 디자인은 ... 글쎄, "사소한"이라고 부르겠습니다.

"소프트웨어 디자인을 구성하는 두 가지 방법이 있습니다. 한 가지 방법은 부족이 없을 정도로 간단하게 만들고 다른 방법은 명백한 결함이 없도록 너무 복잡하게 만드는 것입니다. 첫 번째 방법은 훨씬 더 어렵습니다. . " - 자동차 호어

공부에 행운을 빕니다!

계산의 기본 모델을 이해하는 것이 유용하다고 생각합니다. 실제로 튜링 머신을 레지스터 머신으로 번역 할 필요가 없지만 실제로 두 가지 다른 문제가 실제로 같은 개념의 인스턴스라는 것을 알리는 방법을 배우는 것이 중요합니다. 기술.

대부분의 지식은 "실용적"이 아니지만 예상 할 수없는 방식으로 점들을 연결하거나보다 복잡한 아이디어를 설명하기위한 더 풍부한 어휘를 제공하는 데 도움이됩니다.

중요한 문제는 중요한 문제가 아니라 공부를 통해 배우는 원리입니다. 저는 매일 알고리즘, 데이터 구조, 프로그래밍 언어 및 운영 체제에 대한 개념을 사용합니다. 프로그래머로 일하면 시스템 성능에 영향을 미치는 항상 결정을 내릴 것입니다. 올바른 선택을하기 위해 기본 추상 개념에 견고한 기초가 있어야합니다.

획기적인 작업을 수행하는 회사에서 일하는 경우 건축가와 개발자에게 혜택이 무엇인지 전달하는 것이 중요합니다. 모든 종류의 기술에 대해 많은 과대 광고가 있으며 자신을 배치하는 것은 어려울 수 있습니다. 과학적이고 이론적 인 용어로 혁신을 구성 할 때 당신은 분명히 유리하며 고객은 당신이 진짜라고 생각합니다. 나는 사람들에게 말할 수 있습니다 : 국가, 인코딩 및 비 결정주의 (즉, 복잡성)를 다루는 새로운 방법이 있으며, 오늘날보다 더 생산적 일 수 있습니다.

이론에 대한 학습에서 경력에서 긴 견해를 취하면 깊이를 줄 수 있습니다. 깊이가 커집니다. 5 번째 또는 6 번째 프로그래밍 언어를 배우는 데 투자 수익은 2와 3 학습보다 훨씬 적을 것입니다. 이론에 대한 노출은 실제 공학, 자유도의 위치 및 올바른 트레이드 오프를 만드는 방법에 대한 감각을 줄 것입니다.

중요한 개념 1) 상태, 2) 인코딩, 3) 비정상주의. 당신이 그들을 모른다면 그들은 당신을 도울 것입니다. 이론이 제공해야 할 것은 큰 그림과 기본 개념이 어떻게 맞는 지에 대한 감각입니다. 직관을 연마하는 데 도움이 될 것입니다.

예 : 위의 일부 답변 중 일부는 정지 문제와 튜링 머신을 언급합니다. 대학에서 Turing의 논문을 발견했을 때 나는 전혀 깨달은 느낌이 들지 않았습니다. 어느 날 나는 Goedel의 불완전 성 정리와 Goedel 번호를 발견했습니다. 상황이 많이 시작되기 시작했습니다. 몇 년 후 나는 서점에서 Georg Cantor에 대해 읽었습니다. 이제 저는 튜링 머신과 중단 문제를 이해하기 시작했습니다. Wikipedia에서 직접 시도하고 "Cantor 's Diagonal Argument"를 찾아보십시오. 그것은 당신이 지금까지 만나게 될 지적으로 가장 멋진 것 중 하나입니다.

음식을위한 음식 : 전형적인 튜링 머신만이 상태 전환 기계를 설계하는 유일한 방법은 아닙니다. 하나의 테이프가 아닌 두 개의 튜링 머신은 여러 알고리즘에 대해 훨씬 더 속도를 제공합니다. http://www.math.ucla.edu/~ynm/papers/eng.ps

이 책을 더 효율적으로 이러한 통찰력에 노출시킬 수 있습니다. 이 게시물의 맨 아래에 링크하십시오. (최소한, 아마존의 목차를 확인하여 이것이 무엇인지 맛보는 것을 맛보십시오) : :

나는 Rosenberg Sensational의 책을 발견했습니다. http://www.amazon.com/the-pillars-computation-theory-nondeterminism/dp/0387096388 이론 IMHO에 관한 책이 하나만 있다면 이것이 한 권의 책이어야합니다.

CS를 졸업 한 후에도 비슷하게 생각했습니다. 우리가 연구 한 이론 전체는 실제로 쓸모가 없습니다. 이것은 짧은 시간 동안 옳은 것으로 판명되었지만 복잡한 작업을 다루는 순간 이론은 실천보다 더 가치가 있습니다. 몇 년 동안 코딩을 한 후 모든 사람은 "작동"하는 일부 프로그램을 작성할 수 있지만 모든 사람이 방법을 이해할 수있는 것은 아닙니다. 우리 대부분이 특정 시점에서 성능 문제, 네트워크 지연, 정밀성, 확장 성 등을 처리 하더라도이 단계에서 이론은 중요합니다. 복잡한 시스템을 다룰 때 좋은 솔루션을 설계하려면 메모리 관리가 어떻게 작동하는지, 프로세스 및 스레드의 개념, 메모리가 할당되는 방법 또는 성능 등의 효율적인 데이터 구조를 아는 것이 매우 중요합니다.

예를 들어 한 번은 많은 수학적 계산을 포함하여 프로젝트를 진행하고 있었으며 특정 시점에서 소프트웨어가 실패했습니다. 디버깅하는 동안 일부 수학적 작업 후에는 값 1.000000000002의 두 배로 숫자를 받았지만 수학적 관점에서 프로그램의 일부 단계에서 전설적인 단계에서 수학적 관점에서 볼 수는 없었습니다. 예외. 나는 이것을 알아 내기 위해 시간을 보냈지 만 내가 더 많은 관심을 기울 였다면 "이중 및 플로트의 근사"나는 그 시간을 낭비하지 않았을 것입니다.

나는 매일 그것을 사용하지 않습니다. 그러나 그것은 매일 저를 도와주는 많은 이해를주었습니다.

나는 CS 이론적 세계에서 매일 행복에 필요한 모든 것이 "낮은 커플 링과 높은 응집력"의 발언이라는 것을 알았습니다. Roger S. Pressman 전에 학문적으로 만들었습니다 스티브 맥코넬 그것을 유행하게 만들었습니다.

YA, 나는 일반적으로 상태 다이어그램을 사용하여 프로그램의 모양과 흐름을 설계합니다. 일단 이론적으로 작동하면 코딩 및 테스트를 시작하여 미국을 확인하면서 주를 확인합니다.

나는 또한 그들이 다른 사람들에게 과정의 행동을 설명하는 유용한 도구라는 것을 알았습니다.

단순한. 예를 들어 : 내가 사용하는 경우 rsacryptoserviceprovider 나는 그것이 무엇인지, 왜 그것을 믿을 수 있는지 알고 싶습니다.

C ++ 템플릿은 실제로 일종의 람다 미적분학이기 때문입니다. www.cs.nott.ac.uk/types06/slides/michelbrink_types_06.pdf를 참조하십시오

저는 지금 분산 알고리즘 과정을 공부하고 있습니다.내결함성에 관한 장이 있으며 여기에는 분산 알고리즘이 이를 올바르게 처리할 수 있도록 얼마나 많은 프로세스가 실패(또는 오작동)할 수 있는지에 대한 상한에 대한 몇 가지 증명이 포함되어 있습니다.

많은 문제의 경우 오작동하는 프로세스의 한계는 전체 프로세스 수의 최대 1/3입니다.(주어진 가정 하에서) 더 나은 알고리즘을 개발하려고 시도하는 것이 무의미하다는 것을 알고 있기 때문에 이것은 제 생각에는 매우 유용합니다.

이론적 과정이 직접 사용되지 않더라도 무언가를 더 잘 생각하는 데 도움이 될 수 있습니다.

Jeffrey L Whitledge가 말했듯이 상사가 무엇을 요구할지 모르겠습니다.

솔직히 말해서, 나는 여기에 많은 답변에 동의하지 않습니다. 나는 첫 번째 컴파일러를 썼다 (재미; 나는 진짜 컴파일러에서 코스를 수강하지 않고 너무 많은 커피/자유 시간을 보내십시오); 기본적으로 방금 다른 컴파일러의 코드를 스캔하고 패턴을 따랐습니다. 나는 내 머리 위에서 C에 구식을 쓸 수 있었지만 내 인생이 그것에 의존한다면 푸시 다운 오토 마톤을 그리는 방법을 기억할 수 없다고 생각합니다.

장난감 (명령 적) 프로그래밍 언어에 타입 추론을하고 싶었을 때, 나는 아마도 먼저 5 개의 논문을 살펴보면서 "타이핑 된 람다 미적분학"이라는 것을 쳐다 보면서 .... **** ....? 처음에 나는 "일반 변수"와 "비 유전자 변수"로 무언가를 구현하려고 시도했지만 무슨 일이 일어나고 있는지 전혀 몰랐습니다. 그런 다음 모든 것을 폐기하고 며칠의 사고로 필요한 모든 것 (하위 유형, 일류 함수, 매개 변수화 된 유형 등)을 지원하여 실질적으로 구현할 수있는 방법을 알아내는 노트북과 함께 앉았습니다. & 테스트 프로그램을 작성하면서, 나는 이론적 인 쓰레기를 알아 내려고 몇 주 이상을 날려 버렸습니다.

컴퓨팅의 기본 사항 (예 : 가상 메모리 작동 방식, 파일 시스템 작동 방식, 스레딩/스케줄링, SMP, 데이터 구조)을 모두 알면 모두 매우 유용한 것으로 판명되었습니다. 복잡성 이론과 big-o 물건은 때때로 유용한 것으로 판명되었습니다 (특히 RDBMS 디자인과 같은 것들에 유용함). 정지 문제와 자동화/튜링 머신 이론? 절대.

나는 이것이 오래되었음을 알고 있지만, 이론이 '쓸모 없다'고 주장하는 사람들에 대한 나의 짧은 대답은 다음과 같습니다.

근본적인 이론이 없으면 있습니다 아니요 관행.

이론이 유용한 이유는 무엇입니까?

이론은 다른 것들이 구축되는 기본 기초입니다. 이론이있을 때 적용된, 실습은 결과입니다.

오늘 컴퓨터를 고려하십시오. 오늘날 공통 컴퓨터는 튜링 머신 위에 모델링되고 제작되었으며,이를 간단하게 유지하기 위해 계산을위한 추상적/이론적 모델입니다. 이 이론적 모델은 다음에 있습니다 기초 고급 서버에서 포켓 폰에 이르기까지 오늘날 우리가 사용하는 모든 컴퓨팅 장치는 기본 기초가 건전하기 때문에 작동합니다.

알고리즘 분석을 고려하십시오. 간단히 말해서, 알고리즘 분석 및 시간 복잡성 이론은 문제 (예 : P, NP, Exp 등)와 다른 클래스에서 다른 문제를 해결하려고 할 때 알고리즘이 어떻게 행동했는지를 분류하는 데 사용되었습니다.

친구 중 한 명이 X에서 일자리를 얻는다 고 가정하고있는 동안 관리자는 다음과 같은 몇 가지 간단한 요청을합니다.

예 1 : : 1. 우리는 여러 주에 걸쳐 다른 도시를 방문하는 대규모 배송 차량이 있습니다. 우리는 필요합니다 각 차량의 가장 짧은 경로가 무엇인지 파악하고 최적 모든 가능성 중 하나. 당신은 그것을 할 수 있습니다?

이론이 '쓸모없는'이라고 생각하면 친구들이 여행하는 세일즈맨 문제 (TSP)가 방금 주어 졌다는 사실을 깨닫지 못하고 두 번째 생각 없이이 시스템을 설계하기 시작하면 순진한 점검 시도를 발견하기 만하면됩니다. 모두 원래 요청한 바와 같이 가능성은 실질적인 목적으로 시스템이 사용할 수 없다.

사실, 그들은 가지고 있습니다 왜 그런지 모르겠습니다 이 시스템은 5 개 도시를 점검 할 때 "허용 가능한"수준에서 작동하지만 10 개 도시에서는 매우 느리게 진행되며 40 개 도시까지 올라갈 때 동결됩니다. 그들은 그것이 그럴만 한 이유입니다 "5 개 도시 테스트보다 2x 및 8x 더 많은 도시"와이 프로그램이 단순히 단순히 "2x와 8x 더 많은 시간"이 필요하지 않은 이유가 궁금합니다.

이론을 이해하면 적어도 한눈에 다음을 깨닫게 될 수 있습니다.

  1. TSP입니다
  2. TSP는 NP-HARD입니다
  3. 그들의 알고리즘의 성장 순서는 다음과 같습니다 에!)

숫자는 스스로 말합니다.

+--------------+-------+-----------------------------------------------------------------+
|  No. Cities  | O(N!) |  Possibilities                                                  |
+--------------+-------+-----------------------------------------------------------------+
|       5      |   5!  | 120                                                             |
|      10      |  10!  | 3,628,800                                                       |
|      40      |  40!  | 815,915,283,247,897,734,345,611,269,596,115,894,272,000,000,000 |  <-- GG
+--------------+-------+-----------------------------------------------------------------+

그들은 처음에 그들의 시스템이 ~ 아니다 그들이 상상했던대로 일하러갑니다. 이 시스템은 나중에 실용적이지 않은 것으로 간주되었고 상당한 시간, 노력 및 기타 자원이 할당되어 궁극적으로 프로젝트를 낭비한 후에는 "이론이 쓸모 없다"고 생각했습니다.

이 실패 후, 관리자들은 "음, 아마도 그 시스템이 과소 평가되었을 수도 있습니다. 결국 우리나라에는 많은 도시가 있고 컴퓨터는 최근에 취소 된 시스템에 필요한 것만 큼 빠르지 않습니다. 성공했습니다. "

경영진은 프로젝트 실패의 원인으로 컴퓨터를 느리게 비난합니다. 결국, 그들은 CS 이론의 전문가가 아니며, 그럴 필요는 없으며, 주제에 대한 전문가가되어야하고 그들에게 알릴 수있는 사람들은 그렇지 않았습니다.

그러나 그들은 또 다른 프로젝트를 염두에두고 있습니다. 실제로 더 간단한 것. 그들은 일주일 후에 와서 다음을 묻습니다.

우리는 몇 개의 서버 만 가지고 있으며, 알 수없는 이유로 인해 무한한주기가 끝나고 서버를 내려 놓는 프로그램을 계속 제출하는 프로그래머가 있습니다. 우리는 필요합니다 제출중인 코드를 처리하고 제출 된 프로그램이 실행 중에 무한주기를 유발하는지 여부를 감지하는 프로그램을 작성하고 제출 된 프로그램 이이 기준으로 실행 될 수 있는지 여부를 결정합니다. 당신은 그것을 할 수 있습니다?

사랑하는 친구는 다시 도전을 받아들이고 즉시 일하러갑니다. 몇 주 동안 일한 후에는 결과가없고 친구는 스트레스를 받고 무엇을 해야할지 모릅니다. 또 다른 실패 ... 당신의 친구는 이제이 "간단한 문제"를 해결할 수 없었기 때문에 "멍청한"느낌이 듭니다 ... 결국, 요청 자체가 그것을 만들었습니다. 소리 단순한.

불행하게도, 당신의 친구는 "이론은 쓸모 없다"고 주장하면서 간단한 요청이 실제로 낙관적 인 문제 (즉, 중단 문제 자체)에 대한 다루기 어려운 문제였으며, 그것에 대한 알려진 해결책이 없다는 것을 깨닫지 못했습니다. 불가능한 일이었습니다.

따라서 특정 문제를 해결하기 위해 작업을 시작하더라도 피할 수 있고 예방할 수있는 실수였습니다. 이론적 인 틀이 요청 된 것을 이해하기위한 이론적 틀이 있었다면, 그들은 다른 것을 제안 할 수 있었고 달성 가능, 솔루션 ... 예를 들어 간단한 모니터링 프로세스 구현과 같은 kill -SIGTERM <id> 누구의 사용자 특정 가정 하에서 일부 임의/합리적인 간격에 대해 CPU를 독점하는 프로세스 (사용자 목록에 따라) 프로세스 (예 : 모든 프로그램 실행이 10 분 이내에 종료되어야한다는 것을 알고 있으므로 20 분 이상 실행되는 인스턴스가 있어야합니다. killed).

결론적으로, 이론없이 연습은 기초가없는 건물과 같습니다.. 조만간, 직각으로부터의 적절한 압력은 그 자체로 붕괴됩니다.. 예외 없음.

일상적인 코딩에서 사용해 본 적이 있습니까?

예,하지만 아닙니다 곧장. 오히려 우리는 그것에 의존합니다 간접적으로. 여기서 경고는 작업중인 문제 영역에 따라 다른 이론적 개념이 다소 적용 가능하다는 것입니다.

확실히, 우리 :

  1. 컴퓨터를 사용하여 컴퓨터를 사용하여 컴퓨터 모델에 의존합니다 (예 : Turing Machines)
  2. 계산 가능성 이론 (예 : 계산 가능) 및 Lambda Calculus (예 : 프로그래밍 언어)에 의존하는 코드 쓰기
  3. 컬러 디스플레이 및 인쇄 등에 대한 색상 이론 및 모델 (예 : RGB 및 CMYK 색상 모델)에 의존하십시오.
  4. 컴퓨터 그래픽에서 Euler의 정리를 통해 행렬을 만들 수 있도록 임의 축에 대한 물체를 회전시키는 등 ...

단순히 누군가가 사실입니다 사용 비행기는 비행기를 처음부터 건축하고 날아갈 수있는 이론을 이해할 필요가 없습니다 ... 그러나 누군가가 예상되는 경우 짓다 기계를 사용하고 작동하게합니다 ... 비행의 원칙조차 이해하지 못하는 사람으로부터 좋은 결과를 기대할 수 있습니까?

Wright Brothers가 비행에 대한 특정 이론적 개념을 이해하고 실천할 때까지 대부분의 역사에서 비행기를 만들 수 없었던 것은 우연의 일치입니까?

우연이 아닙니다. 우리는 오늘날 많은 작업 기술을 가지고 있습니다. 사람들이 처음부터 일할 수있는 이론적 원칙을 이해하고 적용했기 때문에 많은 작업 기술이 있습니다.

나는 그것이 당신이 어떤 필드에 들어가는 지에 달려 있다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top