모든 프로그래머는 프로그래밍에 대해 무엇을 알아야합니까?


52

제발, 기술적 인 문제에있어 , 행동, 문화, 직업, 정치적 문제를 방지.



이런 종류의 질문은 정말 짜증납니다. 그것은 흑백으로 세계를 보는 사람의 마음에서 나올 수 있습니다. 모든 프로그래머가 같은 직업을 가지고있는 것은 아니며 만약 당신이 찾고있는 가장 작은 공통 분모라면 아래의 답변은 당신이 애완 동물의 목록으로 끝났다는 것을 보여줍니다.
Captain Sensible

답변:


92
  1. 버그는 컴파일러 또는 런타임 라이브러리가 아닌 코드 에 있습니다 .

  2. 발생할 수없는 버그가 표시되면 프로그램을 올바르게 빌드하고 배포했는지 확인하십시오. (특히 복잡한 IDE 또는 빌드 프레임 워크를 사용하여 지저분한 세부 정보를 숨기려고하는 경우 또는 빌드에 많은 수동 단계가 필요한 경우)

  3. 동시 / 멀티 스레드 프로그램은 쓰기가 어렵고 제대로 테스트하기가 어렵습니다. 동시성 라이브러리 및 프레임 워크에 최대한 많이 위임하는 것이 가장 좋습니다.

  4. 문서 작성은 프로그래머로서의 일의 일부입니다. "다른 사람이"할 수 있도록 두지 마십시오.

편집하다

예, 내 요점 # 1이 과장되어 있습니다. 최고의 엔지니어링 애플리케이션 플랫폼조차도 버그를 공유하며 덜 엔지니어링 된 일부 플랫폼은 버그가 있습니다. 그러나 그럼에도 불구하고 항상 코드를 먼저 의심해야하며 코드 에 결함이 없다는 명백한 증거가 있을 때만 컴파일러 / 라이브러리 버그를 비난 해야합니다.

내가 C / C ++ 개발을했던 시절에, 옵티 마이저 "버그"가 언어 스펙에 정의되지 않은 결과가 있다고 말한 일을 한 다른 프로그래머가 나에게 기인 한 것으로 기억합니다. 이것은 Java와 같은 안전한 언어에도 적용됩니다. 예를 들어, Java 메모리 모델 (JLS 17 장)을 자세히 살펴보십시오.


17
런타임 라이브러리에서 몇 번 버그를 발견했기 때문에 " 버그가 코드에 있을 수 있습니다" 라고 말하고 싶습니다. 그래도 아직 컴파일러 버그가 발생하지 않았습니다. 어쨌든 +1.
Chinmay Kanchi

29
컴파일러에서 선의의 버그를 발견하지 못했다면 코딩에 거의 모험이되지 않습니다. ;)
Mason Wheeler

8
@Chinmay, @ spudd86, @Mason-예 ... 그리고 30 년 이상의 프로그래밍에서 컴파일러 및 라이브러리 버그를 발견했습니다. 그러나 내 경험상 버그의 99 + % 이상이 (적어도 부분적으로) 내 코드의 결함으로 판명되었습니다. 내 대답은 의도적으로 이것이 당신이해야 할 지점을 통해 얻을 과장 항상 먼저 코드를 생각한다.
Stephen C

5
사람들이 멀티 스레드 프로그래밍에 대한 비이성적 인 두려움을 얻지 못했습니다. 나는이 견해를 지속하는 사람들이 많은 멀티 스레드 코드를 프로그래밍하지 않는다고 생각합니다. 그렇게 어렵지 않습니다. 그래도 다른 모든 것에 +1.
Steven Evers

4
컴파일러 작업을하고 있다면 버그는 아마도 코드와 컴파일러 모두에있을 것이다.;)
Legooolas

84
  • 다른 사람의 코드를 읽는 방법.
  • 버전 관리 시스템에서 코드를 확인하지 않으면 코드가 존재하지 않습니다.

8
버전 관리 설명을 할 수 있다면 +10000입니다. 히스토리 및 변경 로깅은 절대적으로 필수 불가결 한 요소이므로 처음부터 모든 것을 버전 관리에 포함시켜야합니다.
Legooolas

2
... 저장소가 하나 이상의 다른 위치에 동기화되었습니다. DVCS뿐만 아니라 중앙 집중식 VCS에서도 중요합니다.

문제를 해결하기 위해 개발자가 코드를 작성할 수있는 작업 항목이 없으면 코드가 존재하지 않습니다.
Jesse C. Slicer

2
다른 사람들의 코드를 읽는 법을 배우기 위해 하나 더할 것입니다. 우리 대부분이 깨닫기가 더 어렵지만 성공적인 프로그래밍의 필수 부분입니다.
bogeymin

다른 사람의 코드를 읽는 방법을 배우기위한 것입니다.
itsaboutcode

76

부동 소수점 계산이 정확 하지 않습니다 .



내가 무슨 말을하는지 모르는 사람은 @Adam의 링크를 읽으십시오. 부동 소수점 계산의 함정에 대한 훌륭한 요약입니다.
Chinmay Kanchi

1
그리고 그들이 모른다면 매일 스택 오버플로를 요구하는 사람들 사이에있을 수 있습니다.
Brian R. Bondy

1
@ 브라이언 : 사실입니다. 부동 소수점 산술로 설명 된 질문을 식별 할 수있는 방법이 있었으면합니다. 매일 다른 부동 소수점 질문을 표시하는 스택 앱을 만들 수 있습니다!
Adam Paynter

63

배우는 것을 멈추지 마십시오.


1
관련 : 믿음을 멈추지 마십시오.
Fishtoaster

3
관련 : 내일에 대해 생각하지 마십시오.
ocodo

7
관련 : 음악을 멈추지 마십시오.
adamk

1
관련 : movin '중지하지 마십시오! 그것은 당신의 삶입니다.
ocodo

44

코드의 품질과 유지 관리 성을 향상시키기 위해 할 수있는 첫 번째 일은 중복 제거입니다.


4
드라이! 어떻게 잊을 수 있습니까? ;-)
Maniero

이것은 내가 다시 그것에 응답 너무 중요하다 .

차라리 말하고 싶습니다 : 조건을 줄입니다. 각 while / if / for는 잠재적 인 버그입니다.
zvrba

1
DRY의 재미있는 점은 모든 곳에서 반복된다는 것입니다. :) +1
Billy ONeal

39

문제 해결 및 디버깅 기술

그들은 내가 선택한 프로그래밍 과정 에서이 주제에 대해 거의 시간을 소비하지 않으며, 내 경험상 프로그래머가 얼마나 생산적인지 결정하는 가장 큰 결정 중 하나입니다. 좋든 싫든, 새로운 개발 단계보다 앱 유지 관리 단계에서 더 많은 시간을 보냅니다.

나는 문제를 찾기위한 전략없이 물건을 무작위로 변경하여 디버깅하는 많은 프로그래머와 함께 일했습니다. 나는이 대화를 수십 번했습니다.

다른 프로그래머 : 문제가 해결되는지 확인해야한다고 생각합니다.
나 : 그래, 그것이 고쳐 진다고 가정하자. 문제의 원인이 어디인지 알려줍니다.
다른 프로그래머 : 잘 모르겠지만, 우리는 무언가 를 시도해야 합니다 .


2
나는 이것을 게시하려고했다. 프로그래머의 많은 작업이 버그를 수정하고 있으며 많은 사람들이 (특히 다른 사람의 코드에서) 그렇게 할 수없는 경향이 있습니다.
Dov

+1 나는 javascript / php에서 C #으로 갔고 코드를 밟는 것에 빠져 들었다. 동적으로 입력 된 언어가이 작업을 훨씬 더 잘 수행 할 수 있기를 바랍니다.
Evan Plaice

또 다른 이상한 행동은 프로그래머가 프로그램의 모든 부분이 정확하지만 결과는 결함이 있다고 주장하는 것입니다. "-위의 행이 array.sort ()이므로 정렬되어 있는지 확인하기 위해 콘솔에서 배열을 인쇄 할 필요가 없습니다." "-음 ... 알다시피, 작동하지 않습니다. 어딘가에 문제가있을 것입니다.이 시점에서 코드를 방어 할 수는 없습니다!"
gawi

2
나는 디버깅 점이 프로그램 전체에서 가정을 검증한다고 생각합니다. 때로는 단서로 낚시를해야 할 때가 있습니다. 이것은 체계적으로 이루어져야합니다. 그것은 뭔가 시도 완벽하게 유효한 IT 수도 당신에게 새로운 무언가를 이야기합니다. 나는 그것을 자주한다.
gawi

37
  1. 영리하지 마십시오. 명확하게.
  2. 재사용하기 전에 사용하십시오.
  3. 이름이 중요합니다.
  4. 함수는 1 개의 일을 해 잘 행합니다.
  5. 작은 것이 큰 것보다 낫습니다.

2
"재사용 전 사용"을 명확히 할 수 있습니까? 전에는 들어 본 적이 없습니다.
Tjaart

34

기본 사항. 현재 프로그래머들은 개념이 아닌 기술을 배웁니다. 잘못 됐어


예, 아니오 당신은 내가 대학에서했던 모든 교수들처럼 들린다. 기술이없는 지식은 우리 직업에서 쓸모가 없습니다.
Steven Evers

4
+1이므로 사실입니다. 그렇습니다. 이것은 상아탑 유형이라고 말하지만, 우리 참호에있는 다른 사람들에게는 그다지 사실이 아닙니다.
MAK

2
철자와 같은 기본? 예를 들어 Its wrong이어야합니다 it's wrong.
Konerak

2
아니요, 같은 기본 사항은 오타가 아니라 프로그래밍 문제에 관심이 있습니다.
clrod

5
무언가를 수행하는 단계를 배우는 것이 쉽고, 언제 사용해야하는지, 더 중요하게는 사용해야하지만 사용하지 않아야 할 때를 찾기가 어렵습니다. 교과서는 특히 그 이유를 설명하는 데 특히 좋지 않습니다.
HLGEM

27

모든 프로그래머는 항상 코드에 가정을하고 있다는 것을 알고 있어야합니다. 예를 들어 "이 숫자는 양수이고 유한 할 것입니다", "이 코드는 항상 한 번의 눈 깜박임으로 서버에 연결할 수 있습니다".

그리고 그는 그러한 가정이 깨질 때 대비해야한다는 것을 알아야합니다.


6
assert()어디에나 있는 사람들을 구체적으로 말하십시오 . assert()당신의 가정을 문서화하고 잘못되었을 때 당신을 구하는 데 도움이 될 것입니다.
더스틴

@Dustin +1 모든 가정을 기억할 수있는 방법은 없습니다. 프로그래밍 방식으로 문서화하면 잘못된 가정으로 판명 될 때 정확하게 알려줍니다.
Skilldrick

1
... NDEBUG로 컴파일하지 않는 한.


17

개념을 배우십시오 . 구문을 Google에 지정할 수 있습니다.


이론 상으로는 Google이 특정 구문 을 찾는 데 끔찍한 경우를 제외하고는 : "개체 참조"또는 "this"와 같은 용어를 검색하면 결과가 달라지고 "$?"와 같은 관용구를 검색 할 수 있습니다. 전혀 결과를주지 않습니다.
l0b0


14

단위 테스트. 이것은 코드 사용 방법에 대한 가정을 체계화하는 좋은 방법입니다.



13

생각보다 어렵습니다.

잘못된 입력, 모든 에지 및 코너 케이스, 가능한 실패 모드 등에 대처할 때 정상적으로 사용될 때 작동하는 것을 조립하는 것이 쉽지는 않지만 시간이 많이 걸리고 아마도 가장 어려운 부분 일 것입니다.

그런 다음 응용 프로그램을보기 좋게 만들어야합니다.


3
나는 이것이 90 %의 시간이 90 %의 시간이 걸린다는 옛 이야기의 근원이라고 생각합니다. 마지막 10 %는 시간의 다른 90 %를 차지합니다 '
GSto

많은 사람들이 복잡성을 일관되게 과소 평가하는 경향이 있다고 생각합니다. "X는 얼마나 힘들 수 있습니까?" -유명한 마지막 단어 : /
Roman Starkov

@GSto 저는 180 %의 시간을 일하고 싶지 않습니다. 100 %는 저에게만 좋습니다!
adamk

13

도메인 지식. 사양은 결코 100 %가 아닙니다. 개발중인 실제 도메인을 알면 항상 제품 품질이 향상됩니다.



11

분명히 포인터. :)


3
포인터는 작은 작업 하위 집합의 언어 하위 집합에서만 실제로 필요합니다. 대부분의 작업에서 포인터의 개념이 존재하지 않는 것처럼 프로그래밍 할 수 있습니다.
Chinmay Kanchi

14
@Chinay Kanchi No. 포인터는 누구나 이해해야합니다.
대안

5
그것은 실제로 포인터의 의미에 달려 있습니다. 당신이 조작 할 수있는 C 스타일 포인터 (내가 가정 한 것)를 의미한다면, 나는 Java / C # / Python 프로그래머가 그것에 대해 아무것도 알 필요가 없다고 주장 할 것입니다. Java의 "참조"에서와 같이 포인터를 의미하는 경우, 즉 손가락으로 묶을 수없는 포인터는 예를 들어 미끄러지지 않도록하려면 약간의 지식이 필요합니다.
Chinmay Kanchi

@mathepic 포인터에 대한 첫 번째 사실을 이해하지 못하는 CS 학생이 매년 얼마나 많은 졸업생을 배우고 있는지에 대해 당신은 당신의 핵심에 흔들릴 것입니다. 매년 여름에 자리를 잡는 방법을 벗어나지 않았다면 C의 포인터 나 Java의 참조에 대해 배우지도 않았을 것입니다.
Mike B

5
@Chinmay : 포인터 의 개념 을 이해하지 못하는 Python / Java / C # 프로그래머 가 없어졌습니다. L = [[]] * 2; L[0].append(42) 언어마다 다른 이름이 사용되지만 모든 곳에서 간접적으로 사용해야 합니다.

11

코드 완성 2- 커버 투 커버


당신은 프로그램에 돈을 받기 전에 이것을 알아야합니다. 당신이 모르는 것을 발견하면, 경력 변화 또는 강렬한 자기 주도적 연구를 고려하여 모든 것을 극복하십시오. 그런 다음 동료에게 사과하십시오. 그리고 프로그래밍 기본 사항 만 다룹니다.
Tim Williscroft

11

코드보다 데이터가 더 중요합니다.

똑똑한 데이터라면 코드가 멍청해질 수 있습니다.

바보 코드는 이해하기 쉽습니다. 스마트 데이터도 마찬가지입니다.

내가 가진 거의 모든 알고리즘 적 슬픔은 데이터가 잘못된 위치에 있거나 진정한 의미를 남용했기 때문입니다. 데이터에 의미 가있는 경우 해당 의미를 유형 시스템에 입력하십시오 .


2
"타입 시스템"이라고 말할 때까지 나에게 줄곧 갔다.

10

업무에 가장 적합한 언어와 환경 그리고 항상 당신이 가장 좋아하는 것은 아닙니다.


10

나누고 정복하십시오. 일반적으로 예약에서 디버깅에 이르기까지 모든 유형의 실제 문제를 해결하는 가장 좋은 방법입니다.


8

진정한 기술은 복잡한 디자인 작업을 전혀 할 수있는 능력이 아니라 단순한 디자인을 잘 실행할 수있는 능력에 반영됩니다.

이 기술은 비전의 숙달이 아니라 기본의 숙달에서 비롯됩니다. 높은 수준의 프로그래머는 다른 사람이 할 수없는 것 (상위 수준의 기능, 고급 기능적 프로그래밍, 사용자가 사용하는 것)을 코딩하는 능력으로 정의되는 것이 아니라 완벽하게 평범한 코딩을 구체화하는 능력으로 정의됩니다. 클래스 간 기능 분해를 적절하게 선택 견고성 구축; 방어 프로그래밍 기술을 사용하는 것; 더 큰 자기 문서화로 이끄는 패턴과 이름을 사용하면 이것들은 높은 수준의 프로그래밍의 빵과 버터입니다.

귀하 또는 다른 사람이 한 달 또는 1 주일에 다시 방문 할 수있는 좋은 코드를 작성하고 해당 코드를 사용, 수정, 향상 또는 확장하는 방법을 이해하는 것이 중요합니다. 시간과 정신적 노력을 절약합니다. 이전에 걸려 넘어 졌던 장애물을 제거하여 생산성의 바퀴에 기름칠을합니다 (아마도 생각을 방해하거나 다른 작업에서 몇 시간 또는 며칠의 노력을들이는 등) 어려운 문제에 집중하기가 더 쉽습니다. 때로는 어려운 문제를 해결하기도합니다.

한마디로 : 우아함. 모든 클래스, 모든 메소드, 모든 조건, 모든 블록, 모든 변수 이름 : 우아함을 추구합니다.


8

더 깨끗한 사용자 경험이나 더 나은 문서로 해결 될 수있는 것을 사용자에게 비난하지 마십시오. 종종 프로그래머는 문제가 전체적인 경험이 좋지 않거나 의사 소통이 부족할 때 사용자가 올바르게 할 수없는 바보라고 생각합니다. 프로그램은 사용되어야하며 사용자를 멸시하는 것은 처음에는 프로그래밍의 요점을 놓치는 것입니다.


6

모든 프로그래머는 디버거를 사용하는 방법을 알고 있어야합니다 .





4

기능을 구현하는 데 걸리는 시간을 정확하게 추정하는 방법 더 중요한 것은, 견적을 제출할 때 불쾌감을주지 않는 방법입니다.


2
또는 손님을 잘 꾸미는 방법을 배우고 손님을 꾸미지 않는 것을 전하는 것입니다 ...;)
Billy Coover

4

코딩 스타일 문제 :

  • 일관된 들여 쓰기 문제
  • 공백 (예 : 운영자 주변) 문제의 일관된 사용
  • {} 문제의 일관된 배치,
  • 잘 선택된 식별자가 중요합니다.
  • 기타

... 좋은 디자인이 중요합니다.

이상적으로 프로그래머는 첫 번째 코드 검토 전 (또는 도중)에 이러한 사항을 학습합니다. 최악의 경우, 사장님이 급히 끔찍한 코드를 사소하게 변경하도록 지시하면 프로그래머가이를 배웁니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.