배고픈 개발자 이야기
2.Code Complete (23-26장) 본문
Chapter23 디버깅
-
디버깅은 소프트웨어 개발의 성공과 실패를 좌우한다. 가장 좋은 접근 방법은 결함을 처음부터 피하기 위해 이 책에서 소개하고 있는 다른 기법들을 사용하는 것이다. 하지만 디버깅 기술을 향상시키는 데 시간을 투자할 가치가 있다. 왜냐하면 디버깅을 잘하는 사람과 못하는 사람 간의 수행 능력이 적어도 10배 정도 차이가 나기 때문이다.
-
오류를 찾고 수정하는 체계적인 접근 방법은 성공에 매우 중요하다. 각 테스트가 한 걸음 나아갈 수 있도록 디버깅에 초점을 맞춘다. 과학적인 디버깅 방법을 사용하라.
-
문제를 수정하기 전에 문제의 원인을 이해하라. 오류의 원인에 대해서 임의로 추측하고 수정하면, 프로그램은 수정을 시작했을 때보다 더 나쁜 상태가 될 것이다.
-
컴파일러의 경고를 가장 까다로운 수준으로 설정하고 컴파일러가 보고하는 오류들을 수정하라. 분명한 오류들을 무시하면 미묘한 오류들을 수정하기가 어려워진다.
-
디버깅 도구들은 소프트웨어 개발에 있어서 강력한 도구들이다. 그러한 도구들을 찾아서 사용하되, 동시에 자신의 두뇌를 사용하는 것을 기억하라.
초기 오류 감지과정(테스트) -> 오류의 근본원인 규명 및 수정(디버깅)
가설, 테스트케이스를 전체 데이터를 설명할 수 있을때까지 계속 개선한다.
여러가지 오류를 일으켜 보다 정확한 오류의 원인을 규명할 수 있다.(여러개테스트)
프로그램 -> 단위 테스트까지 좁혀가면서 : 출력문, 로그 또는 Trace?
여러개의 작은 루틴을 사용한다면 루틴에 대한 호출을 주석처리함으로 간단히 제거가능하다 - 코드기능 분할을 많이 하는게 좋은거 같습니다.
이전버전에서 실행해보고 문제가 없다면 버전간 차이점 분석 - Github
다른 사람과 이야기 - 설명하다가 해결되는 경우
문제와 떨어져 휴식 - 집에 가는길에 해결
점진적인 통합 - 한번에 합치면 해결하기 어려움
구문 오류 - 컴파일러가 보고한 오류를 그대로 믿지 말고 라인이나 원인에 대하여 왜 그렇게 보고 했는지 이해해야 할 필요가 있다.
디버깅을 보다 쉽게 만드는 방법
결함을 수정하는 방법이 아니라 결함을 피하는 방법을 배워야함
결함을 통해 프로그램을 이해할 수 있다
프로그램을 완벽하게 알고 있다면 결함이 없을 것이다?
디버깅 - 가독성, 설계, 코드 품질을 스스로 발전하게 만듬
-
결함을 찾고 싶다면 프로그램내에 출력 명령을 넣어라 정도였음(불충분)
-
출력 명령문을 마구잡이로 뿌려 살펴본다
-
프로그램의 원본을 백업하지 않는다
-
변경사항에 대해 기록하지 않는다. - Github의 필요성
과학적인 디버깅방법
-
반복적인 실험을 통한 데이터 수집
-
관련된 자료들을 설명하기 위한 가설을 세운다.
-
그러한 가설을 증명하거나 반증하기 위한 실험을 구상한다.
-
그러한 가설을 증명하거나 반증한다.
-
필요한 만큼 반복한다.
일반적인 예측 불가능한 오류
-
초기화 오류, 시간 문제, 허상 포인터 문제
-
만약 포인터 사용중 오류가 생기면, 초기화 되지 않거나 해제된 메모리를 가리키는 포인터를 사용하고 있을 확률이 높음
-
테스트 케이스의 단순화(불필요 요소 반증으로) -> 오류 분류의 세분화
Chapter24 리팩토링
-
프로그램이 초기 개발 시와 초기 릴리즈 후에 변경될 수 있다는 것은 엄연한 인생의 현실이다.
-
소프트웨어는 변경될 때 향상되거나 손상될 수 있다. 소프트웨어의 진화의 기본 원칙은 코드가 진화할 때 반드시 내부적인 품질이 향상되어야 한다는 것이다.
-
리팩토링을 성공적으로 수행하기 위한 핵심 요건은 다양한 경고 표시나 리팩토링이 필요하다는 것을 암시하는 냄새에 주의를 기울이는 것이다.
-
리팩토링을 성공적으로 수행하기 위한 또 다른 핵심 요소는 수많은 리팩토링들을 학습하는 것이다.
-
리팩토링을 성공적으로 수행하기 위한 마지막 핵심 요소는 리팩토링을 안전하게 수행하기 위한 전략을 갖는 것이다. 어떤 리팩토링 접근 방법은 다른 것들보다 더 좋다.
-
개발중에 리팩토링하는 것이 프로그램을 향상시키고 여러분이 처음부터 만들고자 했던대로 변경할 수 있는 가장 좋은 기회이다. 개발중에 그러한 기회를 활용하도록 한다.
Chapter25 코드 최적화 전략
-
성능은 소프트웨어 품질 전체의 한 측면일 뿐이며, 일반적으로 가장 중요하지도 않다. 또한, 정밀하게 최적화된 코드는 전체적인 성능의 한 측면일 뿐이며, 일반적으로 그 효과가 현저하지도 않다. 프로그램 아키텍처, 상세 설계, 자료 구조와 알고리즘 선택이 일반적으로 코드의 효율성보다 프로그램의 수행 속도와 크기에 더 큰 영향을 미친다.
-
양적인 측정은 성능의 최대화에 있어서 가장 중요하다. 성능 향상이 실제로 중요한 영역을 찾기 위해서 필요하고 최적화가 소프트웨어의 성능을 향상시켰는지를 검증하기 위해서 다시 한 번 사용된다.
-
대부분의 프로그램들은 작은 부분에서 대부분의 시간을 보낸다. 그러나 코드를 측정하기 전까지는 어떤 코드인지를 알 수 없을 것이다.
-
코드 최적화를 통해서 원하는 만큼의 성능을 개선하기 위해서는 일반적으로 여러 번 반복해야 한다.
-
초기 코드 작성 시 성능 작업을 준비하는 가장 좋은 방법은, 이해하고 수정하기 쉬운 분명한 코드를 작성하는 것이다.
Chapter26 코드 최적화 기법
다음 포스팅에서 기술 (C/C++ 최적화 기법)
'전산학 > 코드컴플리트' 카테고리의 다른 글
1.Code Complete (1-17장) (0) | 2019.09.08 |
---|---|
0.Development Common Sense (0) | 2019.09.08 |