더 나은 프로그래머가되기 위해 물리학 자로서 나 자신을 가르치기


17

나는 항상 물리학을 좋아했고 항상 코딩을 좋아했습니다. 따라서 대학에서 수치 물리학 (세부 사항은 관련이 없으며 클러스터에 대한 병렬 프로그래밍입니다)을 수행하는 박사 학위를 제안 받았을 때 나를 위해 -brainer.

그러나 대부분의 물리학 자로서 나는 스스로 가르친다. 객체 지향 방식으로 코딩하는 방법이나 일부 kD 트리에서 검색을 최적화하는 특정 알고리즘의 이름에 대한 광범위한 배경 지식이 없습니다.

지금까지의 모든 작업은 물리학 및 과학적 결과 에 대해 더 많은 관심을 기울 였으므로 의심 할 여지없이 나쁜 습관이 있습니다. 나는 C가 매우 간단하고 "당신이 쓰는 것이 당신이 얻는 것"이기 때문에 주로 C를 사용했습니다. 멋진 추상화가 필요하지 않습니다. 그러나 추상화와 함께 제공되는 힘에 대해 더 많이 배우고 싶기 때문에 최근에 C ++로 전환했으며 C와 비슷합니다 (적어도 구문 측면에서는).

컴퓨터 과학을 전공 한 졸업생처럼 훌륭하고 추상적 인 방법으로 코드를 작성하는 방법은 무엇입니까?

내 코드가 효율적이라는 것을 알고 있지만 코드가 우아 하고 읽기 좋기를 바랍니다. 추상 프로그래밍에 대한 몇 천 페이지의 주제를 읽을 시간이 없다는 것을 명심하십시오. 나는 실제 물리 관련 연구에 시간을 할애해야한다. 프로그래머의 관점에서 작업이 좋은지 어떻게 평가합니까?


12
질문 : 코드가 효율적임을 어떻게 알 수 있습니까?
Matsemann

나는 많은 사람들이 첫 번째 OO 언어로 C ++에 아니오라고 말하는 것을 보았다. 나는 java를 배우고 있으며 Mark Dexter의 비디오 자습서를 eclipsetutorial.sourceforge.net/totalbeginner.html 에서 찾았습니다 . 매우 훌륭하고 TDD 방식으로 가르쳐 줄 것입니다. 또한 Head First Java를 확인하십시오. Java를 OO 방식으로 다루는 데 꽤 좋습니다.
Garv

4
@DeveloperDon, 컴퓨터는 전자 컴퓨터가 있기 전에도 물리학의 핵심 부분이었습니다. 계산은 손으로 또는 기계식 계산기로 수행되었습니다. 제 2 차 세계 대전 물리학 자들은 소프트웨어에 깊이 관여 해 왔습니다. 혜성의 귀환을 계산하거나, 핵 연쇄 반응에서 중성자 생산을 시뮬레이션하거나, Bo 스 보손의 징후를 찾는 기가 바이트의 데이터를 분석하는 경우 많은 수의 위기를 처리해야합니다. 1974 년에 제 첫 해 물리 실험실의 상반기는 FORTRAN을 가르치는 데 전념했습니다.
찰스 E. 그랜트

1
@DeveloperDon CERN의 물리학자가 데이터를 얻으면 수백만 개의 입자 충돌로부터 데이터를 얻습니다. 이 정도의 정보를 처리하려면 컴퓨터가 필요합니다. 또한 원자의 미세한 상호 작용으로부터 물질의 거시적 특성을 이해하려고하는 고체 물리학과 같은 영역을 고려하십시오. 이러한 시스템에서 단일 전자는 수십억 개의 핵과 전자로부터의 반발 / 매력을 느낍니다. 이러한 시스템을 정확하게 설명하려면 빠른 컴퓨터와 효율적인 알고리즘 (및 기본 방정식에 대한 근사치)이 필요합니다.
user787267

1
시간을 더 가질 수 있도록 언어를 C / C ++에서 Python으로 변경해야합니까? 파이썬은 과학자들의해 종종 사용되며 , 파이썬 또는 SciPy 를 이용한 과학 컴퓨팅을위한 NumPy 패키지 와 같은 모듈이 있습니다 . Python에서 C / C ++ 속도가 필요한 경우 Cython 을 사용하면 C / C ++ 유형 및 구조를 사용하여 C / C ++와 비슷한 속도를 얻을 수 있으며 Cython을 사용하여 기존 C / C ++ 라이브러리와 쉽게 통합 할 수 있습니다.
Czarek Tomczak

답변:


20

추상 프로그래밍에 대한 몇 천 페이지의 주제를 읽을 시간이 없다는 것을 명심하십시오.

따라서 숙련 된 프로그래머가 될 5 단계 점검 목록을 누군가에게 요구하고 있습니까? 그런 일은 일어나지 않을 것입니다 !

다른 학문과 마찬가지로 프로그래밍을 잘하려면 연습과 공부에 시간과 노력을 들여야합니다. 많은 코드를 작성하고 다른 사람들의 코드를주의 깊게 읽어 명확하고 우아한 코드를 작성하는 방법을 배웁니다. 1000 개의 페이지 주제 중 일부는 실제로 다른 사람들이 배운 어려운 교훈을 요약하여 시간을 절약 해줍니다. 물리학 박사 학위를받는 데 어려움이없는 숙련 된 프로그래머가 될 수 있다고 생각하는 것은 망상입니다. 물리학 박사 학위에서 벗어날 수있는 것은 아닙니다. 미친 프로그래밍 기술을 사용하면 시간과 문제가 발생할 수 있습니다.

Code Complete 는 명확하고 유지 관리 가능한 코드를 작성하고 구성하는 방법에 대한 조언을 포함하여 소프트웨어 개발 메커니즘에 대한 유용한 소개입니다. 그렇습니다. 그것은 거대한 주제이지만, Dirac의 "양자 역학 원리"또는 MTW의 "중력"과 같이 밀도가 높지는 않습니다. Code Complete 는 더 나은 소프트웨어를 작성하기위한 5 단계 점검 목록에 도달 할 때까지 가깝습니다.

Matlab, VIM, C, MPI 및 Valgrind는 훌륭한 도구입니다. 버전 관리 시스템 사용에 대해서는 언급하지 않았습니다. 약간의 유출로 인해 아직 버전 제어 시스템을 사용하고 있지 않은 경우 즉시 사용을 시작 해야합니다 . 버전 관리는 논문 작성을위한 신의 선물이기도합니다. 알아야 할 다른 기본 도구는 디버거, 실행 프로파일 러, 로깅 프레임 워크 및 단위 테스트 프레임 워크입니다. 각각에 대해 1000 페이지의 책을 읽을 필요는 없습니다. 온라인 자습서를 통해 기본 사항을 익힌 후 작업을 시작하십시오. 요구 사항이 더욱 정교 해짐에 따라 설명서를보다 심층적으로 다룰 수 있습니다.

소프트웨어 구성 기본과는 반대로 컴퓨터 과학 기본 학습에 대해 조언하는 것이 더 어렵습니다. 새 알고리즘을 개발하든 기존 알고리즘을 적용하든 작업중인 문제를 지정하지 않습니다. 연구 문제에 따라 기본 데이터 구조 및 표준 알고리즘에 대한 조사가 도움이 될 수 있습니다. 다른 문제는 수치 분석에서 탄탄한 배경을 통해 더 많은 이점을 얻을 수 있습니다. 알고리즘 분석의 기본 사항을 배우고 싶다면 몇 가지 좋은 텍스트가 있습니다. 알고리즘 설계 매뉴얼알고리즘 소개가 떠 오릅니다. 또한 온라인으로 사용할 수있는 몇 가지 훌륭한 입문 과정이 있습니다 : 알고리즘 설계 및 분석알고리즘 .


링크 주셔서 감사합니다, 나는 그것을 조사 할 것이다. 주말에 코딩 전문가가되지는 않는다는 것을 알고 있지만, 시간이 지남에 따라 점진적으로 개선 될 것으로 예상합니다. 특히 물리학 밖에서 영감을 얻으려는 경우 (내가 알고있는 많은 물리학 자들이 좋은 코딩 관행에 덜 신경 쓰지 않았기 때문에).
user787267

1
도구에 파이썬을 읽을 수있는 개수로 추가하겠습니다
Xavier Combelle

2
코드 완성을 제안하면 +1입니다. 문제를 해결하기 위해 op가 읽을 수있는 것이 가장 좋습니다.
JW01

9

저의 배경은 당신과 약간 비슷합니다. 저는 스스로 프로그래밍을 가르치는 물리학 졸업생이었습니다. 졸업 한 후 몇 가지 IT 직무를 맡고 궁극적으로 소프트웨어 엔지니어가되었습니다. OpenGDA (다양한 싱크로트론 사이트에서 실험을 실행하는 데 사용되는 소프트웨어)에 대한 작업 시간이 포함됩니다.

내가 여기에 왔을 때 내가 겪었던 질문들에 대해 내가 배운 가장 중요한 점은 다른 사람들로부터 이러한 기술을 얻는 것이 자신을 직접 선택하는 것보다 훨씬 쉽다는 것입니다. 숙련 된 멘토는 코드가 약한 곳이나 일반적인 패턴과 관행이 도움이 될 수있는 곳을 쉽게 식별 할 수 있도록 도와줍니다. C와 Objective-C를 직접 작성하는 방법을 배웠지 만 같은 코드에서 다른 사람들과 함께 일할 때까지 내가 알지 못했던 내용을 정확히 알지 못했습니다. 당신이 조언을 구하고 있다는 사실은 내가 이미 한 것보다 더 잘하고 있음을 의미합니다 :-).

이제 전문 소프트웨어 엔지니어를 어디에서 찾을 수 있습니까? 나는 최근에 프로그래머와 프로테제를 파트너로하는 시스템 인 MentorNet 에 합류했습니다 .

그러나 공식적인 시스템을 사용하지 않아도됩니다. 현지 프로그래머 모임 그룹 (또는 금요일에 퇴근 후 대학의 소프트웨어 엔지니어링 부서가있는 곳)을 찾는 것이 시작하기에 좋은 장소입니다.


MentorNet은 매우 흥미로워 보입니다. 물리학 자에서 소프트웨어 엔지니어로의 전환이 어려웠습니까?
user787267

@ user787267 프로그래밍에 관심이 있었고 이미 취미 프로그래머 였기 때문에 여러분이 생각하는대로 전환하여 기술적 인 측면을 찾기가 어려웠습니다. 더 큰 프로젝트 팀에서 내 자리를 이해하고 내가 전에했던 "고독한 늑대"코딩에서 큰 변화가 무엇인지 전문가였던 사람은 습식웨어였습니다.

5

소프트웨어로가는 로열로드

고대에 유클리드는 그의 학생 프톨레마이오스 왕과 같은 질문을 받았습니다. 그의 대답 : "지오메트리로가는 길은 없습니다."

당신은 감독자가 당신이 전문 개발자처럼 코드를 작성하는 데 얼마나 많은 시간을 소비하는지 알면 웃을 것이라고 말합니다. 다른 사람들은 소스 제어에서 알고리즘의 설계 및 분석에 이르기까지 배울 것들의 세탁 목록으로 질문에 대답했습니다.

그들은 당신의 목표에 미치지 못합니다 :

"실제 물리학에 시간을 보내야합니다"

콘서트 피아니스트 또는 원맨 밴드?

사람들이 손대기에는 세상이 너무 빨리 움직입니다. 콘서트 피아니스트가 되려면 악기를 배우는 데 시간을 나누어 한 사람의 밴드가되지 마십시오.

중대형 프로젝트에서 물리학에서 박사 학위의 역할에 대한 나의 개념은 시스템 정의, 이론 전문가, 유스 케이스 작성 중 주제 전문가, 소프트웨어 아티팩트로 생성 된 결과에 대한 최종 사용자 / 판사에 대한 아이디어 리더입니다. 최고의 소프트웨어 엔지니어와 긴밀히 협력하십시오.

프로그래머의 관점에서 작업이 좋은지 어떻게 평가합니까?

막대를 높게 설정하려면 여기에서 시작하십시오.

실제 소프트웨어 아키텍처, Len Bass, Paul Clements, Rick Kazman

"품질 속성 이해"장을 찾으십시오. 코드 외에도 유용성, 수정 가능, 성능, 보안, 가용성, 신뢰성, 테스트 가능성, 유지 관리 및 이식성 (이동할 수는 없지만 디자인을 한 플랫폼에서 다른 플랫폼으로 이식 할 수 있음)을 고려합니다. 모두 구체적인 측정 목표가 필요합니다. 유사한 참조 자료는 다음과 같습니다.

http://msdn.microsoft.com/en-us/library/ee658094.aspx

http://www.sei.cmu.edu/reports/95tr021.pdf

당신의 목표 대 C와 C ++

FORTRAN과 마찬가지로 이들은 단단하고 오래된 언어입니다. C / C ++에 대한 긍정적 지표는 다음과 같습니다.

  • 하드웨어, 임베디드 시스템이있는 응용 프로그램.
  • 시작하려는 기존 프로젝트.

웹 개발, 데이터 시각화 및 빅 데이터를 수행하는 사람들이 많이 있습니다. 많은 사람들이 다른 언어를 찾거나 만들려고 동기를 부여합니다. 예를 들어 물리학자인 팀 버너스-리 (Tim Berners-Lee)는 HTML로 성공을 거두었지만 물리학은 거의 알지 못합니다. 목표와 프로그래밍 언어를 평가하십시오.

Matlab 사용을 고려하십시오

Matlab은 훌륭한 설치 기반을 가지고 있으며 수학 및 과학에 특화되어 있습니다. 데이터 시각화 도구가 있습니다. 이를 통해 과학자와 수학자들은 솔루션 영역이 아닌 문제 영역에서 문제를 표현할 수 있습니다. Matlab은 Parallel Computing Toolbox 및 Distributed Computing Server 제품을 만듭니다.

Matlab의 성공은 물리, 수학, 전자 및 계측, 운영 체제, 프로그래밍 언어, 소프트웨어 개발, 소프트웨어 테스트, 소프트웨어 아키텍처 및 디자인 전문가 인 다 학제 팀을 사용했기 때문입니다. 그 비유는 신축적일 수 있지만, 3D 프린터를 사용할 수있을 때 망치, 끌 및 강판으로 시작하는 이유는 무엇입니까? 뉴턴이 묻는 것처럼 누군가의 어깨에 서 있지 않습니까?


4

당신은 "전문적인"스타일 (경험에서 말하는 것)에 대해 전혀 몰라도 물리학에서 먼 길을 갈 수있을 것입니다. 그러나 많은 사람들이 자신이 수행 한 작업을 추적하거나 2 년 동안 코드를 재배 한 후에 그 과정이 복잡해지면서 (아카데미아에서도 "버려짐"코드가 없지만 처음에 생각하는 것보다 훨씬 오래 붙습니다.

예를 들어이 과정을 통해 알고리즘 및 데이터 구조를 미리 시작할 것을 제안합니다 . 그 후에는보다 생산적인 수준에서 성능에 대해 생각하고 Wikipedia의 기사와 같은 후속 조치를 취할 수 있어야합니다.

그런 다음 C ++ cppreference.com 과 같이 언어의 핵심에서 사용 가능한 것에 익숙해집니다 . Scott Meyers 의 Effective C ++ 시리즈와 Koenig & Moe의 Accelerated C ++ 시리즈도 읽어 보시기 바랍니다 . 적어도 C ++의 경우 언어 측면에서 견고한 기초를 제공합니다.

동시에 도구를 잘 알아야합니다. Linux에서 코드를 개발할 가능성은 낮으므로 컴파일러 (최소한 gcc 및 clang)에서 더 많은 진단 (경고)을 얻는 방법을 배우십시오. cppcheck 또는 clang의 scan-build 와 같은 정적 분석 도구에 대해서도 학습 합니다. 이러한 도구를 개발 프로세스의 필수 부분으로 만드는 방법을 익히십시오 (예 : 도구를 빌드 설정에 통합) (예 : 최소한 GNU make 또는 GNU autotools / cmake / ...와 같은 것 이상을 사용해야합니다). 또한 도구 세트에 프로파일 링 도구를 추가해야합니다. C ++의 경우 매우 낮은 수준으로 프로파일 링 할 수있는 valgrind에 대한 모든 것을 배우는 것이 좋습니다 (리소스 누출을 찾는 데 도움이 될 수 있음).

이 모든 것이 버그를 찾거나 쓸모없는 최적화를하는 대신 시간을 낭비하지 않고 연구에 가장 관심있는 것에 집중하는 데 도움이됩니다. 물론 이것은 고문에게 판매하는 것이 거의 불가능하지만 신뢰할 수있는 결과를 얻을 수있는 속도는 물론 그들 (그리고 당신)에게 깊은 인상을 줄 것입니다.

C와 C ++을 언급했지만 숫자 계산의 경우 numpy와 scipy를 가진 Python을 권장 할 수 없습니다 . C, C ++ 및 FORTRAN으로 구현 된 매우 최적화 된 루틴을 활용하면서 매우 높은 수준 (깨끗한 대화식으로 작업 할 수 있음)으로 깨끗하고 깨끗한 언어로 작성할 수 있습니다. 또한 자신의 C 또는 C ++ 코드를 파이썬과 인터페이스하는 것은 거의 사소한 일입니다.


링크 주셔서 감사합니다! 나는 확실히 그것을 조사 할 것입니다 (그러나 나는 몇 권의 책을 읽을 시간이 없다고 생각합니다-비록 고등학교에서 가속화 된 C ++을 어느 시점에서 다시 읽었지만). 나는 유닉스 환경에서 일하고 있습니다 (Vim을 편집자로 사용하고 좋아합니다). make와 Valgrind를 광범위하게 사용합니다. 또한 gcc 및 -Wall에서 -pedantic 옵션을 트리거하여 상당히 도움이되었습니다. 대학의 슈퍼 컴퓨터에서 고성능 컴퓨팅 (병렬 프로그래밍 용 MPI 라이브러리 사용)을 수행한다고 언급했을 수도 있습니다.
user787267

필자는 코드가 매우 빠를 필요가 있기 때문에 파이썬이 실제로 옵션이 아니라는 점에 대해서도 언급해야합니다. Matlab도 많이 사용했습니다.
user787267

필자는 종종 파이썬을 프론트 엔드로 사용하여 자체 C ++로 구현 된 루틴과 대화합니다. Boost를 사용하면 이것이 매우 쉽고 파이썬의 전체 유연성을 얻을 수 있습니다 (예 : 플로팅을위한 데이터 처리). 또한 파이썬은 프로토 타이핑에 매우 깔끔합니다. 중요한 것이 무엇인지 알면 항상 C ++로 옮길 수 있습니다. MPI에 대해 언급 했으므로 분산 컴퓨팅을위한 멋진 인터페이스를 제공하는 IPython과 함께 저녁을 보내는 것이 좋습니다.
Benjamin Bannier

@ user787267 더 이상 파이썬이 느리게 수행하는 것은 사실이 아닙니다 . 예를 들어 youtube.com/watch?v=Iw9-GckD-gQ 를 살펴보십시오 . 핵심은 파이썬을 사용하여 작업 코드를 빠르게 작성하여 1) numpy / scipy 사용 2) Cython 또는 shedskin 사용 3) 코어 알고리즘 만 C / C ++ 또는 FORTRAN 모듈에 배치하면 속도를 높일 수 있습니다 마지막 5 % 개선이 필요합니다. 또한 코딩에 소요되는 시간은 코드가 아직 실행되지 않은 시간이므로 절반의 시간 안에 80 % 성능 코드를 작성하는 것이 더 효율적일 수 있습니다.
Tobias Kienzler

필자는 일반적으로 쉬운 작업을 테스트하기 위해 Matlab에서 프로토 타입을 만들지 만 잠시 동안 Python으로 변경하고 싶었습니다. 내가 살펴볼 게 내 코드의 많은 부분이 이미 C ++로 작성 되었기 때문에 언어를 반쯤 바꾸고 싶지 않습니다. 실제 시간 프로그래밍 시간을 고려해야한다고 생각하지만 (나를 믿습니다) 프로그래밍 기술을 점진적으로 향상시키지 않는 변명은 아닙니다.
user787267

4

프로그래머의 관점에서 작업이 좋은지 어떻게 평가합니까?

  • 맞습니까? 모든 경우에 올바른 결과를 생성합니까?

  • 다른 사람들이 귀하의 코드를 읽고 쉽게 이해할 수 있습니까?

  • 감독자가 "좋아요, 이제 X도하게하십시오 ..."라고 말하면 많은 코드를 다시 작성해야합니까?

  • 프로그램을 작성할 때 반복해서 사용할 수있는 도구가됩니까, 아니면 한 번만 사용하여 버리는가?

예, 아니요, 아니요 및 '예, 일회성 계산보다는 도구를 만들려고합니다'라고 대답 할 수 있다면 이미 잘하고있는 것입니다. 프로그래머로서 우리가하는 많은 일들은 위에 열거 된 것들을 돕기위한 것입니다.


3

귀하의 프로그램은 상용 소스 코드와 완전히 다르기 때문에 일상적인 소스 코드 개발에는 많은 모범 사례와 접근 방식이 적용되지 않습니다. 그러나 몇 가지 팁과 요령을 배울 수있는 좋은 방법이 있습니다.

우수한 소프트웨어 개발자가 코드를 검토하고 함께 최적화하도록하십시오. 그것은 당신에게 훨씬 더 많은 경험을 줄 것이며 당신에게 좋은 습관을 가르쳐 줄 것입니다. 또한 다른 사람들이 작성한 소스 코드를 검토하십시오. sourceforge 또는 github에서 오픈 소스 프로젝트를 검색하고 소스 코드를 읽으십시오.

그러나 무엇보다도 목표를 달성하기 위해 실제로 새로운 것을 배워야하는지 생각하십시오. 코드를 더 예쁘게 보이게하기 위해 불필요한 작업을 수행해도 응용 프로그램에 가치가 없습니다.


오픈 소스 프로젝트를 읽고 참여하는 것은 실제로 매우 좋은 아이디어입니다. 그러나 여가 시간에해야 할 일입니다 (그러나 문제가되지 않는 프로그래밍을 좋아하기 때문에). 더 나은 프로그래머가되고 싶은 한 가지 이유는 내가 학계에 남을지 확신 할 수 없기 때문입니다. 내 박사 때 나는 업계에서 일자리를 얻을 수있을 것입니다. 여기서 숙련 된 프로그래머는 수요가 높아야합니다. 또 다른 이유는 정말 어려운 미분 방정식을 푸는 것과 같이 우아하고 아름다운 것을 창조하는 것에 대한 지적 만족입니다.
user787267

불행히도 업계에서는 일반적으로 학업 개발에서 얻지 못하는 기술이 필요합니다. 학술 연구 중에 작성하는 내용은 일반적으로 상용 응용 프로그램 소스 코드의 5 % 미만입니다.
Andrzej Bobak

3

더 나은 프로그래머가되는 한 마술 총알은 없습니다. 당신이 자기를 가르친다면, 열쇠는 자기 인식입니다. 그러나 코딩을 잘 배우는 것은 대부분 읽고 연습하는 것입니다.

자신의 코드를 비판하는 것이 더 나은 방법 중 하나입니다. 항상 스스로에게 물어보십시오 :

  • 변경하기 쉬울까요?
  • 쉽게 테스트 할 수 있습니까?
  • 이것을 단순화 할 수 있습니까? 3 개월 후에 다시 볼 때 쉽게 이해할 수 있습니까?

내 다른 제안은 C / C ++에 자신을 고정시키지 않을 것입니다. 그것들은 이유 때문에 사용되는 좋은 언어이지만, 당신은 주제와 관련이없는 많은 일을해야합니다. Matlab을 살펴보십시오. 대학에 해당 대학이없는 경우 놀랍습니다. 파이썬과 같은 스크립팅 언어를 고려하십시오. Haskell과 같은 기능적 언어를 선택하는 것을 강력하게 고려하십시오. 패러다임은 본질적으로 매우 수학적이며 장갑과 같은 문제에 적합 할 것입니다. 간단히 말해서 다른 언어 / 패러다임을 탐구하십시오. 그들이 벨트에서 영구적 인 도구가되지 않더라도 더 나은 프로그래머가 될 것입니다.

일부 알고리즘 디자인을 살펴볼 수도 있습니다. 나는 직업을 얻었을 것으로 의심되는데, 당신은 이미 이것에 대해 비교적 잘 알고 있지만 수치 분석을 할 때 알고리즘이 매우 중요합니다. 실제로 수치 분석 알고리즘에 특화된 리소스가 있다고 생각합니다.

코드 작성의 주요 목적을 놓치지 마십시오. 일을 끝내야합니다. 더 나은 프로그래머가되는 것이 그 방법 중 하나입니다. 작업에 적합한 도구를 선택하는 것도 또 다른 방법입니다.


2

첫째, "우아한"은 상대적인 용어입니다. 추상화는 당신에게는 우아해 보일 수 있지만 다른 C 애호가에게는 불필요하게 보일 수 있습니다. 어쨌든 귀하의 질문에 대답하려면 http://codereview.stackexchange.com 에 검토를 위해 코드를 게시하십시오 .
요점을 벗어나면 내 자신의 경험을 바탕으로 원치 않는 조언이 있습니다. C로만 모든 작업을 수행 할 수 있다면 왜 추상적 인 방식으로 코딩하고 싶습니까? 이로 인해 다른 사람들이 코드를 재사용 할 수있게 하시겠습니까? C ++로 전환해야 할 확실한 이유가 있다면 C ++ 및 OO 개념을 추상화하고 학습하십시오. 그렇지 않으면 아이디어를 삭제하십시오. 겸손한 견해로는 코드를 더 읽기 쉽고 OO 추상화를 제공하는 것보다 과학적 결과를 재현 할 수 있도록 목표로 삼아야합니까? 나는 나 자신이 OOPS를 배우고 "우아한"코드를 만드는 것에 대한 이러한 집착을 가졌다. 그러나 C ++은 마스터하는 데 시간이 걸리며 가비지 수집은 C ++에서 자동이 아니기 때문에 메모리 관리를 배워야합니다. 내가 연구 실험실에서 직접 일했고 C ++ 및 OO를 배우는 데 많은 시간을 잃었으므로 조언을 구하십시오.


1
그러나 C는 C ++보다 훨씬 관리되지 않습니다. C ++에는 최소한 RAII가 있습니다.
Benjamin Bannier

저는 코딩을 좋아해서 더 나은 프로그래머가되고 싶습니다. 나는 물리학 자이고 프로그래머는 두 번째이지만, 이것이 프로그래밍 기술을 개선해서는 안된다는 것을 의미하지는 않습니다. 결국 과학적인 결과와 함께 코드를 게시하기로 결정했다면 좋은 결과를 얻는 것이 좋습니다. 읽을 수있는 코드.
user787267

2

이론을 공부할 시간이 없다는 언급을 고려합니다.

몇 달 후 이전 코드를 되돌아 보면서 "어떤 종류의 바보가 해당 코드를 작성했는지"궁금한 경우 진전을 보이고 있습니다.

어떻게 진행했습니까? 다른 사람들이 작성한 더 나은 코드를 보는 것. '우아함'또는 '좋은'코드의 가치를 자신의 업무에 가치를 더하는 것으로 보지 않으면 사람은 결코 알지 못합니다. 나는 이론을 읽는 대신에, 당신이 일하는 분야의 다른 사람들이 작성한 코드에주의를 기울 이도록 격려 할 것입니다. 스택 오버 플로우 (C ++ 태그)에 대해 논의중인 개념에주의를 기울이십시오. 하루에 15 분만 검색하면 도움이 될 수있는 개념에 무작위로 노출 될 수 있습니다. 코드보다 잘 작성된 코드를 보여줄 수 있습니다. 그때 위키피디아에 대한 후속 조치를 통해 자세한 정보를 확인할 수 있습니다. 호기심에서 비롯된 그러한 학습은 다음날 깨어날 때 잊게 될 이론보다 훨씬 오래 지속되고 유용 할 것입니다.

또한 MATLAB 또는 Python과 같은 언어를 사용해보십시오.


저는 Stack Exchange에 많은 시간을 할애합니다. 그것은 일상 업무에서 매우 귀중한 자료입니다. Matlab을 많이 사용했지만 배열을 사전 할당하지 않는 것과 같은 나쁜 습관을 개발하는 것은 매우 용서이기 때문에 매우 쉽습니다.
user787267

python에 대한 +1 @ user787267 사전 배열을 할당하지 않는 것이 나쁜 습관 인 이유를 잘
모르겠습니다

2

물리학자가 스스로 프로그래머가되면서 물리학 배경이 올바른 은유 를 만드는 데 가장 도움이된다는 것을 알게되었습니다 이 소프트웨어 개념을 이해하기위한 를 . 이 관점은 또한 프로그래밍 학습을 좀 더 재미있게 만들었고 소프트웨어에서 "우아함"에 대한 감각을 발전시키는 데 도움을주었습니다.

CUJ 칼럼 "사고의 패턴-이름, 은유, 더 나은 프로그래밍 및 언어의 정치" 에있는 소프트웨어에서 은유와 유추의 중요하고 과소 평가 된 역할에 대해 설명했습니다. . 예를 들어, 계급 상속의 OO 개념은 종종 가족의 부모에서 자손으로 형질을 전달하는 것과 비교됩니다. 이것은 잘못된 비유입니다. 계급 상속에 대한 올바른 유추는 유기체의 생물학적 분류입니다 (예를 들어, RedRose 계급은 일종의 꽃이며, 화훼는 식물의 일종입니다).

또는 계층 적 상태 머신의 소프트웨어 개념을 예로 들어 보겠습니다. 여기서 좋은 은유는 수소 원자와 같은 결합 된 양자 시스템의 개념입니다. 아시다시피, 원자의 상태는 정확히 "중첩 된"(계층 적) 3 개의 양자 수 | n, l, m>로 번호가 매겨집니다. 이 은유는 각 운동량 상태 (l)가 에너지 상태 (n)에 중첩 된 것처럼 상태 내에 상태가 중첩되어 있음을 이해하는 방법을 보여 주며 상태 중첩은 항상 시스템 의 일부 대칭 을 반영한다는 것을 즉시 알 수 있습니다.

물리학의 또 다른 흥미로운 비유는 "액터 계산 모델"인데, 최근에는 멀티 코어 CPU와 "클라우드"의 분산 컴퓨팅으로 인해 다시 발견되었습니다. 스테이트 풀 액터 (일명 활성 객체)가 QED의 광자 또는 QCD의 글루온과 같은 가상 boson으로 교환 된 이벤트를 생각하는 것이 도움이되고 재미 있다는 것을 알았습니다. 이 은유는 명백한 중간 아티팩트를 통해서만 상호 작용할 수있는 통신의 기본 비동기 특성, 완료까지 실행 이벤트 처리 (양자 도약) 및 활성 객체의 엄격한 캡슐화를 설명합니다.

어쨌든, 시스템 은유 개발은 XP (eXtreme Programming)에서 권장되는 관행이며, 물리학 자라면 좋은 은유를 얻을 수있는 이점이 있습니다. 소프트웨어가 적용하는 좋은 은유로부터 개념적 무결성을 상속하기 때문에 "우아함"에 대한 감각도 얻게됩니다.


물리학은 잠재적으로 풍부한 은유의 원천이지만 XP의 의도는 현장 고객 및 다른 팀 구성원과의 의사 소통을 용이하게하는 은유를 찾는 것이므로 일반적으로 더 일반적으로 이해되는 은유를 선택하는 경향이 있습니다.
피트 커캄

2

함수형 언어와 파서 학습을 통해 문제 해결 방법에있어 내가 얻은 가장 큰 이점은 모두 달성되었다는 것을 알 수 있습니다. 두 발견 모두 우연히 발견되었습니다. 더 나은 프로그래머가되기를 진지하게 생각한다면 파서 및 파서 생성기와 같은 컴파일러 작성과 관련된 다양한 기술에 대해 배우고 더 높은 순서로 계산을 작성하는 방법을 배워야합니다. 기능.

파서 및 컴파일러에 대한 훌륭한 리소스는 PL101 : Create Your Own Programming Language 입니다. 나는 여전히 함수형 프로그래밍에 대한 좋은 소개를 찾지 못했지만 SICP 에 대해 정말 좋은 소식을 듣는다 .


-5

컴퓨터 과학을 전공 한 졸업생은 졸업 할 때 잘 코딩하는 방법을 모릅니다. 그들은 대학을 떠날 때 수요가 많지 않습니다. 그들이 경험을 얻는 경우에만.

질문에 대한 답은 디자인 패턴을 배워야한다는 것입니다. Java, .NET으로 프로그래밍했으며 이제 PHP, Javascript 및 MySQL 프로그래머로 일하고 있습니다. 그런데 .NET은 ASP.NET과 같은 매우 큰 추상화 수준을 가지고 있습니다. 이는 추상화 학습을 건너 뛸 수 있음을 의미합니다. Perl, PHP 등과 같은 언어는 추상화 수준이 낮습니다.

Head First Design Patterns를 읽으면 좋은 책입니다. 꽤 포괄적 인 책입니다. 그것이 당신이 필요로하는 모든 것입니다.


이 답변이 왜 다운 보트인지에 대한 아이디어가 있지만, 다운 보터가 왜 그런 말을한다면 유용할까요?
Pierre Arlaud
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.