코드를 컴파일 할 때 이점이 있습니까?


183

나는 최근에 그들이 실제 코드를 작성하기 위해 한 시간을 보인 면접을 가졌습니다. 아마도 100 줄 미만의 큰 금액은 아니 었습니다. 약 45 분 후, 나는 그것을 컴파일하고 실행하여 작동시켰다. 컴파일 오류와 몇 가지 사소한 버그를 해결하는 데 5-10 분이 걸렸을 수도 있지만 전반적으로 매우 매끄 럽습니다. (실수로 나는 그들로부터 제안을 받았다.)

그러나 완성 된 코드를 넘겨 준 후 인터뷰 담당자는 내가 잘못한 것은 "내가 따라갈 때 컴파일하지 않는 것"이라고 말했다. 나는 그 차이가 무엇인지 물었고, 그는 "코드를 완성하고 제 시간에 컴파일하지 않았다면 무엇을 했을까?"라고 말했다.

주어진 길이의 코드에 대해 "컴파일하기 위해 코드를 얻는 중"은 일반적으로 일정한 수의 컴파일 오류를 수정하고 상당히 일정한 시간이 걸리기 때문에 잘못된 인수입니다. 코드 작성을 마치거나 코딩 시간과 함께 인터리브하는 경우. 누락 된 세미콜론을 검색하기 위해 코딩을 중단하면 효율성이 떨어질 수 있습니다. 파생 클래스의 가상 함수 등과 같은 엣지 케이스 주변의 모호한 점을 실험하는 극단적 인 상황을 제외하고 숙련 된 개발자가 작성한 코드가 컴파일되지 않고 가끔 타이핑 오류가 발생하지 않을 것으로 예상하는 것이 합리적입니다. 그렇지 않으면

또 다른 유사한 사건에서, 인터뷰에서 불완전한 코드베이스가 주어졌으며 완료하기 위해 코드베이스를 완성하고 필요한 수정을 요청했습니다. 기존 코드를 살펴보면서 시작한 다음 몇 분 (코드를보기 전에도) 후에 면접관은 충분하다고 말했습니다. 내가 그에게 무엇을했는지 물었을 때 (즉, "내가 잘못한 일") 즉시 컴파일 할 코드를 얻어서 시작했을 것이라고 말했다.

그게 왜 관련이 있습니까? 내 의견과 내 경험에 따르면, 코드 컴파일 조각은 기본적으로 임의적이며 세미콜론이 없는지 여부와 같은 것을 포함하며 기본 프로그램의 정확성과 거의 관련이 없습니다. (컴파일에 집중하는 것은 문법을 확인하기 위해 교정하지 않고 맞춤법 검사를 통해 기사를 실행하는 것과 같습니다.)

불완전한 코드 조각을 주면 가장 먼저 읽을 것입니다. 코드가 무엇을하고 알고리즘이 올바른지 알 때까지 컴파일하려고 시도조차하지 않습니다.

어쨌든, 이들은 최근에 발생한 사건 일 뿐이지 만 일반적으로 많은 개발자가 코드를 컴파일 할 때 코드를 컴파일하는 것에 대해 이야기하는 것을 들었습니다. 코드 를 테스트 할 때 얻을 수있는 이점을 이해 하지만 컴파일하는 이유는 무엇입니까?

그래서 내 질문은 이것입니다 : 내가 놓친 것이 있습니까? 실제로 컴파일 할 때 이점이 있습니까? 아니면 소프트웨어 커뮤니티에서 코드를 자주 컴파일해야한다는 신화가 있습니까?


54
또는 다른 습관을 가진 사람들이 내 습관을 나쁜 습관이라고 부릅니다.
CaptainCodeman

9
@DocBrown 최종 목표에 올바른 제품이 있으면 비교가 유효합니다. "실행"되는 프로그램은 잘못 실행되는 프로그램보다 낫지 않습니다. 문법 오류를 해결하기 위해 맞춤법 검사를 기대할 수있는 것보다 컴파일에서 코드를 확인하는 것을 기대할 수 없습니다.
CaptainCodeman

7
컴파일이 워크 플로를 방해하는지 여부는 매우 주관적이며 언어, 빌드 환경, 프로젝트의 크기 / 복잡성 등에 따라 달라집니다. IMO는 대규모 레거시 프로젝트에서 문제가 될 가능성이 높습니다.
pjc50

64
OP에 동의합니다. 나는 누군가가 자신의 작업 습관에 대해 어떻게 판단 할 수 있는지 이해할 수 없다. 중요한 것은 노력의 결과물입니다. 맞습니까? 유지 관리가 가능합니까? 예상 시간 내에 실행됩니까? 그것을 구현하는 데 얼마나 걸립니까? 흥미로운 질문입니다. 다른 모든 것은 임의의 BS입니다. 인터뷰 대상자가 첫 번째 시도에서 컴파일되는 2 시간 동안 완벽한 코드를 작성한다면 문제는 어디에 있습니까? 면접관이 다르게한다고 해서요? 내 신 이시여
JensG

9
또한 언급되어야하는 특정 언어와 IDE를위한 (자바 / [이클립스 | 넷빈즈 | 등], C의 # / 비주얼 스튜디오, ...)의 IDE가되어 이미 입력 할 때, 실시간으로 백그라운드에서 모든 것을 컴파일에서 실수를했는지 여부에 대한 즉각적인 피드백 루프를 제공합니다. IDE 개발자가이 compile-as-go-go 접근 방식을 뒷받침하는 연구가 있었으면 좋겠다.
오우거 시편 33

답변:


223

실제로 컴파일 할 때 이점이 있습니까?

있습니다. 피드백 루프가 짧아집니다. 일반적으로 디자인 할 때 (UI, 소프트웨어 작성, 시각 디자인 등) 좋은 것입니다.

피드백 루프가 짧다는 것은 오류를 수정하는 데 비용이 많이 들기 전에 조기에 오류를 신속하게 수정할 수 있다는 의미입니다.

예제를 빌리려면 C와 같은 언어로 코딩 }하고 프로그램 중간에 어딘가를 잊었다 고 가정하십시오.

명령문 작성을 마친 직후에 컴파일하면 컴파일 오류가 발생했음을 확신 할 수 있으며 몇 초 안에이를 수정할 수 있습니다.

그러나 그렇지 않으면 코드를 읽는 데 많은 시간을 소비하고 정확한 위치를 찾고 정확한 }수정이 실제로 의도 된 오류를 발견하면 확인해야합니다. 이것은 약간의 코드를 남긴 후에 잠시 동안 발생합니다. 당신이 쓴 순간만큼 명확하지 않을 것입니다.


자, 최종 결과 는 동일하지만 컴파일러가 도움을 줄 구문 문제에 많은 시간을 낭비했습니다. 따라서 컴파일하면 컴파일 시간이 크게 단축 될 수 있습니다.


72
실제로 이와 같은 구문 오류의 경우 최신 IDE는 기본적으로 항상 피드백 루프를 합리적으로 진행할 수 있도록 짧게 컴파일하고 재 컴파일하며 사소한 실수를 잡는 데 부당하게 도움이됩니다.
Phoshi

12
@CaptainCodeman-꽤 많은 코드를 파헤쳐 야하는 컴파일 오류가 있다고 말하고 싶습니다. 더 큰 코드베이스와 더 큰 변경 세트의 경우 더 그렇습니다.
Oded

29
때때로 컴파일러는 gcc 템플릿 오류와 같은 힌트 대신 퍼즐을 제공합니다.
pjc50

14
@ pjc50 : 절대적으로 (다음 컴파일 전에 한 번에 너무 많은 것을 변경하지 않으면 처리하기가 쉬워서 마지막으로 변경 한 것을 정확히 알 수 있습니다).
Doc Brown

21
아이디어는 무작위로 컴파일되는 것이 아닙니다. 중요한 단계마다 컴파일하고 여전히 제대로 작동 할 것으로 예상되면 컴파일해야합니다. 예를 들어, 객체가 올바르게 생성 / 삭제되는지 확인하거나 내가 만든 새 클래스에 이벤트가 제대로 시작되는지 테스트하기 위해 컴파일합니다. 클래스를 만들고 어떤 식 으로든 프로그램에 연결하면 응용 프로그램에 더 많은 항목을 연결하기 전에 올바르게 수행했는지 확인하고 싶습니다. 작은 앱에서는 덜 중요하며 큰 앱에는 중요합니다.
Thebluefish

108

컴파일 Haskell 또는 ML 과 같은 유형을 광범위하게 사용하는 언어의 테스트 형태입니다 . 다른 언어로는 구문 검사가 거의 알려지지 않습니다.

"당신이 갈 때 컴파일"이라고 말한 것은 저에게 매우 상황적인 습관 인 것 같습니다. 면접관의 개인적인 편견보다 더 자주 컴파일하는 것에 대해 "트 위키"한 것으로 표시 될 수 있습니다. nitpicking처럼 들립니다. 누구도 인터뷰 대상자가 시험을 치 렀음 을 인정하지 않습니다 . 급여 협상의 규모를 설명합니다.

모든 빌드 시스템이 빠르지는 않습니다. 나는 (C ++) 프로젝트에서 Make 가 빌드해야하는지 여부를 결정하기 위해 모든 것을 stat '하는 데 30 초를 소비 하고 변경 사항이 있으면 대부분의 파일을 빌드하는 데 몇 분이 걸릴 것입니다. 우리는 매 10-15 분마다이 작업을 더 자주하지 않았습니다. 누군가가 펀치 카드 데크를 가져 와서 다른 건물로 옮길 때 컴파일 할 때 일화를 제공 할 것입니다 ...

머리에 완전한 개념 단위가 있고 유효성 검사를받을 준비가되었다고 느낄 때 컴파일하십시오. 워크 플로우에 따라 1 분에 1 회 또는 주 1 회.


25
펀치 카드를 sysops에 가져 와서로드 할 때는 올바른 순서로 다시 넣는 것이 실제 PitA이므로 절대로 떨어 뜨리지 마십시오. 아, 필수 디버깅 도구가 탄성 밴드였던 시절.
gbjbaanb

3
프로그래밍을 처음 시작할 때 컴파일하지 않고 작성할 수있는 코드의 양, 본질적으로 내 정신 컴파일러의 품질을 통해 진행 상황을 측정했습니다. 처음에는 몇 문자, 몇 줄이었습니다. 이제는 상관하지 않습니다. 나는 작은 변화를 위해 많은 것을 컴파일하고 그 효과를보고 싶습니다. 프로젝트의 구조적 레이아웃을 할 때 거의 컴파일하지 않습니다.
Phil

흠. 잘 작성된 C ++ 파일은 컴파일에 몇 초 이상 걸리지 않아야한다고 말하고 싶습니다. 더 길면 나쁜 코드 냄새가납니다. 그리고 그것이 너무 커서 make에 문제가 있다면, 응용 프로그램이 너무 모 놀리식이라고 주장합니다. "나"는 리눅스를 컴파일 할 때조차 아무런 문제가 없었으며, 공정하지도 않았다.
phresnel 2016 년

2
내가 떠났을 때 그것은 150 만 LOC였습니다. Linux는 C ++가 아닌 C입니다. 템플릿은 gcc에서 느리게 보이고, 컴파일하는 데 느리게 발생하는 영리하고 유용한 작업을 수행 한 경우 컴파일러가 프로파일 링을 수행하도록 프로파일 링하는 쉬운 방법은 없습니다.
pjc50

21
@gbjbaanb " 소스 제어 가 탄력적 인 밴드였던 시절"이라고 말하는 것이 낫다고 생각합니다 . ;)
JasonMArcher 2018 년

35

그래서 내 질문은 이것입니다 : 내가 놓친 것이 있습니까?

예 : 당신의 마음은 컴파일러가 아닙니다. 컴파일러가 초당 n 개의 컨텍스트 전환을 수행 할 수는 있지만 생각할 수는 없습니다. 하루에 여러분이 생각할 수있는 컨텍스트 전환 의 수는 코드 기반에 대한 경험 / 친숙성, 코드에 정신적으로 몰입하는 방법, 코드가 얼마나 깨끗한 지, 처리하는 문제가 얼마나 복잡한 지, 자주 방해를 받거나 시끄러운 환경에서 피곤한 경우.

코드베이스 (모두 동시에)를 컴파일하면 ( "20 개 파일이있는 프로젝트"라고 생각) 생각하고있는 내용에서 컨텍스트를 전환해야합니다 (예 : "이 값은 5로 설정되어 있습니다. for 루프 blablabla 및 복잡한 알고리즘은 반환 할 때 올바른 값을 반환합니다. ")는 사용자가 생각하는 것과는 완전히 다른 컴파일 문제 (다른 파일 / 모듈 / 함수 / 전제 조건 / 구문 / 변수 이름, 전제 조건 등) ).

한 번에 더 많은 코드를 컴파일할수록 더 많은 컨텍스트 전환이 필요합니다. 작성한 모든 코드가 한 시간 안에 작성한 코드 일 때 작은 코드 기반에는 문제가되지 않습니다. 그러나 기존 코드베이스에서 작업 할 때 여러 번 (그리고 문서화되지 않은) 상호 종속성이있는 큰 문제입니다.

실제로 컴파일 할 때 이점이 있습니까?

마음의 상황 전환을 최소화하여 변경 사항의 영향과 부작용에 더 집중할 수 있습니다. 또한 피곤하지 않고 실수를 덜 발생 시키며 출력 품질을 향상시킵니다 (즉, 10 개의 파일을 컴파일하고 변경할 때보 다 한 번에 한 파일 씩 변경하고 컴파일 할 때 부작용을 최소화 할 수 있습니다).

매우 짧은 반복으로 컴파일하는 경우 (컴파일 프로세스가 짧은 시간이 걸리도록 최적화되어 있다고 가정) "영역"을 벗어나지 않고 컴파일 오류를 수정할 수 있습니다.

아니면 소프트웨어 커뮤니티에서 코드를 자주 컴파일해야한다는 신화가 있습니까?

그것은 소프트웨어 공동체에 의해서도 전파되지만 그 뒤에는 좋은 이유가 있습니다.

주어진 길이의 코드에 대해 "컴파일하기 위해 코드를 얻는 중"은 일반적으로 일정한 수의 컴파일 오류를 수정하고 상당히 일정한 시간이 걸리기 때문에 이해가 잘못된 인수입니다.

중간에서 큰 레거시 코드베이스 (수백 또는 수천 개의 소스 파일)를 유지 관리하는 경험이 거의 없거나 전혀없는 것처럼 들립니다. 이것이 바로이 태도 (즉 "컴파일 할 때 컴파일")가 가장 도움이되는 곳이며, 이런 습관을 형성하는 곳입니다.

당신을 인터뷰 한 사람들이 비슷한 결론을 내렸다고 생각할 것입니다 ( "큰 코드베이스에 대한 경험이 거의 없거나 전혀 없습니다").


1
"컴파일 및 열 변경"-시도하기에 가장 작은 의미있는 단위 인 많은 상황; 함수 및 모든 호출 사이트에 새 매개 변수 추가와 같은
pjc50

7
컨텍스트 스위치. 농담하는 거지? 코드의 구문 오류를 나타 내기 위해 자동화 된 백그라운드 컴파일에 대해 이야기한다면 괜찮습니다. 그러나 가장 빠른 컨텍스트 전환은 알고리즘 논리가 올바르게 구현되었는지 또는 알고리즘이 적합한 지 여부를 알려줄 수 없습니다. 그러나 이것이 바로 작업 솔루션을 깔끔하게 정리되고 오류가없는 컴파일 및 블 래스팅과는 별개이지만 완전히 잘못된 코드입니다.
JensG

5
@JenS, 아니요, 농담이 아닙니다. 컴파일 오류를 해결하기 위해 코드 전체를 뛰어 넘어야하므로 더 이상 현재 해결중인 문제에 대해 더 이상 생각하지 않아도됩니다 (영역에서 벗어날 수 있음). 대신 코드를 작성할 때 컴파일 할 수 있으며 구문이 아니라 알고리즘을 계속 검사 할 수 있습니다. 컨텍스트 스위치를 처리하는 가장 빠른 방법은 필요하지 않은 것입니다. 내 게시물은 이상적인 세계를 가정합니다 (큰 코드베이스의 빠른 C ++ 컴파일 및 최소화 된 상호 종속성).
utnapistim

1
논리적 오류 인 @JensG : 컴파일 된 코드와 엉뚱한 코드 중에서 선택하는 것이 아니라 두 번 이상 컴파일하면 얻을 수있는 이점에 관한 것입니다.
Jorg

1
단일 구문 오류를 해결하기 위해 짧은 시간 동안 수십 번 집중을 깨는 것이 한 번의 오류를 수정하고 한 번에 수십 개의 구문 오류를 수정하는 것보다 빠르다는 주장이 의심됩니다 (실제 알고리즘에 대해 걱정 한 후). 그것은 컨텍스트 스위치가 컴퓨팅에서 작동하는 방식이 아닙니다 (우리는 결국 처리량을 최적화하려고합니다). 그리고 10 년 넘게 발전한 약 500k LoC의 C ++ 코드로 프로젝트를 진행하고 있는데 아직 경험 카드를 작성하지 않기를 바랍니다.
Voo

26

여기에는 약간의 전문 스노 버가 있다고 생각합니다. 그 의미는 "정기적으로 컴파일 할 필요가 없다면 복잡한 작업을 해 본 적이없는 것입니다. 더 많은 경험을 쌓고 정확히 우리가하는 방식대로 일하는 법을 배웠을 때 다시 오십시오."

그러나 분명히 이것에는 또 다른 측면이 있습니다. 일부 프로젝트는 컴파일하는 데 시간이 걸립니다. 사소한 편집조차도 컴파일하는 데 30 분 이상 걸리는 프레임 워크로 작업했습니다. 헤더 파일을 편집해야 할 경우 Heaven이 도와드립니다. 전체 재 컴파일은 일반적으로 하룻밤 사이에 이루어지며, 실수를 잡기 위해 컴파일러에 의존하는 경우 부분 빌드 중에는 발견되지 않는 드문 오류가 여전히 있습니다. 게으른 느낌이 들지 않는 한 이러한 조건에서 5 분마다 다시 컴파일하지 않습니다 .

컴파일러는 논리적 또는 의미 론적 오류를 처리 할 수 ​​없으며 구문 오류는 하루의 절반을 컴파일하는 것이 가치가 있다는 것을 피하기 어렵지 않습니다. 물론, 가끔 오타를 만들지 만 터치 식과 읽기 모두 가능하다고 가정하겠습니다. 자유롭게 선택할 수있는 경우 레이아웃을 잘 사용하여 오류를 시각적으로 강조 표시하는 코딩 스타일을 사용하면 다시는 중괄호, 대괄호 또는 세미콜론을 버리지 않습니다. 대부분의 경우보다 약간의 연습과 약간의 훈련이 필요하지만 가능합니다. 한 번에 몇 시간 동안 일반 텍스트 편집기로 코드를 작성하고 10 개 중 9 회보다 처음으로 더 잘 컴파일 할 수 있습니다. 물론 더 자주 컴파일 할 수는 있지만 마지막으로 결과를 수정하기가 더 쉬운 오류가 발생한 것을 기억할 수 없습니다.

지속적인 재 컴파일을 좋아하지 않는다면 좋은 회사입니다. 여기 도널드 크 누스가 있습니다 :

실제 질문에 관해서는, 완전히 컴파일되지 않은 환경에서 자신의 길을 느끼고 작동하는 것과 작동하지 않는 것에 대한 피드백이 필요할 때 즉각적인 컴파일과 "단위 테스트"라는 아이디어는 거의 나에게 호소력이 없습니다. 그렇지 않으면, 단순히 수행하거나 생각할 필요가없는 활동에 많은 시간이 낭비됩니다.


모든 것이 말하고 있습니다 ... 컴파일이 자유로운 행동 인 상황에서 일하고 있다면 왜 그렇지 않습니까? 집에서는 개인 프로젝트에서 30 초마다 한 번씩 ctrl-S를 누르고 컴파일러의 프런트 엔드를 통해 코드를 지속적으로 실행하여 실시간 오류 강조 표시를 제공하는 IDE에서 "컴파일"바로 가기가 거의 자주 수행됩니다. 왜 무료 점심을 제공합니까?


나는 컴파일이 자유 롭다는 데 동의하지 않는다. 그러나 그렇지 않으면, 좋은 대답, 감사합니다 :)
CaptainCodeman

어쩌면 나는 대담하고 이탤릭체로 "if"를 "iff"로 만들었을 것이다. 나는 프로젝트, 컴파일러 및 환경 에 따라 자유 행동에 거의 다가 갈 있다고 생각한다. 컴파일러 출력을위한 두 번째 창 또는 화면이있는 경우 숨을 멈추는 횟수만큼 컴파일 할 수 있습니다. 만약 당신이 정말로 하드 코어라면 (필자는 아님) 컴파일러가 주변 비전에 등록하기에 충분한 오류를 생성했다면 코드에서 멀리 볼 필요조차 없습니다. 다시, 이것은이다 IFF에 컴파일 합리적으로 빠르고, 그렇지 않으면 위를 참조하십시오.
DeveloperInDevelopment

2
I hit ctrl-S about once every 30 seconds. 아마 두 배나 자주 구할 수 있습니다. 정말 나쁜 습관입니다. 때로는 코드 줄 중간에 저장 한 다음 끝에 다시 저장하기도합니다. 입력을하지 않고 잠시 생각을 멈 추면 저장합니다.
Cruncher

21

컴파일 할 때 장점이 있습니다. 그러나 나는 작업을 유지하는 것이 괜찮은 코딩 전략이라는 것에 매우 동의합니다.

증분 컴파일의 가장 큰 이점은 많은 사람들이 컴파일 과 테스트 가 끝날 때까지 기다리는 경우 많은 사람들이 얻는 정신입니다 . 우리는 그 시점에서 코드를 실행하는 데 더 관심이 있습니다. "이 구문 오류가 숨겨지는 근본적인 의미 론적 오류가 있는지 생각하지 않고"아, 그냥 컴파일러가 불평을 멈추기 위해이 대괄호를 추가해야한다 "또는"아, 이것을 대문자로해야한다 "고 말합니다. 나는 구문 오류가 의미 론적 오류에 종종 중첩된다는 것을 실제로 발견합니다 (반대가 아닙니다).

예를 들어 변수의 의미를 변경하고 결과적으로 이름을 변경했다고 가정하십시오. 이름 변경은 나중에 코드에서 구문 오류를 생성하지만 이름을 수정하여 컴파일러를 기쁘게하면 해당 오류가 발생한 이유 를 무시했습니다 .


5
시맨틱 오류와 sytactic 오류 간의 연관성을 강조하기위한 +1
Doc Brown

15

코드를 테스트 할 때 얻을 수있는 이점을 이해하지만 컴파일하는 이유는 무엇입니까?

그러나 그에 따라 컴파일하지 않을 때 코드를 어떻게 테스트합니까?

극단적 인 경우는 테스트 중심 개발 (TDD)입니다. TDD는 쓰기 테스트, 컴파일 (실패해야 함), 쓰기 코드, 다시 컴파일, 실행 테스트, 버그 수정, 다시 컴파일, 리팩터링, 컴파일의 매우 짧은주기를 의미하므로 전략과 함께 작동하지 않는 것이 분명합니다. 다시 실행 테스트

따라서 모든 사람이 최소한 항상 TDD를 수행하는 것은 아닙니다 (나도 인정합니다). 현재 전략을 사용하면 TDD를 시도조차 할 수 없습니다. 그러나 TDD를 수행하지 않더라도 IMHO는 코드를보다 정기적으로 테스트하는 것이 매우 도움이됩니다. 정기적으로 컴파일하지 않으면 불가능합니다. 그리고 테스트가 실패하면 디버깅을 실행합니다 (몇 분 전에 작성한 멋진 알고리즘이 생각했던 것처럼 잘 작동하지 않는 이유를 이해하는 데 도움이 될 수 있습니다). 컴파일하지 않고 작성하는 코드가 많을수록 테스트하지 않고 작성하는 코드가 많아 지므로 문제를 해결하는 시간이 "O (1)"이라고 예측할 수없는 경우가 발생할 가능성이 높습니다. 당신은 썼습니다.


1
동의하지만 프로그램을 실행하려고하기 때문에 컴파일하는 것과 테스트 할 의미가없는 컴파일 (또는 컴파일 오류 수정)과는 차이가 있다고 생각합니다.
CaptainCodeman 2016 년

@CaptainCodeman : 100 줄의 코드를 작성할 때 개별적으로 자체 테스트 할 수있는 작은 부분이 거의 항상 있어야한다고 생각합니다. 100 줄의 코드는 일반적으로 4에서 15 사이의 함수를 의미합니다 (또는 Bob Martin의 스타일로 코딩하는 경우> 20 이상).
Doc Brown

5
@CaptainCodeman : TDD에는 테스트 할 "의미없는"것이 없습니다. 고전적인 예는 새 클래스를 작성하고 (Foo라고 함) 먼저 클래스 테스트를 작성 new Foo();하지 않았기 때문에 컴파일 할 수없는 단위 테스트 및 작성 을 작성 하는 것입니다. TDD에서는 컴파일러를 실행해야하는 유효한 이유입니다. 이는 단위 테스트가 작동하고 있음을 증명합니다 (실패).
slebetman

@ slebetman : 유용한 의견 감사합니다. IMHO는 TDD로 제한되지 않는다고 덧붙이고 싶습니다. 100 줄의 코드를 작성할 때 TDD를 수행하는지 여부에 관계없이 항상 테스트해야 할 의미가 있습니다.
Doc Brown

14

실제로 컴파일러 오류는 숙련 된 개발자에게는 큰 문제가되지 않아야한다는 점에 동의합니다. 나는 그것들을 고치는 데 시간이 지남에 따라 걱정할 정도로 크게 증가한다고 생각하지 않습니다. 푸시 직전까지 모든 컴파일러 오류 수정을 연기 할 수 있다면 훨씬 작고 통합 된 중단이 발생하기 때문에 그렇게 할 것입니다.

불행히도 컴파일러 오류를 찾는 것이 컴파일러가하는 유일한 것은 아닙니다. 명백한 내용을 표시 할 위험이있는 경우, 프로그램을 실행하려면 컴파일이 필요하고, 숙련 된 개발자조차도 더 복잡하고 미묘하며 흥미로운 런타임 버그를 찾으려면 프로그램을 실행해야합니다. 그리고 이러한 유형의 버그 서로 빌드하거나 마스킹 할 수 있기 때문에 디버깅을 더 오래 연기할수록 수정하기 더 어렵고 비용이 많이 듭니다.

그러나 필연적으로 컴파일을 연기하기 위해 인터뷰 연습에서 누군가를 표시하지는 않습니다. 인터뷰 연습은 매우 간단한 경향이 있으며 숙련 된 개발자는 일반적으로 자신의 한계를 알고 있습니다. 자신이 작성한 것에 대해 확신을 가질수록 컴파일 사이에 더 오래 갈 것입니다. 그것은 단지 인간의 본성입니다.

그래도 당신을 표시하지 않으려면 자신감이 정당화되어야합니다. 컴파일하지 않고 무언가를 작성하는 데 45 분을 소비했다면 그것을 디버깅하는 데 45 분이 더 필요하다면, 나는 당신에게 크게 무게를 have 것입니다.


8

컴파일 할 때 중요한 점 중 하나는 내가 볼 수있는 한 다른 답변에서 누락 된 것입니다 : 거의 컴파일하지 않고 많은 양의 컴파일러 오류가 발생하면 첫 번째 오류로 인해 생성되므로 대부분 의미가 없습니다. 잘못된 유형이나 오타 또는 일반 구문 오류로 인해 일부 선언이 유효하지 않기 때문일 수 있습니다.

항상 첫 번째 것을 고치고 다시 컴파일하고 나머지를 고칠 수는 있지만 코드베이스가 크면 느릴 수 있습니다. 그러나 독립적 인 긴 컴파일러 오류 목록과 스팟 오류를 살펴보면 관련없는 메시지를 읽거나 2 차 오류 지점에서 실제 원인으로 코드를 탐색하는 데 많은 시간을 소비합니다.

정기적 인 빌드를위한 또 다른 것은 컴파일 된 코드 블록이 작성되는 즉시 컴파일을 시작하는 것을 막을 수 없다는 것입니다. 그런 다음 컴파일이 완료 될 때까지 새 편집 내용을 저장하지 않는 한 컴파일이 진행되는 동안 더 많은 코드를 계속 작성할 수 있습니다. 따라서 실제로 빌드 대기 시간이 낭비되지 않습니다. 그 시점에 쓸 모든 내용을 쓸 때까지 기다리면 아무 것도하지 않고 컴파일을 기다려야합니다. 기본적으로 최신 IDE가 백그라운드에서 자동으로 수행 할 수있는 작업의 수동 버전입니다.


흥미롭게 도 컴파일 속도가 느리더라도 정기적으로 컴파일해야하는 좋은 이유 입니다. 좋은 지적.
sleske

3

충분히 숙련 된 프로그래머의 경우 컴파일 코드는 병목 현상이 발생하지 않습니다.

언어를 충분히 알고 있으면 (즉, 더 이상 구문에 대해 생각할 필요가없고 대신 기능 코드 만 작성하면) 간단한 구문 오류가 발생하지 않는 경향이 있습니다. 일반적으로 오타 나 복사-붙여 넣기 버그이며 몇 번의 컴파일 단계만으로 짧은 순서로 정리할 수 있습니다.

나는 하루 종일 코드를 컴파일하지 않고 정기적으로 작성하고, 코드를 커밋하기 전에 컴파일러가보고하는 구문 오류와 경고를 컴파일하고 수정합니다 ( "테스트가 필요합니다!" 라는 메모와 함께 ). 몇 분 만에 1,000 줄 이상의 C 또는 C ++ 코드를 정리하는 데 아무런 문제가 없습니다.

반면에 디버깅 및 테스트는 시간이 걸립니다. 논리 오류는 모든 종류의 이유로 발생하지만 아직 완전히 잊어 버린 서브 루틴에 대해 알려주는 컴파일러를 만나지 않았거나 바이너리 트리가 node->left있어야 할 때 붙여 넣었 기 때문에 작동하지 않습니다 node->right.

나는 일반적으로 면접관과 싸우는 것이 현명하지 않다고 생각하지만, 스타일을 방어 할 가치가 있다고 생각한다면, 작성한 코드 를 디버깅 하기에 충분한 시간을 남겼 음을 지적해야한다 . 그것은 좋은 프로그래머가 결코 무시하지 않는 것입니다.

추신-내가 당신을 검토하여 코드를 검토하는 것을보고 있었다면, 나는 그 자리에서 당신을 고용했을 것입니다. 그것이 매번 프로가하는 일입니다.


4
"저는 완전히 작성하는 것을 잊어 버린 서브 루틴에 대해 알려주는 컴파일러를 아직 만나지 않았습니다." 광범위한 변경을 완료하지 않았을 때 알려주는 컴파일러에 전적으로 의존합니다. 때로는 사용법의 모든 인스턴스를 확인하고 새 이름을 모두 부여 할 때까지 컴파일 성공을 막기 위해 변수 이름을 바꾸는 경우도 있습니다. 뭔가 빠졌을 때 경고하지 않는 컴파일러를 보지 못했다고 어떻게 말할 수 있는지 이해하지 못합니다. 빈 자리 표시 자 서브 루틴을 작성하고 잊어 버리지 않는 한 하늘이 도움이됩니다.
Ian Goldby

@par 답장을 보내 주셔서 감사합니다. 내가 이런 식으로 코딩하는 유일한 사람이 아니라는 것을 아는 것이 좋습니다!
CaptainCodeman 2016 년

3
@CaptainCodeman 논리 오류는 컴파일러 오류보다 더 교묘하다는 것을 잘 알고 있습니다. 그러나 내가 논쟁하고 싶었던 누락 된 코드에 대해 말할 수없는 컴파일러에 대한 그의 주장이었습니다. 고의로 컴파일하는 (또는 불완전한) 코드를 의도적으로 작성하지 않는 한, 컴파일러가 잡을 수없는 오류가 실제 문제 IMO라는 주장을 무시합니다. 심지어 컴파일러를 사용하여 캐럿을 다음 코드를 작성 해야하는 줄로 옮길 수도 있습니다. 그러나 나는 매우 게으르다.
Ian Goldby

1
@IanGoldby : 당신은 요점을 완전히 놓 쳤고 심지어 당신이 내 말을 왜곡하기로 선택했다고 말할 것입니다. 컴파일러는 내일 아침에 무엇을 먹을지 말할 수없는 것과 같은 방식으로 누락 된 코드에 대해 경고 할 수 없습니다. 의도적으로 구문 오류를 도입하여 컴파일러는 프로그래밍 기술이라는 것을 상기시킵니다. 오류로 인정받지 못하거나 컴파일러에게 심령을 강력하게 제공하지 않습니다.

1
@par 나는 나의 의견에 의해 명백하게 야기 된 위법 행위에 대해 사과한다-의도 된 것이 아니며, 당신이 말한 것을 잘못 진술하려는 의도는 없었습니다. 그럼에도 불구하고 컴파일되지 않은 불완전한 코드를 작성할 때 #warning 또는 TODO를 추가하여 잊어 버릴 수 없도록하는 연습을하십시오. 그것은 합법적 인 기술입니다. 우리 모두가 동의하는 중요한 것은 컴파일하지만 작동하지 않는 코드가 컴파일되지 않은 코드보다 훨씬 위험하다는 것입니다.
Ian Goldby

3

아니요, 충분한 양의 코드를 완료 할 때까지 컴파일을 보류하는 것은 무리가 없습니다 ( '충분한 양'은 코더와 코드에 따라 다릅니다).

예를 들어, 시간을내어 올바른 코드를 작성하는 엄청난 코더이고 대량의 코드 나 복잡한 코드를 작성하지 않는 경우 정기적으로 컴파일하는 것은 낭비 일 수 있습니다. 그렇지 않다면 모든 함수를 컴파일하는 것이 좋습니다. 사람에 따라 다릅니다.

반례로서, JavaScript 코드를 작성한다고 가정하십시오. 컴파일러는 없습니다. 대신 (대부분의 JavaScript 코드의 특성상) 프로그램을 실행하거나 페이지를 새로 고쳐 코딩 결과를 볼 수 있습니다. 이제 이해하기에 충분한 코드를 작성할 때까지는 그렇게 할 수 없습니다. 결과적으로 JavaScript 개발자는 가능한 자주 "컴파일"하는 경향이 있으며, 반드시 그런 것은 아닙니다.

간단히 말해, 여기에는 정답이 없습니다. 면접관은 틀린 것이 아니지만 둘 다 아닙니다. 당신이 생산적으로 만드는 일을하고 누군가가 당신에게해야한다고 말하는 것을 잊어 버리십시오. F7규칙적으로 타격을받는 경향이 있거나 그렇지 않은 것보다 코딩에있어 훨씬 더 중요한 요소가 있습니다 .


두 번째 단락은 명확하지 않습니다. "멋진 코더"가 정기적으로 컴파일되어야하는지 명확하게하기 위해 편집하고 싶을 수도 있습니다. ( "t"를 추가하고 "no"를 "not"로 변경 했습니까?)
DougM

@ DougM-많이.
gbjbaanb

스크립팅 코드는 종종 "라이브"로 개발됩니다. 즉, REPL 환경에서 실행됩니다. 따라서 "컴파일"은 항상 발생하며 소스 파일에 작성된 대부분의 코드도 한 번 실행되었습니다. 모든 사람이 이런 방식으로 스크립트 코드를 작성하는 것은 아니지만, 정적으로 형식이 지정된 언어와 잘못된 코드로 인해 발생한 컴파일러 오류의 상대적 "안전성"에 익숙하고 좋아하는 사람 은 스크립트 언어에서 이런 식으로 작동 해야 합니다.
hyde

2

좋은 개발 환경에서는 실제로 코드를 테스트하지 않는 한 컴파일해야 할 이유가 거의 없습니다. 백그라운드 구문 검사 도구는 면접관이 이야기하는 것처럼 보이는 모든 것을 포착하지만 항상 완전히 식별되지는 않는 몇 가지 사례 (파일에 전파되는 변경 사항 포함)가 있음을 인정합니다.

즉, 실제로 결과를 생성 할 수있는 가장 작은 코드 단위를 컴파일하고 실행하려고합니다. 30 분 전에 검색 결과를 인쇄하는 수단을 만들었고 결과를 더 좋게 만들기 위해 결과를 변경하는 10 가지 테스트 인쇄 (종이가 아닌 .pdf로)를 10 회 수행했습니다. 윤곽.


1

내 의견과 내 경험에 따르면, 코드 컴파일 조각은 기본적으로 임의적이며 세미콜론이 없는지 여부와 같은 것을 포함하며 기본 프로그램의 정확성과 거의 관련이 없습니다. (컴파일에 집중하는 것은 문법을 확인하기 위해 교정하지 않고 맞춤법 검사를 통해 기사를 실행하는 것과 같습니다.)

내 경험은 매우 다릅니다. 컴파일 오류의 5 % 미만이 구문 에 관한 것 입니다. 나는 언어를 잘 알고 있으며, 오류가 발생하면 대부분 유형 오류이며 의미 가 올바르지 않다는 것을 알려줍니다 .

그렇기 때문에 컴파일러의 피드백을 통해 최대한 빨리 혜택을받을 수 있습니다. 컴파일 오류를 실시간으로 강조하는 IDE 사용 경험이 있습니까? 피드백 루프가 짧으면 매우 유용 할 수 있습니다.

불완전한 코드 조각을 주면 가장 먼저 읽을 것입니다. 코드가 무엇을하고 알고리즘이 올바른지 알 때까지 컴파일하려고 시도조차하지 않습니다.

다른 사람이 작성한 코드 작업을해야한다면 항상 모든 것을 읽을 시간이있는 것은 아닙니다. 좋은 소식은 잘 작성된 코드의 결합이 낮으므로 필요한 코드의 일부만 독립적으로 추론 할 수 있다는 것입니다.

이 경우 아직 읽지 않은 코드가 올바른 것으로 가정하고 문제가있을 때 게으르게 조사하십시오.

주어진 코드 길이에 대해 "컴파일 코드를 얻는 중"은 일반적으로 일정한 수의 컴파일 오류를 수정하는 것과 관련이 있으며 상당히 일정한 시간이 걸립니다. 코드 작성을 마친 후 또는 인터리브하는 경우에도 동일해야합니다. 코딩 시간과 함께.

컨텍스트 전환은 뇌에 비용이 많이 들기 때문에 작은 오류를 작성하자마자 수정하는 것이 더 효율적일 수 있습니다.

편집 : 전체 팀이 동일한 소스를 작업 할 때 소스 제어와 유사하게 만들 수도 있습니다. 진행하면서 컴파일하는 것은 빈번한 커밋을하는 것과 같습니다. 모든 것을 병합하고 정리해야 할 때 결국 많은 고통을 피하는 데 도움이됩니다.

당신은 당신의 텍스트 아래에 빨간색 선과 같은 것들을 비활성화한다고 말합니다. 이메일을 입력하거나 기술 문서를 작성할 때도 그렇게합니까? 그런 다음 실수를 수정하는 대신 모든 페이지를 교정해야합니다.

또 다른 장점은 코드 작업시 항상 컴파일 또는 거의 컴파일을 유지하면 많은 의미 기반 IDE 기능 (안전한 이름 바꾸기, 리팩토링, 심볼 사용 찾기)을 활용할 수 있다는 것입니다. .

이러한 기능이 어떻게 도움이되는지 더 잘 이해하려면 기능을 활성화하고 연습하여 자신의 이점을 경험해보십시오. 당신은 또한 그들에게 익숙한 사람과 짝을 이루어 프로그램을 시도하고 그들이 어떻게 혜택을 볼 수 있는지 시도 할 수 있습니다.


1
나는 보통 자동 서식 지정, 텍스트 아래에 빨간색 선 그리기 등과 같은 성가신 컴파일러 "기능"을 해제합니다.이 바보 같은 기능이 없으면 생산성이 높아집니다.
CaptainCodeman

1

면접관에게 매우 잘못된 것이 있다고 생각하고 그것이 무엇인지 정확히 알 수 없었기 때문에 이것에 대해 조금 더 생각했습니다. 문제는 다음과 같습니다. 지난 20 년 동안 작성한 코드의 경우, 실행 가능한 알고리즘을 컴파일하는 코드로 변환하는 데 필요한 시간이 최소화되었습니다. 해당 영역의 효율성 향상은 전체 개발 시간에 거의 영향을 미치지 않으므로 완전히 무시할 수 있으며, 해당 영역에서 비 효율성을인지 한 후보자를 거부하는 면접관은 무엇이 좋은 개발자인지를 모릅니다.

대부분의 시간은 코드가 수행해야하는 정보를 수집하고, 사용해야하는 외부 서비스에 대한 정보와 사양을 수집하고, 코드를 함께 해킹하는 대신 정확하고 유지 보수가 가능한 코드로 이어지는 글로벌 디자인을 만들고 알고리즘을 찾는 데 소요됩니다. 작동 할 때까지 함께 패치되는 코드 대신 작동 코드로 이어질 것입니다 (오류가없는 코드 대 오류가없는 코드).

그런 다음 컴파일하는 코드를 작성하는 데 약간의 시간이 걸립니다.

그런 다음 코드가 작동하는지 확인하고 코드가 작동하고 작동 상태를 유지하는지 확인하는 데 더 많은 시간이 걸립니다. 이것은 단위 테스트를 작성하고 코드를 단계별로 수행하며 처음에 잘 설계된 코드를 사용하여 수행됩니다.

이 면접관은 10 개의 단어로 덮여있는 내용에 집중했습니다. 실제 작업 시간의 10 % 이하를 나타냅니다. 신뢰할 수 있고 작동하는 코드를 생성하는 개발자의 능력에 거의 영향을 미치지 않습니다.


그것은 많은 의미가 있습니다. 내 의견으로는, 좋은 개발자는 하루 종일 종이에 코드를 작성할 수 있어야하며, 하루가 끝나면 입력하십시오.
CaptainCodeman 2016 년

1

"따라갈 때 컴파일"의 장점은 지속적인 피드백을 받고 올바른 방향으로 나아 가기 전에는 크게 잘못 될 가능성이 없다는 것입니다. 당신과 같은 유능한 프로그래머에게는 큰 고려 사항이 아니지만 다른 많은 사람들에게는 그렇게 생각합니다. 달리 말하면, "가는대로 컴파일하는 것"은 경우에 잠재적 인 효율성 손실이 있지만 "최대 손실을 최소화하는"방법입니다.

요즘 회사는 완제품에만 관심이 없습니다. 그들은 그것이 "통제"되고 있다는 것을 알고 싶어합니다. 그들에게는 "재미가 반이된다"고 말했다.


이것은 이전 16 답변에 게시 된 것보다 실질적인 것을 제공하지 않는 것 같습니다
gnat

2
고마워.하지만 우리는 어떤 종류의 손실을 이야기하고 있습니까? 실수로 잘못된 언어로 쓰는 것처럼 과감한 일을하지 않으면 컴파일 오류로 인해 코드를 다시 작성할 필요가 없습니다.
CaptainCodeman 2016 년

@CaptainCodeman : 회사의 기분이 좋아지고 "보험"의 한 형태입니다. 그것은 돈이 들지만 대부분의 사람들 (관리자 포함)을 "밤에 더 잘 자"게합니다.
Tom Au

@gnat : 제가하려고하는 요점은 대부분의 혜택이 "기업"수준의 혜택이라는 점이었습니다. 그것은 프로그래머가 옳고 그름을 생각하기 때문에 상사가 그에게 말했기 때문에 프로그래머가해야 할 일입니다.
Tom Au

"더 짧은 피드백 루프" 에 유리한 점이 이미 만들어졌으며 여기 첫 번째 답변에서 잘 설명되어 있습니다. 솔직히 "요즘 회사들"에 대해 추측하는 것만으로도 이미 언급 한 것보다 가치있는 것이 무엇인지 알 수 없습니다.
gnat

1

다른 답변 은 직장 에서 자주 컴파일하는 데 좋은 방어 수단을 제공 하지만 질문이 중심이기 때문에 인터뷰를 그 각도를 다루고 싶습니다.

인터뷰에서 나는 정반대를한다 : 후보자들은 컴파일러를 사용할 수 없다. 그들은 화이트 보드에 짧은 프로그램을 쓴 다음 논의합니다. 너무 많은 개발자가 컴파일러 (또는 인터프리터)를 버팀목으로 사용하고 있으며 너무 드물게 컴파일하는 것보다 시간 낭비가 훨씬 큽니다. 내가 당신에게 많은 돈을 제공하고 컴파일러없이 FizzBuzz를 올바르게 쓸 수 없다면, 장난감 연습보다 100 배 더 어려운 문제에 대해 작업하면서 장기적으로 그것을 잘라 내지 않을 것입니다 인터뷰에서. 그러나이 간단한 연습은 인터뷰의 다른 부분보다 더 많은 후보자를 뽑아 냈습니다.

인터뷰의 목표는 응시자와 비즈니스의 상호 적합성을 평가하는 것입니다. 좋은 인터뷰 질문은 질문의 목표와 인터뷰 대상자가 어떻게 평가 될 것인지를 명시해야합니다. 인터뷰 대상자에게 간결한 질문을 제기 한 다음 숨겨진 답변을 모르는 것에 대해 처벌하는 것은 인터뷰 대상자 또는 인터뷰 대상자에게 도움이되지 않습니다. 불행히도, 대부분의 프로그래머, 심지어 수석 프로그래머는 다른 프로그래머를 인터뷰하도록 훈련받지 않았으므로, 진부한 의견에 의존하고 인터뷰 할 때 요청한 것과 동일한 유형의 질문을합니다. 또는 아닙니다.

나는 나의 접근 방식이 "진정한 방법"이라고 주장하지는 않지만, 그것은 나에게 매우 도움이되었다. 대문자로 시작하는 많은 소프트웨어 방법과 마찬가지로 인터뷰를위한 동일한 수의 "권한"이 있습니다. 그들은 모두 이층입니다. 귀하와 귀하의 비즈니스에 적합한 것을 수행해야합니다.


0

일부 서브 루틴이있는 대규모 프로젝트에서는 특정 부품이 이미 작동하는 것을 알고 있으면 디버그하기가 더 쉽기 때문에 더 큰 구성표로 사용하기 전에 이러한 부품을 테스트하려고합니다.

이러한 작은 조각을 테스트하려면 컴파일해야합니다.

면접관은 이러한 상황을 이러한 방식으로 설계되지 않은 작은 프로그램과 혼동 할 수 있습니다.


0

두 번째 인터뷰와 관련하여 컴파일의 이점은 단 몇 초 안에 프로그램의 기능 (또는 기능)을 관찰 할 수 있다는 것입니다. 거기에서 코드를 읽고 관련 부분에 집중하는 것이 더 쉽습니다. 아마도 이것이 면접관이 기대했던 것입니다.

알 수없는 코드베이스를 처음부터 끝까지 읽는 것은 비생산적 일 수 있지만 (컴파일러가 아님) 응용 프로그램을 컴파일 / 실행하면 빠르게 더 큰 그림을 볼 수 있습니다.


이것은 이전 15 답변에 게시 된 것보다 실질적인 것을 제공하지 않는 것 같습니다
gnat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.