신화적인 남자 달 개발자 당 10 라인-큰 프로젝트에 얼마나 가깝습니까? [닫은]


129

모든 사람들은 항상 "신화적인 남자의 달"에서 "하루에 개발자 당 10 줄"을 이길 수 있고 프로젝트를 시작하면 보통 하루에 몇 백 줄을 얻을 수 있다고 말합니다.

그러나 이전 고용주에서 모든 개발자는 매우 날카로 웠지만 엄청난 프로젝트, 백만 줄 이상의 코드, 매우 엄격한 인증 요구 사항 및 다른 수백만 라인 프로젝트와의 인터페이스였습니다. 어떤 시점에서, 호기심을 불러 일으키기 위해 그룹의 배송 제품에 코드 줄을 작성했으며 (우리가 개발 한 도구는 계산하지 않음), 개발자마다 하루에 약 12 ​​줄이 추가되었습니다. 변경 사항, 테스트 코드 또는 개발자가 매일 실제 프로젝트 코드를 작성하지 않았다는 사실을 세지 마십시오.

다른 사람들은 어떻게 지내고 있습니까? 그리고 어떤 종류의 요구 사항에 직면하고 있습니까?


13
커뮤니티 위키 여야합니다.
Malfist 2016 년

24
"10"이 이진수이면 마크에 더 가깝습니다.
geofftnz 2016 년

2
매우 흥미로운 질문입니다. :)
Emil H

9
이 코드에서“코드 줄로 프로그래밍 진행률을 측정하는 것은 항공기 건물의 진행률을 무게로 측정하는 것과 같습니다.” 이 웹 사이트에서 [link] ( devtopics.com/101-great-computer-programming-quotes )
mm24

2
@Greg Bacon, Bill the Lizard :이 질문을 다시 열어보고 싶습니다. SO의 규칙에 정확히 맞지 않을 수도 있지만 방문자를 확실히 끌어 들이고 있습니다. (35875 viewers now)
Skippy Fastol

답변:


46

추가 된 줄 수는 프로젝트 상태에 따라 크게 달라지며 새 프로젝트에 추가하는 비율은 시작하는 프로젝트의 비율보다 훨씬 높습니다.

큰 프로젝트에서는 대부분 부품 간의 관계를 파악하는 데 대부분의 시간을 소비하며 실제로 변경 / 추가하는 데 소량 만 사용됩니다. 반면 새로운 프로젝트에서-당신은 대부분 충분히 씁니다.


과연. 앞서 언급 한 프로젝트에서 순 광고는 훨씬 더 컸습니다.
Matthias Wandel

1
따라서 분리를 위해 큰 프로젝트를 여러 개의 독립적 인 부분 (독립 프로젝트 일 수도 있음)으로 분할한다는 이론을 유지합니다.
sergzach

108

현재 프로젝트 중 하나에서 일부 모듈에서 코드베이스에 마이너스 라인 수를 기여한 것을 자랑스럽게 생각합니다. 어떤 코드 영역이 불필요하게 복잡 해졌고 더 깨끗하고 명확한 디자인으로 단순화 될 수 있는지 식별하는 것은 유용한 기술입니다.

물론 일부 문제는 본질적으로 복잡하고 복잡한 솔루션이 필요하지만 요구 사항이 잘못 정의되거나 변경되는 대부분의 대규모 프로젝트 영역에서는 라인 당 더 많은 문제가있는 지나치게 복잡한 솔루션이 있습니다.

해결해야 할 문제가 있다면 줄 수를 줄이는 솔루션을 선호합니다. 물론 작은 프로젝트를 시작할 때 매일 10 줄 이상의 코드를 생성 할 수는 있지만 작성한 코드의 양은 생각하지 않고 코드의 기능과 성능은 생각하지 않습니다. 나는 확실히 하루에 10 줄을 이길 것을 목표로하지 않을 것입니다.


49
마이너스 라인 기여에 +1 한때 작은 프로젝트를 수행하면서 새로운 기능을 추가하면서 버그 수를 크게 줄이고 속도를 높이면서 줄 수를 15K에서 5K로 줄였습니다.
rmeador

55

나는이 인용문을 좋아한다 :

코드 줄을 세려면 "생산 라인"으로 간주하지 말고 "소비 라인"으로 간주해야합니다. -Edsger Dijkstra

때때로 당신은 추가하는 것보다 코드를 제거함으로써 더 많은 기여를했습니다


30

이 측정 항목 사용을 중지해야합니다. 대부분 의미가 없습니다. 응집력, 결합 및 복잡성은 코드 라인보다 더 중요한 지표입니다.


25
생산성 지표로 사용하지 않았습니다. 이것은 나의 호기심을위한 개인적인 운동이었다.
Matthias Wandel

3
그럴 수 있지. 그럼에도 불구하고 코드 라인으로 간주되는 것에 대한 더 정확한 정의 없이는 대답하기가 어렵습니다.
Otávio Décio 2016 년

1
P : @Matthias : 나는 당신이라면 하나가되었을 것이다 위해 나는 OP에 덜 ... 공격적 I를 그 편집한다
annakata

28

다른 사람들은 어떻게 지내고 있습니까?

저는 회사 에서 유일하게 풀 타임 개발자 이며 지난 7 년간 500,000 줄의 OCaml 및 F # 코드를 작성했으며 이는 하루에 약 200 줄의 코드와 같습니다. 그러나이 코드의 대다수는 각각 수백 줄 길이의 수백 개의 개별 프로젝트로 구성된 자습서 예제입니다. 또한 OCaml과 F #간에 중복이 많이 있습니다. 우리는 50kLOC보다 큰 사내 코드 기반을 유지하지 않습니다.

나는 우리 자신의 소프트웨어를 개발하고 유지하는 것 외에도 지난 7 년 동안 업계의 많은 고객들과 상담했습니다. 첫 번째 고객을 위해 3 개월 동안 하루에 20 줄의 코드 인 2,000 줄의 OCaml을 작성했습니다. 다음 고객을 위해 우리 중 4 명은 개발자 당 하루에 2,000 줄의 코드 인 6 개월의 문서와 수백만 줄의 C / C ++ / Python / Java / OCaml 코드를 생성하는 컴파일러를 작성했습니다. 다른 클라이언트의 경우 C ++ 50kLOC를 6 개월 동안 6kLOC의 F #으로 바 꾸었습니다. 이는 하루에 -352 줄의 코드입니다. 들어 또 다른 클라이언트 , 나는 하루에 코드 0 라인 때문에 같은 크기입니다 F #으로 OCaml의의 15kLOC를 재 작성하고 있습니다.

들어 우리의 현재 클라이언트 , 나는 하루에 코드 -6,000 라인이 될 것이다 (맞춤형 컴파일러 작성) 1 년 F 번호의 ~ 160kLOC와 C ++ 및 매스 매 티카 코드 1600000 개 라인을 대체합니다. 이 프로젝트는 현재까지 제가 가장 성공한 프로젝트이며 고객에게 지속적인 비용으로 연간 수백만 달러를 절약 할 것입니다. 모든 사람이 하루에 -6,000 줄의 코드를 작성하는 것을 목표로해야한다고 생각합니다.


1
나는 당신의 대답을 좋아하고 풍자를 이해합니다. 호기심과 마찬가지로 F #으로 코드를 다시 작성하면 고객에게 비용이 절약되는 이유를 분명히 설명해 주시겠습니까? 나는 OCaml의 익숙했고 해당 언어로 통역을 썼다 않았고 몇 년 이후 언어를 터치하지 않았고, (나는 이것에 대해 geniuinely 궁금 있도록) 지금은 F 번호의 청각 계속
mm24

7
@ mm24 "F #으로 코드를 다시 작성하면 고객에게 비용이 절약되는 이유를 분명히 설명해 주시겠습니까?" 첫째, 그들은 Wolfram Research에 의해 망쳐 져서 [LongDash]의 의미를 변경하는 등 Mathematica 업그레이드에서 의도적으로 도입 한 문제를 해결하기 위해 1 백만 파운드의 컨설팅 계약을 청구합니다. 둘째, 그들은 현재 하나의 F # 코드베이스와 함께 유지 관리되는 두 개의 코드베이스 (Mathematica & C ++)를 통합하여 중복 된 노력뿐만 아니라 테스트에서 식별 된 제품 업데이트 및 수정으로 인한 많은 상호 작용을 줄입니다.
JD

7
@ mm24 셋째, 자동화. 이들은 자동화 할 기존 .NET 도구가 있거나 .NET을 사용하여 이러한 도구를 쉽게 구성 할 수 있도록 많은 작업을 직접 수행하고 있습니다. 작업에는 성능 측정 (프로파일 러 사용), 직렬화기를 직접 작성 (라이브러리 사용), 키-값 이름을 수동으로 복사 (반사 사용) 및 비즈니스에서 제출 한 라이브 시스템에 대한 중요 업데이트가 타이머로 작동하는 계측 코드가 포함됩니다. 직접 IT (비즈니스가 직접 변경할 수 있도록 도구 작성)
JD

7
@ mm24 넷째, 대규모 성능 향상. F #은 Mathematica보다 훨씬 빠르며 F #의 개념 증명 코드는 프로덕션 C ++ 코드보다 5 배 빠릅니다. 즉, 테스트는 몇 시간이 아닌 몇 초 만에 실행되므로 테스트는 개발의 필수 부분이되어 생산성이 크게 향상됩니다.
JD

7
@ mm24 다섯 번째, 기능이 향상되었습니다. 그들은 데드 코드를 제거하고 테스트의 코드 적용 범위를 측정하려고하지만 현재 사용중인 도구로는이를 수행 할 수 없습니다. .NET으로 옮기면이 작업이 쉬워집니다.
JD

13

실제로 "The Mythical Man-Month"(이 문서를 읽는 사람은 누구나 쉽게 구할 수있는 사본이 있어야 함)의 사본을 확인하지 않고 Brooks가 작성된 라인으로 생산성을 살펴 보는 장이있었습니다. 그에게 흥미로운 점은 하루에 쓰여진 실제 줄 수가 아니라 어셈블러와 PL / I에서 거의 같은 것으로 보인다는 사실입니다 (고급 언어라고 생각합니다).

Brooks는 일종의 임의의 생산성 수치를 포기하지는 않았지만 실제 프로젝트의 데이터를 사용하여 작업하고 있었으며 평균적으로 하루 12 라인이었을 수도 있습니다.

그는 생산성이 달라질 수 있다고 지적했다. 그는 컴파일러가 애플리케이션 프로그램보다 3 배, 운영 체제는 컴파일러보다 3 배 어렵다고 말했다. (그는 카테고리를 분리하기 위해 3의 승수를 사용하는 것을 좋아 한 것 같습니다.)

그가 프로그래머의 생산성 사이의 개별적인 차이점을 이해했는지는 모르겠지만 (크기 순서의 논쟁에서 그는 7 가지 차이점을 가정했지만) 우리가 아는 것처럼 우수한 생산성은 더 많이 쓰는 것이 아닙니다 코드뿐만 아니라 작업을 수행하기 위해 올바른 코드를 작성합니다.

환경에 대한 질문도 있습니다. Brooks는 개발자를 더 빠르거나 느리게 만드는 것에 대해 조금 추측했습니다. 많은 사람들과 마찬가지로, 그는 현재 유행 (시간 공유 시스템을 사용한 대화 형 디버깅)이 기존 방식보다 더 나은지에 대해 의문을 제기했습니다 (전체 시스템을 사용하여 2 시간 동안 신중하게 사전 계획).

이를 감안할 때, 그가 생각했던 실제 생산성 수치는 쓸모가 없다고 생각합니다. 이 책의 지속적인 가치는 사람들이 배우지 않고 계속 유지하는 원리와보다 일반적인 교훈에 있습니다. (만일 모든 사람이 그것들을 배웠다면이 책은 잠재 의식적인 마음과 같은 무언가가 있다는 프로이트의 모든 주장과 마찬가지로 역사적 관심사 일 뿐이다.)


3
다른 프로그래머의 생산성에 대한 생각-내 경험상, 평범한 프로그래머는 주어진 문제를 해결하는 데 x 배 더 오래 걸리지 만 불행히도 코드를 작성하는 동안 x 배 더 많은 코드를 작성합니다. 따라서 단순한 "하루에 한 줄의 코드"로 평범한 프로그래머는 생산성도 향상됩니다.
Matthias Wandel

11

하루에 수백 줄의 코드를 쉽게 얻을 수 있습니다. 그러나 하루에 수백 줄의 코드를 얻으려고 노력하면 쉽지 않습니다. 하루에 줄이 거의 없거나 전혀없는 디버깅과 며칠을 거치면 평균이 다소 빨리 떨어집니다. 나는 어려운 문제를 디버깅하는 데 몇 주를 보냈으며 대답은 1 또는 2 줄의 코드입니다.


과연. 그러나 프로젝트가 커질수록 그 시나리오에 더 자주 부딪 칠 것입니다. 나는 버그가없는 완벽한 10 라인 프로그램을 작성했습니다. 그것은 모든 규모의 문제입니다.
Matthias Wandel

1
버그가없는 프로그램은 없습니다.
Daniel Moura 2016 년

14
바! 당신의 문법에 버그가 있습니다 ...
RAL

3
@DanielMoura 오, 나는 그 의견에 동의하지 않을 것입니다 ... "hello world"프로그램은 그다지 유용하지는 않지만, 버그가 없다고 확신 할 수 있습니다. :)
WendiKidd

10

물리적 인 코드 라인을 말하는 것은 의미가 없다는 것을 깨닫는 것이 훨씬 낫습니다. LoC (물리적 코드 라인)의 수는 코딩 스타일에 따라 달라 지므로 개발자마다 규모가 다를 수 있습니다.

.NET 세계에서는 LoC를 계산하는 편리한 방법이 있습니다. 시퀀스 포인트 . 시퀀스 포인트는 디버깅 단위이며, 브레이크 포인트를 넣을 때 진한 빨간색으로 강조 표시된 코드 부분입니다. 시퀀스 포인트를 사용하면 논리적 LoC에 대해 이야기 할 수 있으며이 지표는 다양한 .NET 언어에서 비교할 수 있습니다. 논리적 LoC 코드 메트릭은 VisualStudio 코드 메트릭, NDepend 또는 NCover를 포함한 대부분의 .NET 도구에서 지원됩니다.

예를 들어, 다음은 8 LoC 방법입니다 (시작 및 끝 대괄호 시퀀스 포인트는 고려되지 않음).

대체 텍스트

LoC 생산은 장기적으로 계산되어야합니다. 어떤 날에는 200 LoC 이상을 뱉고 어떤 날에는 단일 LoC를 추가하지 않아도 버그를 수정하는 데 8 시간을 소비합니다. 언젠가 죽은 코드를 정리하고 LoC를 제거 할 것입니다. 언젠가는 기존 코드를 리팩토링하고 전체 LoC를 추가하지 않는 데 모든 시간을 소비합니다.

개인적으로 다음과 같은 경우에만 생산성 점수에서 단일 LoC를 계산합니다.

  1. 단위 테스트에 포함됩니다
  2. 그것은 일종의 코드 계약과 관련이 있습니다 (가능한 경우, 모든 LoC를 계약으로 확인할 수있는 것은 아닙니다).

이 조건에서 지난 5 년 동안 .NET 개발자를위한 NDepend 도구를 코딩하는 개인 점수 는 코드 품질을 저하시키지 않으면 서 하루 평균 80 개의 물리적 LoC입니다 . 리듬이 지속되며 조만간 감소하지는 않습니다. 대체로 NDepend는 현재 약 115K 물리적 LoC의 가중치를 부여하는 C # 코드베이스입니다.

LoC 계산을 싫어하는 사람들에게 (여기서 의견에서 많은 것을 보았습니다), 일단 적절하게 보정되면 LoC 계산이 훌륭한 평가 도구 임을 증명합니다 . 특정 개발 환경에서 달성 한 수십 가지 기능을 코딩하고 측정 한 후 LoC의 TODO 기능의 크기와 프로덕션에 제공하는 데 걸리는 시간을 정확하게 추정 할 수있는 시점에 도달했습니다.


1
귀하의 게시물은 기본이며 훨씬 더 많은지지를받을 가치가 있습니다.
Skippy Fastol

9

은 총알 같은 것은 없습니다.

이와 같은 단일 메트릭은 그 자체로는 쓸모가 없습니다.

예를 들어, 나는 자신의 클래스 라이브러리를 가지고 있습니다. 현재 다음과 같은 통계가 적용됩니다.

총 라인 : 252.682
코드 라인 : 127.323
코멘트 : 99.538
빈 라인 : 25.821

주석을 전혀 쓰지 않는다고 가정 해 봅시다. 즉, 127.323 줄의 코드입니다. 귀하의 비율로 코드 라이브러리를 작성하는 데 약 10610 일이 걸립니다. 29 년입니다.

C 코드이기 때문에 29 년 동안 코드를 작성하지 않았으며 C #은 오랫동안 사용되지 않았습니다.

자, 당신은 코드가 그다지 좋지 않다고 주장 할 수 있습니다. 분명히 나는 ​​하루 12 줄을 넘었을 것이므로 분명히 동의 할 것입니다. 그러나 타임 라인을 낮추려면 1.0이 릴리스 될 때 (그리고 실제로 2.0이 릴리스 될 때까지 실제로 시작하지 않았습니다), 2002-02-13, 약 2600 일, 평균은 하루 48 줄의 코드입니다.

그 코드 줄이 모두 좋습니까? 도대체 그러나 하루에 12 줄의 코드로 줄이겠습니까?

도대체

모든 것이 다릅니다.

하루에 수천 줄의 코드를 생성하는 최고 수준의 프로그래머와 하루에 수백 줄의 코드를 생성하는 중간 프로그래머를 가질 수 있으며 품질은 동일합니다.

그리고 그렇습니다, 벌레가있을 것입니다.

당신이 원하는 총액은 균형입니다. 발견 된 버그 수, 코드의 복잡성, 버그 수정의 어려움과 비교하여 변경된 코드 양.


아멘! (15 분 이상을 수용 할 수있는 추가 공간)
Nate

이러한 통계는 DPack ( usysware.com/dpack )에 의해 계산되었습니다 .
Lasse V. Karlsen 2016 년

5
아마도 하루 10 줄 규칙은 작성한 클래스 라이브러리와 같이 더 작은 것에 적용되지 않을 것입니다 (나는 스스로 가정합니다). Brooks의 많은 수는 대규모 프로젝트 (IBM의 OS360)에서 나 왔으며, 이는 클래스 라이브러리와 기본적으로 다른 규모입니다. 내 생각에 Brooks의 관찰은 많은 사람들과 중요한 인적 커뮤니케이션 네트워킹이 필요한 대규모 프로젝트에는 유효하지만 소규모 프로젝트에는 유효하지 않습니다.
J. Polfer

6

Steve McConnell은 자신의 저서 "Software Estimation"에서 흥미로운 통계를 제공합니다 (p62 표 5.2) 그는 프로젝트 유형 (Avionic, Business, Telco 등)과 프로젝트 크기 10kLOC, 100kLOC, 250kLOC를 구분합니다. LOC / StaffMonth의 각 조합에 대한 번호가 제공됩니다. EG Avionic : 200, 50, 40 인트라넷 시스템 (내부) : 4000, 800, 600 내장 시스템 : 300, 70, 60

예 : Avionic 250-kLOC 프로젝트의 경우 40 (LOC / Month) / 22 (Days / Month) == <2LOC / day입니다!


1
250 테라 라인 코드? KLoC의 문제점은 무엇입니까?
fadedbee

4

프로젝트의 실제 개발 단계가 전체 프로젝트 시간의 20-30 %에 불과할 수있는 폭포 개발 날짜 에서 비롯된 것 같습니다 . 전체 코드 줄을 가져와 전체 프로젝트 시간으로 나누면 하루에 약 10 줄을 얻을 수 있습니다. 코딩 기간만으로 나누면 사람들이 인용 한 내용에 더 가까이 다가 갈 수 있습니다.


3

우리의 코드베이스는 약 150 만 년 동안 2.2MLoC입니다. 그것은 프로젝트의 전체 수명 동안 개발자 당 하루 에 약 75 줄의 C ++ 또는 C #을 만듭니다.


2

프로젝트 크기와 관련된 개발자 수가이 요소에 큰 영향을 미친다고 생각합니다. 나는 내 경력보다 훨씬 뛰어 났지만 항상 혼자 일했기 때문에 다른 프로그래머와 일하는 데 손실이 없습니다.


1
소규모 프로젝트는 도움이되며 독방도 마찬가지입니다. 나는 우리가 적어도 역사적으로이 역사적 수치에 도달 한 것을보고 충격을 받았다. 이 프로젝트가 시작될 때 생산성이 10 배 이상 높아졌습니다.
Matthias Wandel

2

좋은 계획, 좋은 디자인 및 좋은 프로그래머. togheter를 모두 얻으면 한 줄을 작성하는 데 30 분을 소비하지 않습니다. 예, 모든 프로젝트는 중지하고 계획하고, 생각하고, 토론하고, 테스트하고 디버깅해야하지만 모든 회사는 하루에 두 줄씩 테트리스가 작동하도록 군대가 필요합니다 ...

결론적으로, 만약 당신이 시간당 2 줄로 나를 위해 일한다면, 당신은 나에게 많은 커피를 마시고 발을 마사지하여 해고 당하지 않는 것이 좋습니다.


1

모든 것이 C로 작성된 시스템 응용 프로그램 일 때이 매해 관리자의 사탕이 만들어 졌다고 의심합니다. 다른 경우가 없다면 마법의 숫자는 응용 프로그램의 언어, 규모 및 특성에 따라 수십 배가 될 수 있기 때문입니다. 그리고 의견과 속성을 할인해야합니다. 그리고 궁극적으로 누가 작성된 코드 줄에 관심이 있습니까? 당신이 10K 라인에 도달했을 때 끝내야합니까? 100K? 그래서 임의적입니다.

그건 소용 없어.


그러면 프로젝트의 크기를 어떻게 설명합니까?
Matthias Wandel

1
"The Mythical Man-Month"에서 유래 한 경우, C보다 오래 전부터 사용됩니다. 이 책에서 Brooks는 언어에도 불구하고 매일 라인 단위로 프로그래머 출력이 일정하다는 아이디어를보고보다 표현력이 높은 언어 (기능 단위당 라인 수가 적을수록)는 더 생산적인 프로그래머가 될 것이라고 추측했습니다. 그는 그 숫자가 매우 다양하다는 것을 알고있었습니다 (그의 경험에 따르면 운영 체제는 응용 프로그램보다 약 9 배 더 어려웠습니다).
David Thornley

2
이산 코드 단위, 연결 지점 (즉, 단위 상호 작용), 계층, 클래스 (OOP) ... 약 백만 가지 방법이 있습니다. KLOC는 잠재적 인 복잡성 단위 이외의 다른 좋은 측정 방법이 아닙니다 . (EG, "이를 찾기 위해 4 개의 KLOC를 뚫어야했기 때문에 디버깅에 3 주가 걸렸습니다!")
John Rudy

2
@David : 나는 그것이 어디에서 왔는지 알고 있습니다. 질문을 읽을 수 있으며 지금 바로 앞 선반에있는 책을 들었습니다. 흥미롭게도 첫 번째로 게시 된 날짜는 C가 3 년이 지난 시점입니다. 저의 요점은 분명히 고풍스럽고 그 개념은 쓸모가 없다는 것입니다. 하! 정말 성경적입니다.
annakata 2016 년

우리는 많은 연결 지점을 가지고있었습니다. 그러나 당신은 그것들을 어떻게 계산합니까? 무언가가 언제 연결 지점이됩니까? 수업은 언제 중요합니까? 컴파일 된 코드 크기는 주어진 시스템 및 언어 내에서 더 나은 측정 기준이지만 시스템마다 다릅니다.
Matthias Wandel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.