모든 계산 과학자는 어떤 핵심 기술을 가져야합니까? [닫은]


52

모든 과학자는 통계에 대해 약간의 상관 관계가 무엇인지, 신뢰 구간이 무엇인지 등을 알아야합니다. 마찬가지로 모든 과학자는 컴퓨팅에 대해 조금 알아야합니다. 문제는 무엇입니까? 모든 실무 과학자가 소프트웨어를 구축하고 사용하는 것에 대해 알기를 기대하는 것이 합리적입니까? 핵심 기술에 대한 우리의 목록 은 사람들 이 "구름"또는 "페타"라는 이름으로 무엇이든 다루기 전에 알아야 할 것들 입니다.

  • 기본 프로그래밍 (루프, 조건부, 목록, 함수 및 파일 I / O)
  • 쉘 / 기본 쉘 스크립팅
  • 버전 관리
  • 프로그램을 얼마나 테스트해야합니까
  • 기본 SQL

많은있다 되지 않습니다 이 목록은 : 매트릭스 프로그래밍 (MATLAB, NumPy와 등이) 잘 사용하는 경우, 그들은 대부분의 프로그래밍 언어와 같은 강력한있어 스프레드 시트), 등등 작업 자동화 만들기와 같은 도구를합니다.

그래서 :에 무엇 당신의 목록? 요즘 모든 과학자들이 알고 싶어하는 것이 공정하다고 생각하십니까? 그리고 당신은 그것을위한 공간을 만들기 위해 위의 목록에서 무엇을 꺼내겠습니까? 아무도 모든 것을 배울 시간이 없습니다.


1
좋은 질문입니다! 그러나 나는 한 가지에 대해 명확하지 않습니다 : 당신은 계산 과학자에 의해 무엇을 의미합니까? 계산을 사용하는 과학자? 아니면 자신의 전문 직책을 "계산 과학자"라고 생각하는 소그룹의 사람들?
David Ketcheson

9
목록 질문은 스택 교환 형식으로 좋지 않습니다 . 모든 사이트에서이 과정을 거쳐야합니까?
dmckee

4
@Dan Community Wiki는 사이트에 속하지 않은 질문을 허용하는 데 대한 변명이 아닙니다. 또한 응답 한 사람들에게 Jed의 모범을 보여주고 최소한 왜 특정 기술이 필요하거나 다른 기술이 필요하지 않은지 설명하려고 노력하고 싶습니다.
Ivo Flipse

5
@IvoFlipse : 이것은 어떤 형태로 사이트에 속하는 질문입니다. 아마도 현재 언급되지 않았을 수도 있습니다. 어쩌면 그것은 작은 질문에 해킹되어 다시 말해야 할 필요가 있지만, 계산 과학에서 열악한 소프트웨어 엔지니어링 문제는 매우 중요합니다. 특히 학문으로서의 계산 과학은 여전히 ​​형성 단계에 있기 때문입니다. 자연 의이 기사 는 그 이유를 나타냅니다. Greg는 자신의 웹 사이트를 통해 컴퓨터 과학 커뮤니티에 훌륭한 서비스를 제공하고 있습니다.
Geoff Oxberry

5
이 질문이 닫히는 것에 동의하지 않습니다. 참조 (과에 투표)하십시오 meta.scicomp.stackexchange.com/questions/179/...
데이비드 Ketcheson

답변:


46

"전산 과학자"는 종이 / LaTeX 및 개념 증명 구현을 사용하여 수치 분석을 수행하는 사람들, 범용 라이브러리를 작성하는 사람들, 특정 클래스의 문제를 해결하는 응용 프로그램을 개발하는 사람들 및이를 활용하는 최종 사용자를 포함하기 때문에 다소 광범위합니다. 신청. 이 그룹에 필요한 기술은 다르지만 "풀 스택"에 대해 잘 알고 있으면 큰 이점이 있습니다. 이 스택의 핵심 부분이라고 생각하는 부분을 설명하겠습니다. 해당 수준에서 일하는 사람들은 물론 더 깊은 지식을 가지고 있어야합니다.

영역 지식 (예 : 물리 및 공학 배경)

모든 사람은 자신이 해결하고있는 문제 클래스의 기본 사항을 알아야합니다. PDE에 대해 작업하는 경우 몇 가지 PDE 클래스 (예 : 포아송, 탄력성 및 압축 불가능하고 압축 가능한 Navier-Stokes)에 대한 일반적인 지식, 특히 "정확하게"캡처하는 데 중요한 속성과 불연속화할 수있는 사항 오류 (이것은 지역 보존 및 증상 적분기에 관한 방법 선택을 알려줍니다). 응용 프로그램에 관심이있는 일부 기능 및 분석 유형에 대해 알아야합니다 (리프트 및 드래그 최적화, 실패 예측, 매개 변수 반전 등).

수학

모든 사람은 문제 영역과 관련된 방법 클래스에 대해 어느 정도 친숙해야합니다. 여기에는 희소 대 밀도 선형 대수의 기본 특성, "빠른 방법"의 가용성, 공간 및 시간적 이산화 기법의 특성 및 이산화 기법이 적합하기 위해 필요한 물리적 문제의 특성을 평가하는 방법이 포함됩니다. 대부분 최종 사용자 인 경우이 지식은 매우 높은 수준 일 수 있습니다.

소프트웨어 엔지니어링 및 라이브러리

추상화 기술과 라이브러리 디자인에 대한 지식은 계산 과학의 거의 모든 사람에게 유용합니다. 개념 증명 방법으로 작업하는 경우 코드 구성이 향상됩니다 (다른 사람이 코드를 강력한 구현으로보다 쉽게 ​​"번역"할 수 있도록 함). 과학 응용 프로그램에서 작업하는 경우 소프트웨어 확장 성이 향상되고 라이브러리와의 인터페이스가 더 쉬워집니다. 오류를 가능한 빨리 감지하고 오류 메시지를 최대한 정보를 얻을 수 있도록 코드를 개발할 때 방어 적입니다.

도구

소프트웨어 작업은 컴퓨터 과학의 중요한 부분입니다. 선택한 언어, 편집기 지원 (예 : 태그, 정적 분석) 및 디버깅 도구 (디버거, valgrind)에 능숙하면 개발 효율성이 크게 향상됩니다. 배치 환경에서 작업하는 경우 작업을 제출하고 대화식 세션을 얻는 방법을 알아야합니다. 컴파일 된 코드로 작업하는 경우 컴파일러, 링커 및 Make와 같은 빌드 도구에 대한 실무 지식으로 많은 시간을 절약 할 수 있습니다. 혼자서 작업하더라도 모든 사람에게 버전 관리가 필수적입니다. Git 또는 Mercurial을 배우고 모든 프로젝트에 사용하십시오. 라이브러리를 개발하는 경우 거의 항상 처음으로 이식 가능한 코드를 작성하도록 언어 표준을 합리적으로 완전히 알아야합니다. 그렇지 않으면 코드가 펑키 한 환경에서 빌드되지 않을 때 사용자 지원 요청에 묻 힙니다.

유액

LaTeX는 과학 출판 및 협업을위한 사실상의 표준입니다. LaTeX의 숙련도는 결과를 전달하고 제안에 대해 공동 작업을 수행하는 데 중요합니다. 그림 작성 스크립팅도 재현성 및 데이터 출처에 중요합니다.


7
나는 Jed에 동의합니다. LaTeX는 반드시 필요합니다! :)
Paul

1
"물리 및 엔지니어링"을 주제 전문 지식으로 변경했습니다. 결국, 우리는 모든 물리학 자나 엔지니어가 아닙니다. 대답의 그 부분의 정신은 올바른 위치에 있지만 꽤 눈부신 가정이 있습니다.
Fomite

@EpiGrad에게 감사드립니다. 예를 들어 "도움말"로 변경했습니다.
제드 브라운

좋은 목록입니다. 성능 문제에 대한 기본적인 이해도 있어야합니다. 프로파일 링 코드의 간단한 개념을 이해하지 못하는 사람들이 너무 많습니다. 주의 : 성능은 속도 문제뿐만 아니라 메모리 사용도 의미해야합니다.
Faheem Mitha

오타 : "probelms"및 "burried". SE는 내가 그들을 고치게하지 않을 것입니다-너무 작은 편집.
Faheem Mitha

26

내 자신의 배경은 컴퓨터 과학에 적합하므로 내 의견은 약간 편견이있을 수 있습니다. 나는 "기본 알고리즘과 데이터 구조"를 목록에 추가하겠다고 말했다. 기본적으로 의미하는 것은 본질적으로 선형 검색 및 정렬, 균형 트리, 힙 및 해시 테이블과 같은 데이터 구조입니다.

왜? 대부분의 계산 알고리즘에서는 데이터를 실제로 계산하지 않고 데이터를 이동하는 데 상당한 시간과 노력을들입니다. 유한 요소 코드를 구현 한 적이 있습니까? 약 90 %의 데이터 조직입니다. 이 작업을 수행하는 것과 작업을 올바르게 수행하는 것의 차이는 계산 효율성에서 수십 배가 될 수 있습니다.

내가 덧붙일 하나의 사소한 컴퓨터 과학 관련 요점은 프로세서가 실제로 어떻게 작동하고 무엇이 좋으며 무엇이 좋지 않은지에 대한 짧은 소개입니다. 예를 들면 다음과 같습니다.

  • 덧셈과 곱셈은 빠르며, 나누기 또는 초월적인 기능은 아닙니다. 나는 어른이 제곱근 연산을 세 개의 분할이 필요한 것으로 대체하고 그들이 큰 일을했다고 생각하는 것을 보았습니다 (분할과 제곱근은 비싸다).
  • 레벨 3 캐시는 매년 커지고 있지만, 레벨 0 캐시, 즉 가장 빠른 캐시는 여전히 몇 킬로바이트에 불과합니다.
  • 컴파일러는 마술이 아닙니다. 작은 루프를 풀거나 매우 간단한 작업을 벡터화 할 수 있지만 해당 거품 정렬을 빠른 정렬로 변환하지는 않습니다.
  • 가장 안쪽 루프에서 다중 상속을 가진 다형성 객체에 대한 메소드를 호출하는 것은 개념적으로 달콤하지만 CPU가 스스로 죽이기를 원할 것입니다.

이것은 지루한 지루한 일이지만 설명하는 데 몇 분 밖에 걸리지 않으며, 명심하면 유지 관리에서 좋은 코드를 작성하거나 존재하지 않는 하드웨어 기능에 의존하지 않는 알고리즘을 설계 할 수 있습니다.

목록에서 제거 할 내용에 관해서는 SQL이 전산 과학자들에게는 다소 많은 것으로 생각합니다. 또한 소프트웨어 테스팅이 중요하지만 그 자체로는 과학입니다. 단위 테스트와 정확한 추상 데이터 유형은 기본 프로그래밍으로 가르쳐야하는 것으로 2 년 석사 과정이 필요하지 않습니다.


2
전혀 지루하지 않습니다. 그것이 제안된다면 나는 그런 과정을 밟을 것입니다. :-)
Faheem Mitha

18

나중에 이것을 추가 할 수도 있지만, 우선 "쉘 스크립팅"을 꺼내서 구체적으로 "파이썬 스크립팅"으로 바꾸겠습니다. 파이썬은 쉘 스크립팅보다 훨씬 이식성이 뛰어나며 유사한 쉘 및 스크립팅 언어보다 읽기 쉽습니다. 과학에서 큰 표준 라이브러리와 인기 (Perl을 사용하는 생물학을 제외하고는 가능하지만)는 프로그래밍 학습을위한 좋은 첫 번째 언어는 말할 것도없이 훌륭한 계산 언어 입니다. 현재 MIT에서 EECS 전공에게 가르치는 첫 번째 언어이며, 특히 과학 컴퓨팅에서 직업 시장에서 인기가 있습니다. 온라인 설명서는 광범위하며 온라인으로 사용할 수있는 Python을 기반으로하는 많은 프로그래밍 텍스트가 있습니다.

Python을 사용하면 기본 프로그래밍 구성과 스크립팅을 가르 칠 수 있습니다. 또한, 파이썬은 단위 테스트를 매우 잘 지원하므로 단위 테스트를 가르치는데도 파이썬을 사용할 수 있습니다. Python에는 광범위한 데이터베이스 API (SQL을 배우거나 대체해야 할 수도 있음)와 Make-like 기능을 제공하는 몇 가지 빌드 유틸리티가 있습니다. 쉘 스크립트보다 파이썬을 문서화하고 테스트하기가 더 쉽기 때문에 개인적으로 Make보다 SCon을 선호합니다.

궁극적으로 파이썬에 대한 뻔뻔스러운 실링의 동기 부여 원칙은 효율성입니다. 대부분의 작업을 한 언어 또는 하나의 도구로, 특히 해당 도구가 표현적인 스크립팅 언어 인 경우 작업 흐름을 능률화하는 것이 훨씬 쉽습니다. 물론 C로 모든 것을 할 수는 있지만 프로그램은 5 배나 길고 속도는 필요하지 않습니다. 대신 파이썬을 사용하여 텍스트 파일에서 데이터를 가져 와서 플로팅하고 최적화 루틴을 호출하며 임의의 변수를 생성하고 결과를 플롯하고 결과를 텍스트 파일에 쓰고 코드를 테스트 할 수 있습니다. Python이 너무 느리면 계산 집약적 인 작업을 처리하는 C, C ++ 또는 Fortran 코드를 Python으로 감쌀 수 있습니다. 파이썬은 저에게있어 과학적 컴퓨팅 요구의 대부분을위한 원 스톱 상점입니다.

파이썬은 아직 정확히 MATLAB이 아닙니다. SciPy와 NumPy는 여전히 기능면에서 갈 수있는 방법이 있지만 일반적인 유틸리티 측면에서 MATLAB보다 광범위한 작업에 Python을 사용합니다.


7
나는 이것을 도울 수는 없지만 완전히 동의하지 않습니다. 파이썬은 시스템 관리자에게는 골치 아픈 일입니다. 전산 과학자들은 가장 기초적인 재료 결합 및 사용 가능성이 높은 시스템에서 작업 실행에 대한 bash 또는 csh에 대한 기본 지식을 가지고 있어야합니다. 파이썬은 훌륭하고, 나는 계산적인 사람들이 그것을 배우도록 옹호하지만 일부 기초적인 쉘을 희생하지는 않습니다.
Bill Barth

7
@ BillBarth : 모든 계산 과학자는 매우 기본적인 스크립트를 위해 기본 bash 또는 csh를 배워야한다고 생각합니다. 필자가 기본 작업 이외의 쉘 스크립팅을 위해 Python을 사용하는 것을 옹호하는 이유는 본질적 으로 프로그램을 실행하는 수천 개의 라인 bash 스크립트를 상속했기 때문 입니다. 파일을 세마포어로 앞뒤로 전달하고 PBS를 반복적으로 호출하므로 테스트 할 방법이 없습니다. 셸 스크립팅은 소규모 작업에는 적합하지만 대규모 작업에는 적합하지 않으며이 덕트 테이프 및 버블 악몽으로 인해 몇 년 동안 논문을 작성해야했기 때문에 일관성이 없습니다.
Geoff Oxberry

2
내가 말했듯이, 나는 "파이썬을 배우는 것"이 ​​목록에 적합 할 것이라는 데 동의하지 않습니다. "쉘 스크립팅"을 희생시키면서하고 싶지 않습니다. 둘 다 중요하며 아무도 ipython을 쉘로 실행할 수 없으므로 쉘 스크립팅이 매우 중요합니다.
Bill Barth

3
@ BillBarth : 파이썬이 쉘을 대체 할 것을 제안하는 곳은 없습니다. 나는 파이썬이 스크립팅을 위해 bash를 대체 할 것을 제안하고있다. 기본 배쉬를 배우면 제어 구조없이 스크립트를 작성하기에 충분하다는 것을 알고 있으므로 "배쉬 스크립팅"에 대해 깊이 들어 가지 않아도됩니다. bash에서의 프로그래밍은 소프트웨어 및 라이브러리 유지 관리자에게는 골치 거리이므로 제어 구조를 포함시키려는 즉시 다른 언어로 전환해야합니다.
제프 옥스 베리

1
+1. 파이썬은 오랫동안 내 주요 프로그래밍 언어였습니다. 완벽하지는 않지만 누군가가 완벽한 프로그래밍 언어를 발명 할 때까지해야합니다.
Faheem Mitha

14

부동 소수점 수학. 대부분의 과학은 실제 가치를 다루며, 실제 가치는 종종 컴퓨터 세계에서 부동 소수점으로 표시됩니다. 결과의 의미에 혼란을 줄 수있는 수레가있는 잠재적 인 문제가 많이 있습니다.

이 주제에 대해 가장 좋아하는 참조는 David Goldberg의 "모든 컴퓨터 과학자가 부동 소수점 산술 (1991)에 대해 알아야 할 것"( http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6768 ) 인 것으로 보입니다 .


1
이 문서는 온라인 포럼에서 여러 번 언급되었습니다. 그러나 그것은 매우 길고 조밀 한 기사이며 실제로 얼마나 많은 사람들이 이것에서 유용한 것을 제거 할 수 있었는지 확신하지 못합니다.
johngreen

12

전산 과학자는 컴퓨터 과학, 수학 및 과학 / 엔지니어링 응용 분야에 충분히 익숙해야합니다. 다음 각 영역에 기술을 포함시킬 것입니다.

수학:

  1. 수치 해석
  2. 선형 대수
  3. 정규, 부분 및 / 또는 확률 미분 방정식
  4. 최적화
  5. 통계 및 / 또는 확률
  6. 역 이론

컴퓨터 과학 :

  1. 알고리즘
  2. 데이터 구조
  3. 병렬 프로그래밍 (MPI, OpenMP, CUDA 등)
  4. 과학적 시각화
  5. 컴퓨터 아키텍처
  6. 리눅스 환경 사용하기

과학 / 공학-전문화하려는 응용 프로그램에 따라 다릅니다. 특정 경우 (엔지니어링)에서는 연속체 역학, 열 전달, 유체 역학, 유한 요소 방법 등을 추가합니다. 더 친숙하다고 말할 것입니다. 당신은 여러 과학 분야를 가지고 있으며, 당신은 계산 과학자로서 더 다재다능합니다.


"역 이론"에 대해 자세히 설명해 주시겠습니까?
Faheem Mitha

1
@FaheemMitha : 전통적으로, 우리는 모델의 파라미터를 먼저 설정 한 다음 (예 : 부분 미분 방정식) 시스템의 동작을 관찰합니다. "반대 문제"는 그 반대입니다. 우리는 시스템의 출력에 대한 관찰부터 시작하여 이러한 관찰을 생성하는 모델의 매개 변수를 결정하려고 시도합니다. 역 이론은이 작업을 수행하는 방법을 설명합니다.
Paul

설명 주셔서 감사합니다. 이 주제에 대한 좋은 링크 / 참조가 있습니까?
Faheem Mitha

2
en.wikipedia.org/wiki/Inverse_problem 을 시작하는 것이 좋습니다. space.fmi.fi/graduateschool/Lectures07/HK_inversion.pdf 에도 좋은 개요가 있습니다. 그러나 좀 더 깊이 이해하려면 amazon.com/Parameter-Estimation-Inverse-Problems-Second/dp/…
Paul

4

멋진 질문과 매혹적인 답변! 나는 단지 하나의 작은 추가로 맞대고 싶습니다. 내가 경험 한 한 (나 자신과 다재다능한) 올인원 도구는 일반적으로 알고있는 것이 좋습니다. 이러한 도구는 MATLAB, Octave 또는 Python (라이브러리 포함) 일 수 있습니다. "comfort zone"에 문제가있을 때마다 All-in-One 도구를 사용하는 것이 좋습니다. 나중에 고유 코드를 작성해 볼 수 있습니다. 이러한 패키지의 장점은 프로그래밍이 수행중인 작업에 대한 이해를 방해하지 않는다는 것입니다.

컴퓨터 그래픽을 예로 들어 보겠습니다. 그림의 변환, 회전 또는 크기 조정을위한 코드 작성은 MATLAB (상단)에서 10 줄의 코드이지만 C의 페이지에 대해 실행될 수 있습니다. 내가 말하고 싶은 것은 C로 코드를 작성해야 할 이유가 없다면 MATLAB은 더 간단하고 더 좋고 직관적 인 방법 일 것입니다.

일부는 C와 같은 프로그래밍이 직관을 구축하는 좋은 방법이라고 동의하지 않을 수도 있습니다. 아마 그렇습니다. 그러나 몇 번 이상 문제를 처리하지 않아도 C와 같은 언어로 자신의 코드를 작성하고 작성하는 것은 거의 보증되지 않습니다.


-1

상식과 직감 ... 후자는 시간이 지남에 따라 큰 악의 세계에서 부끄러운 경험을 "생존"한 후에 온다.


3
"직감"이 정말 기술인지 모르겠습니다. 이전 경험에 대한 본능적 인 반응 일뿐입니다.
naught101
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.