버전 관리를 사용할 때 모든 코드 파일에 "변경 로그"를 포함시킬 필요가 있습니까?


75

나는 버전 제어 시스템이 코드의 어느 곳에서나 "변경 로그"를 석고로 만들 필요가 없다는 인상을 받았다. 저장 프로 시저가 시작될 때 큰 긴 블록을 포함하여 파일 변경을 차단하고 큰 부분을 차단하고 다음과 같은 코드를 작성하는 등 변경 로그를 계속 사용하는 경우가 종종있었습니다.

// 2011-06-14 (John Smith) Change XYZ to ABC to fix Bug #999

과:

// 2009-95-12 (Bob Jones) Extracted this code to Class Foo 
// <commented-out code here>

나에게 설명 된이 이유는 누가 VCS 로그를 살펴보고 누가 무엇을 왜 변경했는지 알아내는 데 너무 오래 걸리기 때문입니다. 누가 언제 무엇을 바꾸 었는지 쉽게 알 수 있습니다. 그 요점을 알면서도 중복적이고 "단순히 VCS를 올바르게 사용하는 방법을 이해하지 못하므로 전혀 신경 쓰지 않을 것"이라고 생각합니다.

어떻게 생각해? 주석과 로그를 모두 사용합니까? 로그 만? John Smith가 로그를 검색하고 Diff 도구에서 코드 파일을 비교하는 대신 일주일 전에 XYZ를 확인하는 방법을 변경 한 코드 블록을 볼 때 코드 작성이 더 쉽다는 것을 알고 있습니까?

편집 : SVN을 사용하지만 기본적으로 저장소로만 사용하십시오. 분기, 병합, 로그 + 저장 외에는 없습니다.


4
어떤 버전 관리 시스템을 사용하고 있습니까?
ChrisF

11
일부 상점은 소스 제어 시스템이 있기 전에 변경 로그를 사용했습니다. 관성과 친숙 함은 변경 로그를 유지합니다.
길버트 르 블랑

2
+1-우리 팀도이 작업을 수행했으며, 그들 중 일부가 그것이 VCS의 역할임을 확신 시키려고 노력했습니다. 이러한 주석이 실제 코드로 최신 상태로 유지되지 않으면 문제가 시작됩니다. 최악의 경우 경영진은 모든 방법에도 변경 로그를 추가하기로 결정했습니다.
slaphappy

2
+1-나는 이것에 대해 거의 2 년 동안 우리의 고위 개발자와 싸우고 있습니다. 이러한 쓸모없는 주석을 추가하는 그의 유일한 근거는 3000 행 분석법의 변경 사항을 조금 더 쉽게 병합한다는 것입니다. 3000 라인 방식이 음란하다는 생각에는 경멸이 따릅니다.
Joshua Smith

1
"[VCS 로그를 탐색하는 데 시간이 너무 오래 걸렸다"는 경우 잘못된 작업이 발생한 것입니다.
Keith Thompson

답변:


45

코드에서 주석을 삭제하는 경향이 있습니다. 삭제한다는 것은 편견이 있다는 뜻 입니다. 주석 이 특정 기능이 작동 하는지 설명하지 않으면 사라집니다. 안녕. 통과하지 마십시오.

똑같은 이유로 변경 로그도 삭제한다는 사실에 놀라지 마십시오.

주석 처리 된 코드와 책처럼 읽히는 주석의 문제점은 실제로 관련성이 무엇인지 모르고 코드의 실제 기능에 대한 잘못된 이해를 제공한다는 것입니다.

팀이 버전 관리 시스템 주위에 좋은 툴링을 가지고 있지 않은 것 같습니다. Subversion을 사용한다고 말 했으므로 Subversion 저장소를 관리하는 데 도움이되는 많은 도구가 있음을 지적하고 싶습니다. 웹을 통해 소스를 탐색하는 기능에서 변경 세트를 특정 버그에 연결하는 것까지 이러한 '변경 로그'의 필요성을 완화하는 많은 작업을 수행 할 수 있습니다.

나는 많은 사람들의 의견을 가지고 있으며 아마도 의견을 삭제하는 데 오류가 있다고 말합니다. 내가 주석 처리 된 코드의 대부분은 잘못된 코드이며 주석은 문제를 모호하게했습니다. 사실, 내가 코드에 주석을 달면, 나는 그들이 나를 죽이고 싶을 것이 확실하기 때문에 maintanence 프로그래머에게 용서를 구하고 있다고 확신 할 수 있습니다.

그러나 당신이 코멘트를 jest로 삭제해야한다고 생각하지 않도록, 이 일일 WTF 제출 (내가 작업 한 코드베이스에서)은 내 요점을 완벽하게 보여줍니다.

/// The GaidenCommand is a specialized Command for use by the
/// CommandManager.
///
/// Note, the word "gaiden" is Japanese and means "side story",
/// see "http://en.wikipedia.org/wiki/Gaiden".
/// Why did I call this "GaidenCommand"? Because it's very similar to
/// a regular Command, but it serves the CommandManager in a different
/// way, and it is not the same as a regular "Command". Also
/// "CommandManagerCommand" is far too long to write. I also toyed with
/// calling this the "AlephCommand", Aleph being a silent Hebrew
/// letter, but Gaiden sounded better.

아 .. 그 코드베이스에 관해 이야기 할 수있는 이야기는 여전히 주변의 가장 큰 정부 기관 중 하나에서 사용하고 있다는 점을 제외하고는 말입니다.


4
특정 복잡한 논리로 어려움을 겪을 때마다 의견이 논리가 왜 그렇게 복잡한 지에 대한 컨텍스트를 얻는 데 도움이 될 수 있습니다. 그러나 전체적으로 나는 당신에게 동의합니다.
maple_shaft

5
모든 개발자는 적어도 몇 가지 나쁜 특성을 가지고 있습니다. 나는 그렇게해서는 안된다는 것을 알고 있지만 막을 수는 없습니다. :) TODO강아지를 죽일 때마다 의견을 작성할 때마다
maple_shaft

32
편견으로 다른 사람들의 의견을 삭제하는 것은 자신의 프로그래밍 스타일과 다른 사람들에 대한 믿음을 강요하는 방식입니다. 주니어와 평화주의 프로그래머는 뒤로 물러서지 않을 것이지만, 가끔 알파 남성과 만나면 안될 싸움이 시작됩니다. 따라서 당신은 똑똑한 사람의 똑똑한 블로그에서 논평에 관해서는 더 적을수록 읽습니다. 다른 사람들은 같은 책을 읽지 않았을 수도 있습니다. 비록 당신이 5k +의 대변인을 가진 소수의 사람들이 동의하기 때문에 당신이 옳다고 생각하더라도, 독재는 협력적인 일을하는 길이 아닙니다. 나는 전에 알파 남성 아래에서 일하고 종료했습니다.
Job

8
@Neil Butterworth : re : 논증 : 코드는 가단성이 있어야합니다. 리팩토링, 변경, 개선 그 의미입니다. 한 번만 쓰여서는 안됩니다. 비즈니스 변화에 대한 이해와 그러한 상황이 발생하면 코드를 변경해야합니다. 주석과 관련하여 많은 문제가 있지만 토론과 가장 관련이있는 것은 주석이 코드와 거의 동기화되지 않으며 일반적으로 문제 가 발생 하는 이유를 설명하지 않는다는 것입니다. 그렇게되면 쉽게 삭제할 수 있습니다. 누군가 나에게 와서 왜 다음 의견을 삭제했는지 물으면 file.Open() // Open the file. 나는 웃을 것이다.
George Stocker

5
며칠 전, 삼각법, 변환 등으로 가득 찬 매우 복잡한 수학 계산 코드를 작성했습니다. 10 줄 미만의 코드를 작성하는 데 약 1 시간 30 분이 걸렸습니다. 내 주변의 어느 누구도 그것이 어떻게 작동하는지 이해하지 못합니다. 나는 몇 주 안에 그것을 이해하지 못할 것입니다. 반면에 사소한 이유가 있습니다. 따라서, 그 몇 줄 위에는 텍스트의 전체 장이 있는데 왜 그런지 설명하지 않습니다. 당신이 와서 그 의견을 삭제했다면, 나는 당신을 얼굴에 찔 렀을 것입니다.
Davor Ždralo

76

코드에 포함 된 "변경 로그"는 특히 naff입니다. 수정본을 비교할 때 또 다른 차이점과 실제로 신경 쓰지 않는 차이점으로 나타납니다. VCS를 믿으십시오. 대부분 "비난"기능을 통해 누가 무엇을 변경했는지 매우 신속하게 보여줍니다.

물론 정말 끔찍한 것은 소스 파일에 실제 VCS 로그를 내장 할 수있는 "구시"VCS의 기능이었습니다. 병합이 거의 불가능 해졌습니다.


14
그들은 또 다른 차이점으로 나타날뿐만 아니라 시간이 지남에 따라 잘못 될 수도 있지만 좋은 VCS는 항상 특정 줄을 쓴 사람과 그 줄의 역사를 말할 수 있습니다. 쓸모없는 의견보다 더 나쁜 것은 해로운 의견입니다. 이 의견은 쓸모없는 것으로 시작하여 완전히 무시하지 않으면 결국 해 롭습니다.
Ben Hocking 2016 년

10

특정 커밋 메시지에 의해 자동으로 채워지는 각 프로젝트마다 단일 변경 로그 파일이 있습니다.

변경 로그 주석이 포함되어 있지 않습니다. 만약 우리가 그들을 제거하고 추가하는 사람과 "대화"를 할 것입니다. 나는 그들이 사용하는 도구, 특히 vc를 이해하지 못하고 있다고 생각합니다.

우리는 로그를 쉽게 잡을 수있는 커밋 메시지 형식을 가지고 있습니다. 또한 쓸모 없거나 모호한 커밋 메시지를 허용하지 않습니다.


8

코드 소스 파일 내에서 변경 로그를 개인적으로 싫어합니다. 저에게있어 변경 사항은 여러 곳에서 이루어져야한다는 점에서 소프트웨어 엔지니어링 원칙을 위반하는 것 같습니다. 많은 경우에 변경 로그 정보는 완전히 쓸모없고 중요하지 않습니다. 내 의견으로는 코드를 체크인 할 때 소프트웨어 변경 사항이 문서화되어야합니다.

하지만 내가 아는 것은 ...

소스 코드 내에 변경 로그를 유지하는 관행이 구현 될 때 반박이 있다면 변경 로그는 클래스의 pulic API / 인터페이스에 영향을주는 변경으로 제한되어야한다고 생각합니다. 클래스 내에서 코드를 사용하지 않는 클래스 내에서 변경을 수행하는 경우 변경 로그에 이러한 변경 사항을 기록하는 것은 제 생각에 복잡합니다. 그러나 소스 코드 파일의 상단에서 다른 사람을 위해 어떤 것이라도 손상되었을 수있는 변경 사항에 대한 설명서를 확인하는 것이 때로는 얼마나 편리한 지 알 수 있습니다. 변경 사항이 API에 미치는 영향과 변경 이유에 대한 요약.

반면, 내 상점은 주로 C # 작업을 수행하며 인라인 XML 주석을 사용하여 API를 문서화하므로 공개 API 변경에 대한 문서를 읽는 것이 인텔리전스를 사용하는 것만 큼 간단합니다.

소스 파일 내에서 변경 로그를 고집하는 것은 기계에 불필요한 마찰을 가중시키고 버전 제어 시스템을 구현하는 목적 중 하나를 우선으로 생각합니다.


6

내가 일한 마지막 회사에는 17 년의 역사, 개발 및 연례 업데이트를 가진 소프트웨어가있었습니다. 한 버전 제어 시스템에서 다음 버전으로의 모든 마이그레이션이 주석 또는 체크인 메모를 보존하지는 않습니다. 그 기간 동안 모든 개발자가 체크인 주석 / 노트와 일관성을 유지하지도 않았습니다.

소스 코드에 주석이 포함 된 변경 사항의 고고 학적 기록은 주석이 아닌 주석으로 유지되었습니다. 그리고 여전히 VB6 코드를 제공하고 있습니다.


5

팀의 개발자가 올바르게 사용하는 경우 버전 제어는 코드의 변경 로그 주석을 대체 할 수 있습니다.

팀이 체크인시 의견을 추가하지 않거나 도움이되지 않는 의견을 남기고 있다면 앞으로 찾고있는 정보를 찾기가 매우 어려울 것입니다.

현재 회사에서는 체크인 할 때마다 의견을 제출해야합니다. 그뿐만 아니라 Jira의 티켓과 함께 각 체크인을 첨부해야합니다. 나중에 Jira를 살펴보면 체크인 한 모든 파일과 해당 문제가 발생한 시간을 남은 주석과 함께 볼 수 있습니다. 꽤 편리합니다.

기본적으로 버전 관리는 도구 일 뿐이며 팀에서 원하는 도구를 사용하여 원하는 이점을 제공하는 방식입니다. 팀의 모든 사람은 버그 수정 추적을 제공하고 깨끗한 코드 개정을 제공하기 위해 어떻게 사용하는지에 동의해야합니다.


5

이것은 VCS 로그가 혼란스럽고 VCS 시스템을 다루기가 어려웠던 시절부터 남은 것입니다 (80 년대 백엔드의 어딘가에 기억합니다).

귀하의 의심은 전적으로 정확하며, 이러한 의견은 도움보다 방해가되며 최신 VCS를 사용하면 원하는 것을 정확하게 찾을 수 있습니다. 물론, 당신 (그리고 당신의 동료)은 약을 소비해야합니다. 30-60 분 동안 이러한 모든 기능을 수행하는 방법을 배웁니다 (실제로 이러한 의견이 여전히 존재하는 이유입니다).

조지와 함께 (거의) 유지합니다. 코드의 주석은 코드 자체에서 즉시 보이지 않는 것을 설명하는 경우에만 정당화됩니다. 그리고 그것은 좋은 코드에서는 거의 발생하지 않습니다. 코드에 주석이 많이 필요한 경우, 그것은 그 자체의 냄새이며 "나를 리팩터링하십시오!"


4

클라이언트에 어떤 버전이 있는지 정확하게 알 수 있기 때문에 저장 프로 시저 소스에 계속 포함시킵니다. 나머지 응용 프로그램은 컴파일되어 배포되므로 소스로 다시 연결되는 모듈 버전 번호가 있지만 SP는 로컬 데이터베이스 내 컴파일을 위해 클라이언트에 소스로 배포됩니다.

레거시 PowerBuilder 코드는 여전히이 코드를 사용하지만 특정 엿보기의 편의 요소라고 생각합니다. 배포를 위해 컴파일되기 때문에 (IMO는) friggin VCS 기록을 사용합니다.


1
+1이 답변을 쓰려고했지만 문제가 해결되었습니다. 저장 프로시 저는 소스로 배포 될뿐만 아니라 많은 스크립팅 언어도 배포됩니다. OpenACS와 TCL을 많이 사용합니다. 클라이언트에 특정 파일의 분기 버전이있는 경우 변경 로그를 읽어서 버전을 알고 있는지 확인하는 유일한 방법입니다. 클라이언트 사이트에 로그인하여 버전 제어 소프트웨어를 사용하여 쉽게 차이점을 찾을 수없는 경우 특히 유용합니다.
TrojanName 2016 년

3

SVN을 사용하는 경우 시간 낭비이며 전혀 쓸모가 없습니다.

SVN에는 비난 기능이 있습니다. 주어진 파일의 모든 줄을 누가 언제 만들 었는지 정확하게 알려줍니다.


1

변경 로그 주석은 후속 개발자가 새로운 요구 사항에 대해 더 나은 질문을 할 수 있도록 도와 줄 때 코드에서 매우 유용합니다. 예를 들어, 개발자가 Fred가 일부 요구 사항을 충족시키기 위해 6 개월 전에 Foo 필드를 작성했다는 의견을 볼 때 개발자는 Foo를 옵션으로 만들기 위해 최신 요청을 구현하기 전에 몇 가지 질문을해야한다는 것을 알고 있습니다. 복잡한 시스템을 다룰 때는 이해 관계자마다 우선 순위와 요구 사항이 다를 수 있습니다. 변경 로그 주석은 향후 문제를 피하기 위해 어떤 트레이드 오프가 만들어 졌는지 문서화하는 데 매우 유용 할 수 있습니다.

이제 모든 개발자가 변경하기 전에 모든 코드 줄의 전체 기록을 확인한 경우 코드에 이러한 주석이 있으면 중복됩니다. 그러나 이것은 워크 플로 관점에서 볼 때 매우 비현실적입니다. 대부분의 개발자는 추가 한 사람의 이력을 조사하지 않고 유효성 검사를 변경하기 만합니다. 기술 관점에서 버전 제어 시스템이 "동일한 항목을 추적하는 데 어려움이있는 이유는 무엇입니까? "한 줄에서 다른 줄로 이동했거나 다른 클래스로 리팩토링 된 경우 코드 줄. 코드의 주석은 볼 가능성이 훨씬 높으며, 더 중요한 것은 후속 개발자에게 겉보기에는 단순한 변경이 그렇게 간단하지 않을 수 있다는 점을 알리는 것입니다.

즉, 코드에서 변경 로그 주석은 비교적 드 물어야합니다. 나는 약간의 코드가 리팩터링 될 때마다 또는 진정한 버그가 수정 될 때마다 변경 로그 주석이 추가되는 것을 옹호하지 않습니다. 그러나 원래 요구 사항이 "Foo는 선택 사항"이고 누군가가 와서 요구 사항을 "다운 스트림 프로세스 막대를 지원하기 위해 필요합니다"로 변경 한 경우 이는 의견을 추가하는 것이 좋습니다. 미래의 일부 사용자 / 분석가가 다운 스트림 Bar 프로세스를 인식하지 못하고 Foo가 필요한 이유를 인식하지 못할 가능성이 높으므로 Foo를 다시 옵션으로 설정하고 Bar 프로세스에서 두통을 유발할 것입니다.

그리고 이것은 조직이 소수의 개발자가있는 소규모 회사에서 훨씬 더 큰 회사로 성장함에 따라 조직이 버전 제어 시스템을 일정한 빈도로 변경하기로 결정할 수 있다는 점을 고려하기 전에 이루어졌습니다. 이러한 마이그레이션으로 인해 변경 로그 주석이 손실되는 경우가 많으며 코드의 주석 만 보존됩니다.


커밋 메시지를 보존하지 않는 VCS 변환이 있습니까?
David Thornley

1
@David-많이 보지 못했습니다. 기술적 인 장애물이 있는지 또는 누군가가 "새롭게 시작"하고 1 일에 새로운 VCS에 대한 모든 코드를 확인하는 것이 더 쉽다고 결정했는지 여부는 알 수 없습니다.
Justin Cave

프로세스가 변경된 이유를 설명하는 주석을 추가하는 것이 유용 할 수 있으며 때로는 변경 되었을 때를 설명하는 주석을 추가하는 경우 도 있지만 해당 주석을 변경 로그 형식으로 넣는 장점은 보이지 않습니다. 하나는 주석의 유틸리티를 다소 위장하고 ( "아, 그것은 단지 변경 로그 주석"), 두 번째는 불필요한 변경 로그 주석 (1 번 강화)을 권장합니다.
Ben Hocking

영상 소스 안전 사용을 종료 하시겠습니까? 모든 유용한 최신 소스 제어 시스템은 변경 로그를 올바르게 처리합니다. 우리는 이것을 정의에 의해 알고 있습니다. 그렇지 않으면 유용하지 않다고 생각하기 때문입니다. 당신이 가지고있는 소스 컨트롤을 사용하는 법을 배우는 데 30 분을 보내면, 툴링을 아는 누군가에게기도하는 것보다 부스러기를 아끼 게하는 것보다 훨씬 효과적입니다. 말할 것도없이, 종종 코드 히스토리는 무의미합니다. 지금 테스트하고 작성하기 만하면됩니다.
ebyrob

"소스 제어 변경"과 관련하여 거의 모든 현대 시스템은 히스토리를 다른 시스템으로 이동하거나 개별 프로젝트 레벨 변경 파일을 출력하거나 약간의 노력으로 실제로 변경 로그를 소스 파일에 임베드 할 수 있습니다 (이동시 적절할 때) 전에는 아닙니다). 따라서 기술은저기서 소스 제어를 제대로 사용하지 않는 사람들이 문제입니다.
ebyrob

1

아무도 이것을 언급하지 않은 것에 대해 놀랐지 만 이것이 라이센스 요구 사항을 준수하는 원래 이유가 아닙니까? 즉, 일부 라이센스는 파일을 변경하면 파일 자체에 기록되어야한다고 말합니다.


1
어떤 라이센스가 그렇게 말하는가?
Trasplazio Garzuglio 2016 년

2
나는 그들이 소스 파일의 요구되는 변경 블록을 믿었다는 Sarbanes Oxley 준수에서 근무했습니다. 또한 수년에 걸쳐 PVCS (일명 "치수")를 사용했기 때문에 버전 제어가 전혀 없었지만 무엇을 알고 있었습니까?
Bruce Ediger

@Marco : 기억이 나지 않거나 연결되었을 것입니다.
Sverre Rabbelier 2018 년

1
GPLv2의 섹션 2a에 필요합니다. 대부분의 프로젝트는이를 무시하고 일부는 단일 "ChangeLog"파일 (보통 VCS에서 생성)을 갖습니다.
dsas

0

의견 섹션에서 변경 로그를 계속 유지하는 이유는 사용하기 쉽기 때문입니다. 문제점을 디버깅 할 때 소스 제어 파일을 열고 파일에서 파일을 찾은 후 변경 사항을 찾는 것보다 파일 맨 위로 스크롤하여 변경 로그를 읽는 것이 더 쉽습니다.


1
개인적으로, 모든 소스 파일에 변경 로그를 추가하여 200 줄 파일이 1,000 줄이되면 약간 고통 스럽습니다. 이 추가 노이즈는 실제로 오래 전에 중요한 것을 전혀 모호하게합니다.
ebyrob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.