코드 안정성을 측정하기위한 소스 코드 메트릭?


17

릴리스주기 (구현, 테스트, 버그 수정, 릴리스) 동안 소프트웨어가 개발되는 방식을 고려할 때 코드베이스에서 변경된 코드 행에서 일부 패턴을 볼 수 있어야한다고 생각했습니다. 예를 들어, 프로젝트가 끝날 무렵 코드가 더 안정되면 단위 시간당 더 적은 코드 줄이 수정되는 것을 볼 수 있습니다.

예를 들어, 프로젝트의 첫 6 개월 동안 평균은 하루에 200 줄의 코드 였고, 마지막 달에는 하루에 50 줄의 코드였으며 마지막 주에는 (제품 DVD가 나오기 직전에) 코드 줄이 전혀 변경되지 않았습니다 (코드 동결). 이것은 단지 예일 뿐이며 특정 팀이 채택한 개발 프로세스에 따라 다른 패턴이 나타날 수 있습니다.

어쨌든, 코드베이스의 안정성을 측정하기 위해 단위 시간당 수정 된 코드 라인 수를 사용하는 코드 메트릭이 있습니까? 프로젝트가 어딘가에 있거나 아직 출시 준비가되지 않은 느낌이들 때 유용합니까? 버전 관리 시스템에서이 정보를 추출하고 통계를 생성 할 수있는 도구가 있습니까?



4
"두 번째로, 메커니즘은 추상적이며, 그 생산은 디자인에 포함되어있다.이 점에서 프로그램은시와 같다 : 당신은 그것을 쓰지 않고시를 쓸 수 없다. 그러나 사람들은 프로그래밍을 마치 생산 과정 인 것처럼 측정하고 측정한다" "생산 된 코드 라인 수"의 관점에서 프로그래머 생산성 ". 그렇게함으로써 그들은 원장의 잘못된쪽에 그 번호를 예약합니다. 우리는 항상"사용 된 코드 라인 수 "를 참조해야합니다. - 오해의 열매 , Edsger W. Dijkstra.
yannis

3
@Yannis Rizos : LOC가 생산성이나 코드 복잡성을 측정하는 것은 결코 좋은 방법이 아니라는 것을 알기 때문에 결코 제안하지 않습니다. 반면, 배송 이틀 전에 300 줄의 코드가 변경되면 관리자로서 마음에 큰 "RED ALERT"램프가있을 것입니다 (이것이 계획되어 있지 않고 위험을 매우 신중하게 평가 한 결과가 아니라면) ). 일반적으로, 오랫동안 변경하지 않고 사용 (및 테스트) 된 코드는 매일 100 줄씩 변경되는 코드보다 "보다 안정적"이라고 가정합니다.
Giorgio

2
@ Giorgio Argh, 나는 다른 의견을 게시하는 동안 중단되었습니다 (여기의 작업 중간). 생산성에 대해 이야기하고 있음을 의미하지는 않았지만 Dijkstra 견적이 마음에 들었고 흥미로울 것이라고 생각했습니다. 어쨌든 코드 이탈 메트릭은 원하는 내용과 매우 유사하며 수많은 문헌이 있습니다. 도구의 경우 Atlassian의 FishEye 는 훌륭합니다.
yannis

@Yannis Rizos : 정말 흥미로운 책입니다. FishEye는 작업장 (리뷰 용)에서 사용하므로 즉시 설명서를 살펴보고 어떤 종류의 통계를 만들 수 있는지 확인합니다.
Giorgio

답변:


17

Michael Feather의 설명 중 하나는 " Active Class of Classes "입니다.

그는 "폐쇄 된"클래스에 추가 된 클래스 수를 측정합니다. 클래스 폐쇄를 다음과 같이 설명합니다.

수업은 해당 날짜부터 현재까지 더 이상 수정되지 않는 날짜에 마감됩니다.

그는 이러한 측정 값을 사용하여 다음과 같은 차트를 작성합니다. 액티브 클래스 차트

두 줄 사이의 간격이 작을수록 좋습니다.

코드베이스에 유사한 측정 값을 적용 할 수 있습니다. 클래스 수는 코드 줄 수와 관련이있을 수 있습니다. 클래스 단위로 코드 라인을 통합하기 위해 이것을 확장하는 것이 가능할 수도 있습니다. 큰 모 놀리 식 클래스가있는 경우 그래프 모양이 변경 될 수 있습니다.


4

기능을 클래스에 비교적 일관되게 매핑하거나 파일 시스템에 파일 시스템을 연결하는 한 gource 와 같은 것을 연결할 수 있습니다 버전 제어 시스템에 연결하고 대부분의 개발에 초점을 둔 부분을 매우 빠르게 이해할 수 있습니다. 가장 불안정한 코드 부분).

이것은 당신이 비교적 깔끔한 코드베이스를 가지고 있다고 가정합니다. 코드베이스가 진흙 덩어리라면 상호 의존성으로 인해 모든 작은 부분이 작동하는 것을 볼 수 있습니다. 즉, 기능 자체를 작업하는 동안의 클러스터링 자체가 코드 기반의 품질을 잘 나타내는 것일 수 있습니다.

또한 비즈니스 및 개발 팀 전체에 개발 기능을 분리 할 수있는 방법이 있다고 가정합니다 (버전 관리, 한 번에 하나의 기능 등). 예를 들어 같은 지점에서 3 가지 주요 기능을 작업하는 경우이 방법은 코드 안정성보다 문제가 크기 때문에 의미없는 결과를 생성합니다.

불행히도, 나는 나의 요점을 증명할 문헌이 없다. 그것은 좋은 (그리고 좋지 않은) 코드베이스에서 gource를 사용한 경험에 근거합니다.

git 또는 svn을 사용하고 있고 gource 버전이 0.39보다 크면 프로젝트 폴더에서 gource를 실행하는 것처럼 간단합니다.


gource는 또한 훌륭한 도구 인 것 같습니다! (+1)
Giorgio

1
나는이 답변을 우연히 발견 한 후 다음 6 시간 동안 Gource와 함께 연주했다. 나는 그것이 +1 또는 -1을받을 가치가 있는지 확실하지 않지만 젠장, 그것은 멋진 도구입니다.
RonU

@RonU : gource를 사용하여 사용자 정의 시간 범위에서 저장소의 상태를 시각화 할 수 있습니다. 요점은 시간이 지남에 따라 코드 기반의 활동을 시각화한다는 것입니다. 위의 답변에서 설명한 것처럼 정보를 쉽게 해석하는 방법은 많은 요소에 따라 다릅니다. 그렇습니다. "큰 그림"을 원한다면 놀라운 도구이므로 +1이 필요하다고 생각합니다.)
Carl

예, "6 시간"이라고 말했을 때 나는 그 시간 동안 하나의 Gource sim을 운영했다는 것을 의미하지는 않았습니다. 많은 옵션을 가지고 놀았고, ffmpeg로 파이프를 썼으며, 서사적 사운드 트랙을 추가했을 수도 있습니다. 꽤 토끼 구멍이었다. :)
RonU 2013

렘 추측. 사운드 트랙은 반복 된 할렘 셔플이었습니다.)
Carl

0

코드 안정성에 대한 지표로서 수정 된 라인의 빈도를 사용하는 것은 적어도 의심 스럽다.

처음에 수정 된 라인의 시간에 따른 배포는 프로젝트의 소프트웨어 관리 모델에 크게 의존합니다. 다른 관리 모델에는 큰 차이가 있습니다.

두 번째로,이 가정에서의 사상자는 명확하지 않습니다. 소프트웨어의 안정성으로 인한 수정 된 줄의 수가 적거나 단순히 기한이 만료되고 개발자가 현재 일부 변경을하지 않기로 결정했지만 해제?

셋째, 새로운 기능이 도입 될 때 대부분의 라인이 수정됩니다. 그러나 새로운 기능으로 인해 코드가 안정적이지 않습니다. 개발자의 기술과 디자인의 품질에 달려 있습니다. 반면에, 줄을 거의 바꾸지 않으면 서 심각한 버그도 수정 될 수 있습니다.이 경우 소프트웨어의 안정성은 크게 향상되지만 변경된 줄 수는 그다지 크지 않습니다.


"개발자의 기술과 디자인의 품질에 달려 있습니다." 가장 숙련 된 개발자조차도 압박감을 느끼거나 초과 근무를 너무 많이했거나 잠이 너무 적은 경우와 같이 타이핑 실수를 할 수 있습니다. 또한 개방 / 폐쇄 원칙을 적용하면 잠시 후 변경 횟수 (버그 수정)가 줄어 듭니다. 어쨌든, 나는 내 측정에서 그러한 측정의 결과가 개발 과정에 따라 변경 될 수 있다고 명시 적으로 언급했습니다.
Giorgio

BTW, 개발자가 나쁜 것이 아니라 요구 사항이 명확하지 않고 프로젝트가 아직 프로토 타입 단계에 있기 때문에 코드가 불안정 할 수 있습니다.
Giorgio

@Giorgio : 물론 그렇습니다. 그러나 이것은 내가 쓴 것입니다 : 수정 된 줄의 수는 너무 많은 요인에 달려 있습니다. 그들 중 일부는 코드 안정성과 관련이 있으며 일부는 그렇지 않습니다. 그것은 더 많은 사람들이 섹스를하는 것을 계산하고 전력을 측정하여 가정합니다. 비록 큰 정전 후 출생률이 높아지고 있음이 입증되었습니다. ;)
johnfound

-1

견고성은 명령어를 표현하는 데 사용되는 텍스트의 양, 상세도, 간결함, 문법 정확성이 아니라 명령어 세트의 올바른 기능과 관련된 용어입니다.

실제로 구문은 중요하고 정확해야하지만 그 이외의 것은 지시 사항의 '메트릭'을 보면 지시 사항의 원하는 기능과 관련되어 있기 때문에 아래쪽의 차잎 패턴을 읽음으로써 미래를 계획하는 것과 유사합니다. 당신은 차 잔.

견고성은 테스트 방법으로 측정됩니다. 단위 테스트, 연기 테스트, 자동 회귀 테스트; 테스트, 테스트, 테스트!

귀하의 질문에 대한 나의 대답은 견고성에 대한 답을 찾는 데 잘못된 접근법을 사용하고 있다는 것입니다. 코드 줄은 코드를 채우는 것 이상을 의미하는 빨간색 청어입니다. 코드가 필요한 작업을 수행하고 있는지 테스트 한 경우 코드가 원하는 작업을 수행하는지 여부 만 알 수 있습니다.

적절한 테스트 장치를 다시 방문하고 코드 메트릭 신비를 피하십시오.

최고의 소원.


3
코드 복잡성의 척도로 LoC를 제안하지 않았다고 명시 적으로 언급했습니다. 코드 안정성을 측정하기 위해 코드 변경 사항을 제안했습니다. 코드 조각에는 안정적인 기능 요구 사항과 해당 요구 사항을 충족하는 테스트를 거친 안정적인 구현이 있습니까?
Giorgio

나는 당신과 논쟁하고 싶지 않지만 코드 메트릭의 무의미한 어리 석음으로부터 당신을 정중하게 안내합니다. 나는 당신에게 질문을 다시 읽고 귀하의 예는 모두 코드 라인 변경과 그로 인한 견고성 간의 관계를 유추하려는 욕구를 나타냅니다. 더 많은 단어를 입력할수록 오타가 ​​발생할 가능성이 높아집니다. 그러나 나는 당신이 이런 식으로 당신의 퀘스트를 포기하기를 강력히 제시해야한다는 당신의 요구에있어서 그는 그의 원칙에 위배됩니다. 좋은 테스트 관행 = 견고성.
Sassafras_wot

"좋은 테스트 관행 = 견고 함의 가능성": 전적으로 동의합니다. 그렇기 때문에 최근에 변경된 코드를 다시 테스트해야 올바른지 확신 할 수 있습니다.
Giorgio

안정성에 대한 몇 가지 정의가 있으며 그중 하나는 당신이 주장하는 것입니다. 내가 만든 것과 다른 의미 론적 해석입니다. 나는 "변화에 저항하는"것이 아니라 "극단적 인 변화에 영향을받지 않는다"는 의미로 안정을 취했다
Dave Hillier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.