내가 알아야 할 컴퓨터 과학 이론은 무엇입니까? [닫은]


27

함은 전자 공학이 아닌 컴퓨터 과학 학위를 가진 사람으로 말하자면, 무엇 하나의 비트 내가 알아야 할 컴퓨터 과학이 나를 더 나은 만들기 위해 현실 세계의 프로그래머?

(실제로 나는 프로그래머로서 일상 업무에서 사용하고 이익을 얻을 수있는 것을 의미합니다. 예를 들어 데이터베이스 정규화를 이해하는 것이 많은 종류의 빠른 정렬을 이해하는 것보다 실용적이라고 제안합니다 라이브러리).


42
1 (죄송합니다)
haylem

5
아, 또는 가장 중요한 것! (지금 가겠습니다 ...)
haylem

이론적 인 컴퓨터 과학 스택 교환은 복잡성, 데이터 구조 및 알고리즘이라는 다른 모든 사람들이 언급 한 것을 확인합니다. cstheory.stackexchange.com/tags
chrisaycock

2
이 질문에 반대 할 필요가 있다고 생각합니다. 배우기에 충분한 "1 비트"가 없으며, 더 중요한 것은 "가장 중요한"비트가 없습니다 (IMHO). CS에 똑같이 필수적인 여러 측면이 있습니다 (다시 IMHO) . 따라서이 질문에 대한 답변이 흥미로울 수 있지만 질문이 더 잘 공식화 될 수 있다고 생각합니다.
Konrad Rudolph

1
만약 당신이 아직 영어를 가지고 있지 않다면, 나는 불리언 논리 나 이산 수 이론을 말했을 것입니다. 거의 모든 글 ifloop진술은이 두 가지 연구 영역의 하위 집합을 사용합니다.
Steven Evers

답변:


52

어려운 결정 인 하나의 비트 만 선택해야한다면 Big O 표기법을 사용하십시오 . O (n), O (ln n), O (n²), O (2 ^ n), O (n!)의 의미를 이해하면 값 비싼 실수를 피하는 데 도움이됩니다. 테스트 환경이지만 프로덕션 환경에서 비참하게 실패합니다.


2
+1과 나는 O (n ^ 2)가 O (lg n)보다 더 나쁘다는 것을 아는 것 (예를 들어)이 주어진 코드 조각에 대해 Big-O 를 도출 하는 방법을 아는 것이 더 중요하다고 말하고 싶습니다 .
Dean Harding

3
강하게 동의하지 않습니다. 이 내용은 비교적 사소한 것이며 CS에는 더 흥미로운 주제가 있습니다. 또한, 나는 대부분의 사람들이 복잡성을 직관적으로 생각한다고 생각하지만, 그것들을 복잡성이라고 부르지 않을 수도 있고 그것을 이차, 지수 등이라고 부를 수도 없습니다.
Magnus Wolffelt

Magnus : 내 경험상 프로그래밍이 아닌 사람들 대부분은 복잡성에 대해 전혀 생각하지 않고 모든 문제에 대해 직관적으로 O (n)을 가정합니다.
user281377

아직 공식적으로 필요하지 않습니다.
CaffGeek

1
차드 : 지나치게 공식적인 Big O-notation에 대해서는 아무 것도 없지만, 이름이 없으면, 그런 것들에 대해 거의 생각할 수 없으며 동료들과 그것에 대해 이야기하지는 않습니다.
user281377

19

이것은 질문입니다. 모든 사람들이 다른 대답을 할 것입니다. 저는 이렇게 말할 것입니다 : 복잡도 이론은 알고리즘과 데이터 구조와 같은 프로그래머로서 직접 배우지는 않지만 작업에 영향을 줄 수있는 가장 중요한 부분입니다. 문제가 입방체 복잡성을 가지고 있다는 것을 알면 도움이됩니다. 문제 크기가 커지면 문제가 심각하게 확장된다는 것을 알고 있습니다.


간단한 언어로 쉽게 해결할 수있는 문제를 해결하고 있는지 알면 많은 도움이 될 것입니다.
철학

복잡성은 개념으로서 중요하지만 실제로는 계산하지 않는 경우가 많습니다. 덜 복잡한 것을 이해하는 것이 중요합니다.
Bill

@ 빌 : 맞습니다. 그러나 그 부분은 반드시 실천을 통해 얻을 수있는 것은 아닙니다. 이론은 그 부분에 매우 도움이됩니다.
Mnementh

12

데이터 구조, 알고리즘 및 복잡성에 대해 알아보십시오.

기계가 무한한 힘을 가진 마법의 상자가 아니라는 것을 이해하는 것만으로는 충분하지 않습니다. 당신은 그것에 아무것도 던질 수 없으며 밀리 초 만에 그것을 크런치 할 것으로 기대합니다. 당신이 알고있는 한계가 있습니다. 코드로 테스트하지 않는 법을 배워야합니다.

또한 프로그래밍에서 특정 설계 문제를 해결하기위한 일반적인 접근 방법을 살펴보십시오. 즉 디자인 패턴. 그들이 의사 소통하는 아이디어를 숭배하지 마십시오.

데이터베이스 모델링에 대한 지식도 필수적입니다.

그 후 핵심 개념을 구현하거나 구현할 수있는 프로그래밍 언어, 프레임 워크 및 라이브러리가 다릅니다. 마음에 드는 것을 골라 연습하세요.


세부 사항-많은 알고리즘과 데이터 구조가 있습니다.
Jon Hopkins

사물에 대한 아이디어를 얻을 수있는 기본적인 것들입니다. 두껍지 않은 책을 집어 들어보세요.

1
그것은 하나 이상의 비트입니다.

7

이것은 약간 어려운 질문입니다.

컴퓨터 과학의 모든 측면은 어떤 식 으로든 중요합니다.

당신이 매일 혜택을 얻는 것에 관해서는, 아마도 코드에서 CPU에 이르기까지 코드가 어떻게 작동하는지에 대한 일반화 된 개요 일 것입니다.

Big O 표기법을 이해하는 것이 중요하며, 실제 상황에서 코드 실행 방법을 이해하는 것도 매우 중요합니다.


7

예, 이로 인해 몇 시간 동안 생각하게되었습니다.

그 과정에서 여기에 주어진 일반적인 답변 중 일부를 제거해야했습니다.

목록 없음

  1. 큰 O (n) 표기법 . 여기에 넣기는 어렵지만 아니요. 비 점수 알고리즘 분석을 원격으로 들리지 않고도 직관적으로 비 효율성을 해결하고 다양한 절차를 비교할 수 있습니다.

  2. 기능적 언어 아니요, 단일 언어 군은 문제에 대한 하나의 접근법입니다. 이 비트 만 중요한 이유는 무엇입니까?

  3. 정지 문제 일부는 너무 구체적이며 사람들은 자신이 존재한다는 것을 모르고 인생을 살았습니다.

  4. 들어 당신이 다음 듣지 않을 당신이 당신의 자신의 세계에 살고 있다면. 반드시 해로운 것은 아닙니다!

  5. 소프트웨어 개발주기 아니! 우리는 여전히 놀라운 소프트웨어 나 독창적 인 영웅적 노력으로 넘어갈 수 있습니다.

  6. 복잡성 이론 나는 이것이 될 수 있다고 생각하지만 모든 형식주의가 없다.

Comp Science의 아이디어

나는 " 추상화 추상화 추상화 ... " 라고 말할 것 입니다. 그것에 대해 배우십시오. 주변의 예제를보고이를 사용하여 빌드하는 방법을 배우십시오. 어디에나 있습니다. 컴퓨터 과학, 엔지니어링 및 응용 프로그램의 전체는 추상화 계층의 레이어처럼 보입니다.

이 사실을 알면 주변을 둘러 보는 법을 배우기 시작합니다.

당신이 사용하는 어떤 사람을 볼 때 list insertionpython그리고 not append당신이 파이썬 목록이 삽입은 비용이 많이 들고 APPEND 저렴 배열 추상화를 사용하여 구축 알고 있기 때문에, 당신은 미소.

이것은 하나의 예일뿐입니다.


많은 생각을했던 답변에 +1.
Jon Hopkins

중단 문제에 대한 귀하의 의견에 대한 의견 : "기존을 알지 못하는 생활"은 모든 컴퓨터 과학 주제에 해당됩니다.


3

데이터 구조의 경쟁적인 사용 사례.

성능을 보장하기 위해 빨강-검정색 나무가있는 맵이 필요한 경우와 성능을 보장하기 위해 어레이를 사용할 수없는 경우가 있습니다. 귀중한 기술인 데이터 구조를 언제 선택할지 아는 것.


3

중요한 숫자는 세 가지뿐입니다.

  • 제로
  • 하나
  • 많은

그러나 '3'도 중요하다는 것을 의미하지 않습니까?
Javier

0, 1 및 무한대 여야합니다. en.wikipedia.org/wiki/Zero_One_Infinity
Thomas Owens

@Javier : 3은 많은 부분 집합이다
스티븐 A. 로우

@ 토마스 : 누가 말한다?
Steven A. Lowe

@Steven 내 이해는 100 %가 아닐 수도 있지만 아이디어는 당신이 아무것도, 하나의 것, 또는 당신이 묶어야 할 것들의 수를 가지고 있지 않다고 생각합니다. 인스턴스를 하나 이상으로 제한하지 않는 경우 인스턴스를 제한해서는 안됩니다. 그러나 이것이 왜 그런지 완전히 확신하지 못합니다 (제로 / 원 / 무한 개념에 대해 막연하게 익숙합니다).
Thomas Owens

3

CS에서 (그리고 수년간 개발자와 건축가로서) 배운 가장 중요한 것은 기능이 아닌 변동성에 따라 문제를 해결할 수 있다는 것입니다. 모든 우수한 디자인은 휘발성을 분리하고 캡슐화합니다. 모든 훌륭한 개발자 / 아키텍트는 생각에 공식화하지 않더라도 직관적으로이 작업을 수행합니다. 프로젝트 실패의 큰 이유는 변동성에 따라 문제를 분류하고 캡슐화하지 못하는 것입니다. 변동성을 캡슐화하지 못하면 필연적으로 복잡성과 프로젝트 실패가 사라집니다.


변동성이란 정확히 무엇을 의미합니까?
amara

3

중단 문제

컴퓨터 로 해결할 수없는 컴퓨터 관련 문제가 있다는 사실 .


3

다루고있는 문제가 공식 언어의 계층 구조에 속하는 곳을 알 수있을만큼 충분한 오토마타 이론을 알아야합니다. 이를 통해 REGEX를 사용하여 HTML을 구문 분석하지 말아야하는 이유 (HTML은 설명을위한 컨텍스트 프리 문법이 필요함)와 달리 C ++을 컴파일하는 데 시간이 오래 걸리는 이유와 같은 몇 가지 중요한 실용적인 용도를 알아낼 수 있습니다. Java 또는 C # (C ++에는 Turing 시스템이 필요하지만 Java 및 C #은 컨텍스트 프리 문법으로 설명 할 수 있음).

공식 언어의 가장 중요한 계층은 가장 약한 것부터 가장 강한 것까지입니다.

  1. 유한 오토마타 또는 REGEX로 구문 분석 할 수있는 언어 (역 참조를 사용한 REGEX 구현은이 범주보다 강력하지만 여전히 범주 2의 모든 것을 구문 분석 할 수는 없음)

  2. 스택 메모리 또는 컨텍스트가없는 문법이있는 오토마타로 구문 분석 할 수있는 언어

  3. 튜링 머신에서 파싱 할 수있는 언어 또는 랜덤 액세스 메모리가있는 오토마타.


음 .. 아니야. 정규식은 정규 문법을 구문 분석합니다. 그것은 유한 한 상태 오토마타에 의해 받아 들여질 수있는 문법의 범주입니다. 그리고 'Chomsky Grammar'는 컨텍스트 프리 문법을 독점적으로 언급하지 않으며, 이것이 스택 머신이 처리하는 것입니다.
철학자

@philosodad-문맥 자유 문법이 더 정확하며 용어를 사용하도록 게시물을 업데이트했습니다. 정규식에 대해 말한 내용에 대한 귀하의 문제를 이해하지 못합니다.
Dan Monego

@ Dan-내 문제는 정규 표현식이 유한 상태 오토 마타만큼 강력하다는 것입니다. 결정적 컨텍스트가없는 모든 문법을 기계로 구문 분석 할 수 있다면 모든 결정적 컨텍스트가없는 문법을 구문 분석 할 수있는 것보다 낫습니다.
철학자

또는 더 정확하게 말하자면 스택이 필요하거나 필요하지 않습니다. 언어를 구문 분석하기 위해 스택이 필요한 경우 언어를 구문 분석하기위한 스택이 있어야하므로 언어에서 구문을 분석하기 위해 스택이 필요한 경우 해당 언어를 구문 분석 할 수 있습니다.
철학자

@philosodad-정규 표현식에는 이론적으로 정규 표현식과 소프트웨어에서 구현되는 정규 표현식의 두 가지 유형이 있습니다. 이론적 인 정규 표현식에 대해서는 맞지만 대부분의 구현에는 이론적 근거를 넘어 여러 기능이 있으며, 소수 이외의 경우 a ^ n과 같은 일부 비정규 언어와 일치 할 수 있습니다. 이것이 실제로 이론에 관한 실이기 때문에, 나는 공식적인 정의와 야생에서 사용 된 정의 사이에 차이가 있다고 언급하기 위해 나섰습니다.
Dan Monego

2

자율 주행 이론과 정보 이론에 대한 답을 드리겠습니다.

또는 오래 전에 하드웨어 컨설턴트로부터 배운 내용을 알려줄 수 있습니다.

  • "충분히 충분하다"는 충분하지 않습니다.

1

소프트웨어 개발 라이프 사이클 은 아직 아는 것이 아니라고 제안하는 것입니다. 이것은 2 학년 컴퓨터 과학 과정에서 소개되었으며 소프트웨어 프로젝트 내에서 반복적으로 사용되는 것입니다. 이 방법은 프로젝트가 처음부터 끝까지 어떻게 진행되는지에 대한 일반적인 아이디어를 얻는 데 유용 할 수 있지만보다 심층적 인 정보를 원할 경우보다 구체적인 지식을 얻기 위해 연구 할 수있는 Waterfall 또는 Agile과 같은 방법론이 있습니다.


2
머피의 법칙 : 잘못 될 수있는 것, 잘못 될 것
Richard

그것은 CS 이론이 아니지만 이것은 훌륭한 답변입니다.
justkt

1

프로그램 작성

수학 및 컴퓨터 과학 부서에서 Hobart와 William Smith Colleges는 컴퓨터 과학 124 프로그래밍 소개 :

제어 구조, 객체, 클래스, 상속, 간단한 데이터 구조 및 소프트웨어 개발의 기본 개념이 포함됩니다.

프로그래밍 할 수없는 경우 실제 컴퓨팅에 그리 멀지 않습니다.

그리고 네, 프로그래머라고 지적했습니다. 이것은 프로그래밍 이론에 대한 전반적인 지식과 사용 가능한 다른 접근 방식을 향상시키기위한 것입니다.

우리가 알고있는 프로그래밍 컴퓨터 과학인가?

프로그래밍이 엄격하게 컴퓨터 과학은 아니라고 지적한 @Thomas Owens의 의견에 따라 Wikipedia의 Computer Science 기사 에서 인용하고 싶습니다 .

... 컴퓨터 과학의 초점은 게임 및 웹 브라우저와 같은 소프트웨어를 구현하는 데 사용되는 프로그램의 속성을 이해하고 새로운 프로그램을 만들거나 기존 프로그램을 개선하기 위해 그러한 이해를 사용하는 것입니다.

따라서 제가 읽은대로 프로그래밍하면 프로그래밍 이론에 대한 이해를 보여줍니다. 이는 다른 사람들이 함께 할 수있는 단순하고 우아한 코드를 만드는 데 도움이됩니다.


프로그래밍은 CS 이론이 아닙니다. 사실, 나는 프로그래밍이 컴퓨터 과학이 아니라고 쉽게 주장 할 수있다.
Thomas Owens

@Thomas Owens 유효한 주장을 뒷받침하기 위해 답변을 업데이트했습니다. 그것을 검토하고 당신의 생각을 알려주시겠습니까?
게리 로우

1
여전히 프로그래밍이 CS라고 생각하지 않습니다. 프로그래밍은 알고리즘 또는 데이터 구조를 구현하려는 컴퓨터 과학자에게 유용 할 수 있지만 CS 이론의 주제 (내 소개에서 CS 이론 서적에 이르기까지 더 고급 주제가있을 수 있음)에는 논리, automata 이론, 그래프 이론이 포함됩니다. , 계산 가능성, 계산 복잡성 및 알고리즘 분석. 또한 프로그래밍 언어 (언어의 설계 및 구현에 대한 이론)도 컴퓨터 과학의 일부라고 말합니다. 그러나 훌륭한 컴퓨터 과학자가되기 위해 프로그램을 작성할 필요는 없습니다.
Thomas Owens

@ 토마스 오웬스 나는 당신의 요점을보고, (순수한 모자를 쓰고) 동의합니다. 그러나 OP는 현실 세계에서 그를 도울 1 비트의 CS를 요구하고 있습니다. 나는 좋은 이론으로 프로그래밍 이론이 1 비트라는 내 견해를 고수한다. 그에 따라 약간 편집했습니다.
Gary Rowe

네. CS에서 프로그래밍 언어와 패러다임을 이해하면 도움이 될 수 있습니다 (특히 DSL을 구현하고 있지만 절차, 기능, OO, 논리와 같은 많은 패러다임을 알고 있으면 소프트웨어 개발에 도움이됩니다). 알고리즘과 데이터 구조를 이해하면 가장 효율적인 방법으로 문제를 해결하기 위해 올바른 것을 선택하는 데 도움이됩니다. Automata 이론이 도움이 될 수 있습니다 (한 번 거대한 FSM 인 시스템으로 작업했지만 이것이 얼마나 흔한 지 모르겠습니다). 따라서 데이터 구조, 알고리즘 및 PL 이론이 CS에서 알아야 할 가장 유용한 것입니다.
Thomas Owens

1

Konrad Rudolph와 의견이 맞지 않습니다. 더 나은 "실제 프로그래머"를 만들기 위해 알아야 할 "1 비트"의 컴퓨터 과학이 있습니다. 당신이 여기에 오는 답변에서 다른 것을 가져 오지 않으면 적어도 이것을 고려하십시오-요구 사항을 충족시키는 것은 고객을 만족시키는 것과 같지 않습니다! 최종 사용자는 항상 생각하거나 코딩하지 않은 방식으로 프로그램을 사용하려고합니다. 항상, 항상, 항상

따라서 더 나은 프로그래머가 되려면 먼저 들어야합니다. 클라이언트의 말을 듣습니다. 그들의 요구를 들어라. 그들이 원하는 것을 들어라. 특히, "기술적 가치"수준을 들으십시오. 나는 정확히 요청 된 것이지만 고객이 실제로 무엇을 원했던 것이 아닌 프로젝트가 몇 번이나 보 였는지 말할 수 없다. 요구 사항을 수집하는 프로그래머가 실제로 듣지 않았기 때문입니다.

UI 디자인에 대한 배경 지식이 없으면 다른 사람이 UI를 디자인하도록 유도하십시오. 프로그래머가 UI를 설계 한 전문가가 아닌 앱을 항상 찾을 수 있습니다. 논리적이고 당신에게 의미가있는 것은 클라이언트에게는 의미가 없습니다. 그리고 고객이 기술에 정통하지 않고 (누가 누구입니까?), "기능적으로 정확하지만 심미적으로 추악한"솔루션은 디너 파티에서 스 unk 크의 따뜻함을 만날 것입니다.


3
이 답변은 홉킨스가 요구 한 CS 이론을 다루지 않습니다.
James

1

기능적 언어!

기능적 언어를 학습하면 단계 및 명명 된 변경 가능 상태 (변수)가 아니라 표현의 관점에서 생각하게됩니다. 이는 일상적인 프로그래밍 문제를 효과적으로 처리 할 수있는 능력에 중요한 영향을 미칩니다. 특히 현재 거의 모든 대중 언어에 기능적 기능이 있습니다.

알고리즘과 복잡성 이론도 중요하지만 일반적으로 이미 알고 있고 추론 할 수있는 것들에 이름을 붙일 수 있다는 점에서 다소 흥미롭지 않습니다.


0

그 컴퓨터는 본질적으로 패턴 매 처일뿐입니다. 패턴 가공을 설명하는 고전적인 컴퓨터 과학 개념 인 튜링 머신으로 모든 것이 요약됩니다.


-2

문제 해결과 계속 학습하려는 욕구!

빠른 정렬 및 데이터베이스 정규화를 아는 것보다 훨씬 나아졌습니다.


6
그것은 컴퓨터 과학 이론이 아니며 전자 공학 (또는 거의 다른 형태의 공학)에도 동일하게 적용됩니다.
Jon Hopkins

내가 보는 방식은 빠른 정렬을 알고 귀하의 모범을 고려하는 것이 도움이되지 않습니다. 그것이 존재하고 그것이 무엇인지 특별하다는 것을 아는 것이 도움이되지만, 내가 그것에 대해 아무것도 모른다면 Google 검색에서 멀리 떨어져 있습니다. 알고리즘을 아는 것도 도움이되지 않습니다. 그러나 하나를 만들고 해석하는 방법을 아는 것입니다! 아마도 대답을 바꿀 수 있다면 아마도 복잡성이 가장 중요 할 것입니다.
브라이언 해링턴

1
필요하거나 존재하지 않는 것을 알면 검색 할 수 없습니다. 귀하의 답변에는 개발자가 갖추어야 할 중요한 특성이 나열되어 있지만 제기 된 질문에는 답변하지 않습니다.
아담 리어
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.