문서없이 수천 줄의 코드를 읽는 방법? [닫은]


12

이전에는 WPF 프로젝트에 적합한 TimeLine 컨트롤을 찾고있었습니다. 여기 에서 CodePlex 프로젝트로 안내 하는 답변을 찾았습니다 .

이제 문화 요구에 맞게 코드를 변경하고 싶습니다. 그러나 약간의 불일치가 있습니다!

내 질문은 :

수천 줄의 코드와 어떻게 상호 작용합니까?

편집하다:

어떤 지름길도 훌륭합니다!


3
인상을 요청하십시오. 항상 도움이됩니다. (그들은이의 동기 부여를 할 수 있습니다)
이름 표시

2
모든 것이 깨끗해질 때까지 머리를 책상에 대십시오.
jellyfishtree

19
코끼리는 어떻게 먹습니까? 한 번에 한 입.
Bill

1
@Jalal 그것이 당신이 생각하기 원하는 것입니다.
Mateen Ulhaq

2
@DisplayName, 당근 및 동기 부여에 대한 스틱 접근 방식은 기초인지 기술이 필요한 모든 작업에 대한 해결책이 아닙니다. 동기 부여의 과학은 보상 시스템보다 복잡합니다. Dan Pink의 '드라이브 : 우리에게 동기를 부여하는 것에 대한 놀라운 진실'을 확인하십시오. 또는 압축 된 버전의 튜브 비디오를 확인하십시오. youtube.com/watch?v=u6XAPnuFjJc
Ryan Taylor

답변:


37

그렇게 할 수있을만큼 충분히 이해했으면 소스 코드에 주석을 추가합니다. 점점 더 많이 이해할수록 이러한 의견을 적극적으로 리팩토링하십시오.


3
+1 한 가지 좋은 방법은 소스 코드를 탐색 할 때 실제로 문서를 작성하는 것입니다. 그리고 기부금을 운영 담당자에게 다시 보내야하는 이유는 무엇입니까?

1
+1 또한, 코드를 수정하는 경우 주석도 변경하여 미래 세대가 수행 한 작업에 혼동되지 않도록하십시오. 그 모든 문서를 수행하고 사람들이 그것이 잘못되었다는 것을 미워하도록 부끄러운 줄 아세요!
Michael K

1
원래 프로젝트가 git과 같은 분산 소스 제어 시스템에있는 경우이를 분기하고 변경 사항을 점진적으로 커밋하고 나중에 변경 사항을 다시 원래의 항목으로 병합 할 수있는 방식으로 변경하십시오

8
  1. 코드 단계별
  2. 필요에 따라 이름을 바꿉니다
  3. 필요에 따라 리팩터링
  4. 완전히 이해할 때까지 반복하십시오

... 그리고 코드는 고맙습니다. ;-)


7
생산 코드에서 임의의 장소를 변경하는 것이 더 쉽다는 것은 좋은 생각이 아닙니다. 기능 요청 만 코드를 수정해야하며 리팩토링은 기능 요청입니다. 아무리 잘해도 코드가 깨지거나 때로는 어리석은 부작용이 고객에게 의존합니다. 매우 확실한 코드 만 리팩토링하십시오. 그리고 단위 테스트조차도 아무 것도 보증하지 않습니다.
Coder

동의하지만 설계를 시도하기 위해 리팩토링하면 코드가 작성된 방식을 이해하는 데 도움이 될 수 있습니다 (또는 잘못 / 홀수하게 수행 된 것이 올바른지 확인). 이러한 변경 사항을 유지할 필요는 없습니다.
Ricky Clarkson

코더 +1 그리고이 답변에는 현재 단위 테스트 조차 언급되어 있지 않습니다 . 무서운.
MarkJ

죄송합니다. 주요 리팩토링을 의미하지 않았습니다. 사소한 리팩토링, 정리 유형에 대해 더 이야기하고있었습니다. 결국 코드의 목적이 분명하다는 것을 알게됩니다.
John MacIntyre

5

단일 조치를 취하고 코드를 디버그 (다시 반복)하여 해당 조치가 수행되는 방법을 찾으십시오. 더 나은 이해를 위해 간단한 언어로 같은 것을 쓰십시오!


디버그 모드에서 실행할 수없는 프로젝트에 직면 할 때까지 일반적 으로이 작업을 수행합니다! 시작하는 동안 항상 충돌합니다! :( 그러나 릴리스 모드에서 잘 작동합니다 : S
Afriza N. Arief

@afriza 뭐지? 그건 정말 나쁜 코드입니다. 어떤 오류가 발생했는지 확인하십시오.
Daniel S

@ afriza, 먼저 수정해야합니다!

4

Joel Spolsky가 블로그에서 기사를 찾지 못했을 때 (지금 기사를 찾을 수 없음) 실제로이 문제와 관련하여 나와 붙어있는 것 :

그는 코드가 어떻게 인간의 자연어가 아닌지, 프로그래머로서 우리는 그 코드에 대한 생각에 쉽게 빠져들 수 있고 그렇게 읽을 수 있어야한다고 말했다. 결과적으로 우리 중 많은 사람들이 새로운 코드를보고 마치 영어로 된 텍스트 블록 인 것처럼 "읽고"바로 이해할 수있을 것으로 기대합니다.

핵심은 느리고 체계적이고 과학적인 것입니다. 그리고 다른 사람들이 말했듯이 당신이가는대로 주석을 달고 리팩토링하십시오. "그냥보고 즉시 이해해야한다"는 사고 방식에 빠지지 마십시오.

아, 그래요, 난 여전히이 함정에 빠지기도합니다. "내가 아닌 내가 말한대로하십시오"그리고 그 모든 것. :)


사실, "읽기만"할 수있는 영어 텍스트는 일반적으로 선형이며, 코드를 처음에 소화하기 어려운 이유는 일반적으로 비선형적이고 트릭이 코드를 분해하기 때문입니다. 개발자가 사용하는 다양한 구현 관용구는 일반적으로 도움이되지 않지만 첫 번째 단계는 일반적으로 디버거를 통해 코드를 실행하고 중단 점을 사용하여 무엇이 무엇인지 확인합니다. 그냥 읽으려고하는 것은 상당히 무의미한 운동입니다. 진지하게, 당신이 작성한 코드를 언제 마지막으로 읽었습니까? (끝으로 시작합니다.)
ocodo

실제로, 잘 작성된 코드는 읽기 쉽지만 텍스트가 아닙니다. 모든 것을 읽을 필요없이 빌딩 블록을보고 핵심 구조를 이해하기 위해 스캔 만하면됩니다. 오래된 스쿨 코드 나 SOLID 및 패턴 남용과 같은 잘못된 코딩 방식은이 작업을 매우 어렵게 만들 수 있습니다.
Coder

4

SE-Radio는 Dave Thomas 와이 주제에 대해 인터뷰했습니다.

이 팟 캐스트 에피소드에는 프로젝트의 '문화'에 참여하고 원래 주민의 생활 방식을 이해하기위한 많은 팁과 기술이 있습니다.


Dave Thomas의 경험에 대한 재미있는 부분은 높은 수준의 개요를 넘어서는 문서가 문서 가 전혀없는 것보다 훨씬 나쁘다는 것입니다. (제 경험에 따르면 대부분의 문서는 "무엇"또는 "어떻게"에 대한 표면 수준의 이해를 제공하는 보일러 플레이트이기 때문에 잘못된 것으로 오해의 소지가 있습니다.
Michael Kropat

2

최근 10 만 LOC 이상의 프로젝트로이 작업을 수행해야했습니다. 첫 번째 아이디어는 100,000 줄의 텍스트보다 100 또는 1000 노드의 그래프에서 패턴을 보는 것이 더 쉽다는 것입니다.

그래서 45 분을 보냈고 짧은 (<100LOC) Python 프로그램을 작성하여 필요한 것을 파싱하고 객체 관계를 그렸습니다. 정말 생성 하기 쉬운 언어 인 Graphviz 소스 를 생성했습니다. (파이썬에는 특별한 것이 없습니다 : 루비, C # 또는 커먼 리스프 (Common Lisp) 등 무엇이든 할 수 있습니다.)

다른 프로젝트에서는 사람들이 모듈 종속성, 호출 그래프, 버전 기록, 모든 종류의 작업에 Graphviz를 사용하는 것을 보았습니다. 최고의 프로그램 시각화 메타 도구.

(아마도 컴파일러를 사용 했기 때문일 수도 있지만 프로그래머가 문제에 직면했을 때 문제가 소스 코드에 프로그램에 관련된 경우를 제외하고는 항상 "프로그램 작성!"인 것 같습니다. :- )


1

새로운 대형 코드베이스를 이해하는 거의 유일한 방법 인 디버거가 실행될 때이를 단계별로 살펴보십시오.


2
수천 줄의 코드가있을 때 (특히 수십 또는 수백 개의 KLOC에 대해 이야기 할 때) 그리고 / 또는 해당 코드의 일부가 템플릿에있는 경우에는 실용적인 옵션이 아닙니다. 문서화가 잘되지 않은 새로운 코드 기반을 파악하려면 비즈니스에 참여하고 코드가 실행되는 컨텍스트를 이해해야합니다. 디버거를 사용하여 코드를 살펴보고 이해할 수 있다면, 그 코드 기반은 크지 않은 것입니다 (대부분의 경우 디버거 사용이 불필요합니다)
luis.espinal

코드베이스가 너무 커서 디버거에서 디버깅하기에 너무 비참 합니다. 코드가 알려진 입력 및 출력에 반응하는 것을 보면 "what"에 대한 지식을 "how"로 변환하는 데 도움이됩니다. "why"라는 질문은 디버거만으로는 응답 할 수 없지만 디버그 할 때 IDE에서 볼 수있는 인라인 소스 주석이있을 수 있습니다.
grrussel

@grrussel 내가하는 일이 아니기 때문에 동의하지 않으면 안된다 ... 나는 대표자인지 아닌지 전혀 모른다! 나는 이상한 브레이크 포인트를 사용하는 것을 볼 수 있지만 (명쾌하게 단계별로 진행하지는 않음) IDE 기능을 사용하여 한 조각을 다른 조각과 연결할 수 있습니다.
Murph

1

충만에 대한 지름길이 실제로 없다는 것을 이해하십시오. (그리고 당신이 그 말에 문제가 있다면, 당신의 교육은 거의 무시되었습니다. 그것은 Robert A. Heinlein의 "이상한 나라의 낯선 사람"에서 온 것입니다.)

한 번에 한 페이지 씩, 한 번에 하나의 루틴을 읽으십시오. 의견을 추가하십시오. 주요 데이터 구조의 그림을 그립니다. 알고리즘을 인식합니다. 이전 지식을 활용하십시오.

디버거를 유혹하려는 유혹에 저항하십시오. 디버거 뷰포트가 너무 작습니다. 한 번에 한 줄만 표시되지만 실제로 어디에 있는지 또는 어디로 가고 있는지 알 수 없습니다.


디버거는 변수 내에서 예상되는 것 (예 : 전체 경로 또는 파일 이름 또는 상대 경로를 예상합니까?)에 대한 원래 코드 작성기의 규칙과 몇 가지 다른 규칙을 설명하므로 내 의견으로는 여전히 중요합니다
.

2
"grok"라는 단어를 사용하여 멋지다고 생각하는 것에 대해 -1
Carson63000

1

당신이 할 수있는 한 많은 글을 쓰더라도, 당신과 같은 위치에있는 사람은 없습니다.


1

단서를 사용해야합니다. 찾고자하는 것에 대한 힌트를 얻고 환경 또는 IDE의 검색 기능을 광범위하게 사용하여 변경해야 할 코드의 원하는 부분으로 이동할 수 있습니다.

14,000 줄의 Java 코드를 읽는 것은 의미가 없습니다. 검색 기능은 생명의 은인


0

사람들마다 학습 스타일이 다르므로 YMMV. 이 상황에서 가장 먼저하는 일은 전체 코드베이스를 적어도 한 번 이상 읽는 것입니다. 그것은 모든 것이 어디에 있는지에 대한 일반적인 아이디어를 제공합니다. 그런 다음 더 자세히 살펴볼 섹션을 선택합니다. 데이터 구조는 시작하기에 좋은 장소입니다. 무슨 일이 일어나고 있는지에 대한 일반적인 아이디어를 얻은 후에는 첫 번째 코드와 상호 작용하는 코드의 다른 부분과 동일한 작업을 수행합니다. 반복이 충분하면 코드 작동 방식을 잘 알고 있습니다.


0

주석 처리되지 않은 큰 코드 덩어리뿐만 아니라 모든 프로그래밍에서와 마찬가지로 가장 좋은 방법은 코드를 여러 조각으로 나누는 것입니다. 이것은 코드에서 시각적으로뿐만 아니라 머리에서도해야 할 일입니다. 이것은 큰 굵은 주석 또는 여러 줄 바꿈을 추가하는 것을 의미 할 수 있습니다. 조각을보기 위해 스크롤하는 동안 도움이됩니다. 논리적 인 코드 덩어리를 찾아보십시오.

물론, 당신이 비트를 이해함에 따라, 당신이 이해하지 못하는 것에 대해 메모 할 수 있도록 당시에 알고있는 것에 대해 주석을 답니다.

또한 처음부터 전체 부분을 이해하지 않는 것이 좋습니다. 대신 지금 알아야 할 부분을 이해하고 나중에 나머지 부분에서 작업하십시오.


0

복제 된 노드 를 적극적으로 사용 하여 @shadow 모드 에서 Leo Editor 를 사용하여 시작합니다 . 이를 통해 코드 를 변경하지 않고도 연구중인 각 코드 섹션에 대한 메모와 주석을 추가 할 수 있으며 주석은 해당 코드 옆에 항상 컨텍스트로 표시됩니다. 문서 작업 과정의 예는 다음과 같습니다.

예를 들어 Leo에서 버그를 수정하면 버그를 나타내는 일반 노드를 만듭니다. 이 버그 노드는 버그와 관련된 Leo 소스 코드의 모든 데이터에 대한 나의 견해입니다. 버그와 관련된 코드를 발견하면 해당 노드를 복제하여 버그 노드 아래로 옮깁니다. 또한 버그 노드의 자식으로 일반 노드를 추가하겠습니다. 이 노드에는 원래 버그 보고서, 버그 수정 방법에 대한 설명, 테스트 데이터 또는 유지하려는 기타 메모가 포함되어 있습니다.

버그 노드를 만든 후에는 해당 노드와 해당 하위 노드에만 집중합니다. 개요를 뛰어 넘지 않고도 버그 노드와 해당 자식을 검사 할 수 있습니다. 필요한 모든 것이 한 곳에 있습니다. 실제로 버그를 수정하려고 할 때 복제본을 변경하여 해결할 수 있습니다. 다시, 나는 윤곽선을 뛰어 넘을 필요가 없습니다. 전체 개요가 얼마나 크거나 복잡한지는 중요하지 않습니다. 나는 버그 노드와 그 자식만을 다루고 있습니다. 이 매우 좁은 초점은 버그를 훨씬 쉽게 수정합니다.


0

데이터 다이어그램, 기능 관계, 객체 관계 등 소스의 다이어그램을 그립니다. 집계, 데이터 흐름 및 코드 흐름을 결정합니다. 그림은 이것에 대한 주석보다 훨씬 낫고 코드와 별도로 유지할 수 있습니다.


0

쓰기 테스트를 리팩터링하기 전에. 많은 테스트. 상속 된 엉망이 어떻게 작성되는지에 달려 있기 때문에 최소한 호출 가능한 작은 코드 블록에 대한 매우 구체적인 테스트.

테스트를 작성하는 것의 장점은 코드를 테스트하기 전에 코드에 대한 이해가 필요하다는 것입니다. 따라서 작성하는 모든 테스트는 약간의 지식을 얻게 될 것입니다. 또한 어설 션과 함께 가정을 사용하여 테스트에 크게 주석을 달 수 있습니다.

먼저 테스트를 수행하면 알 수없는 영향을 미치는 코드에서 무언가를 변경할 위험이 없습니다. 또한 코드를 리팩토링 할 때 안전망이 제공됩니다.


0

각 클래스의 기능을 이해하는 것보다 doxygen과 같은 도구를 사용하여 전체 클래스 다이어그램을 생성합니다.

그런 다음 버그 큐에서 몇 가지 쉬운 버그를 가져 와서 (매니저가 하드 버그를 할당하기 전에 : P) 해당 기능을 통해 디버거로 실행하여 대략적인 데이터 흐름 또는 코드 흐름 모델을 생성하려고합니다.

예를 들어 일부 소프트웨어의 내보내기 기능 : 소스 코드를 읽는 방법을 이해하려고합니다. 코드 (기본 인터페이스)에서 클래스와 코드 흐름 다이어그램을 사용하여 데이터가 올바르게 읽혀 지는지를 평가할 수 있습니다. 클래스 다이어그램과 플로우 차트가 있으면 이해의 절반이 완료되었다고 생각합니다.


0

NullPointerException과 같은 사소한 결함에 접근하십시오. 처음에 동시성에 관한 것은 피하십시오. 본질적으로 많은 코드를 한 번에 이해하는 것이 중요합니다.

몇 가지 버그를 수정 한 후에는 아마도 꽤 좋은 생각 일 것입니다. 어쨌든 나를 위해 작동합니다.


-2

기본적으로 깨끗한 코드를 작성하는 작업은 디자인에서 시작해야합니다. 우리가 OOP 언어로 코딩하는 경우 UML이 나오면 동료와 공유하고 디자인이 모호하지 않다는 것을 확신하십시오. 어쨌든 개발자는 디자인이 모호한 문제가 아니라 문제를 해결한다고 확신해야합니다.

코딩에 관해서는 디자인이 코드, 즉 Entity를 클래스 또는 구조체로 변환하고 작동하는 연산 등으로 변환되는지 확인해야합니다.

그리고 나는 백서 http://queue.acm.org/detail.cfm?id=2063168 를 통해 코딩 스타일 또는 공간, 들여 쓰기, 글꼴 변형을 사용하는 방법에 대해 이야기합니다. 대부분의 IDE는 MUCH를 작성하는 데 사용할 수 있습니다. 인간이 기계만큼 이해하는 CLEANER 코드. 코드가 단락 자체로 표시되도록 주석이없는 코드를 작성하는 데 더 많은 스트레스를줍니다.

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