-
초반에는 문제의 원인을 충분히 넓게 잡아라.Programmer/Programming 2014. 7. 15. 18:09
파일 읽기 플러그인에 다수의 기능을 추가했다.
추가된 기능은 원격 파일 읽기, 버퍼 읽기, 캐시 등이 있다.원격 파일을 읽는 기능이 이전 버젼에 비해서 과도하게 CPU를 점유하고 있었다.
분석의 과정이 없이 추론에 근거하여 새로 추가된 원격 기능과 캐싱 알고리즘만을 의심했다.
그리고 내 시스템과 연동하는 HTTP 프록시 서버의 문제일 수 있다는 생각도 했다.이전에 이런 접근 방법을 경고하는 글을 적었음에도 나란 인간은 같은 실수를 되풀이했다.
경험과 직감에만 의존한 추측과 코드 수정, 그리고 결과 보기를 반복했다.이후 동료의 조언으로 프로파일링의 접근을 시도하였다.
이번 문제의 원인을 찾기 위한 제대로된 분석의 첫번째 시도였다.아뿔싸! 나란 인간은 또다른 문제를 가지고 있었다.
여러번의 프로파일링의 중에서 내가 생각하는 원인과 근접하는 결과만을 취사 선택했다.
편향된 의도에 따른 원인 분석과 코드 수정, 그리고 결과 보기를 반복했다.
"경험과 직관에 의존한 추측"이 "편향된 의도에 따른 분석"으로만 대치되었을 뿐이다.
다행히, 이전 버젼과 차이점을 면밀하게 비교하면서 비로서 문제의 원인을 발견했다.
같은 환경과 같은 기능(즉, 로컬 파일 읽기)에서도 새 버젼에서 동일한 문제가 일어났다.
즉, 새로운 기능이 동작할 때 발생하는 것이 아니란 의미이다.
로깅 시스템을 리펙토링을 했는데, 이와 연관이 깊을 것으로 추정했고 다양한 테스트로 이를 검증했다.
로깅 시스템은 전혀 생각하지 못했던 원인이다.이러한 행동을 일반적으로 설명해보자
- 자신의 추정(내적으로는 거의 단정)을 증명할 수 있는 검사를 주로 시행한다
그 생각이 잘못 되었다면, 엉뚱한 곳에서만 계속 맴돌게 되어 진짜 문제를 발견하기 어렵다 - 내가 생각하는 것이 아닐 수 있다는 신호를 받으면 실험 과정에서 발생한 노이즈로 치부한다.
다양한 해석이 가능한 결과는 내 생각을 증명하도록 편향되게 결론내렸다.
생각을 바꿀 수 있는 기회를 이렇게 날려버린다.
이와 같은 행태를 보이는데는 다양한 원인이 있다.
- 자신의 모듈은 문제 없다는 방어적인 태도는 문제의 범위와 해석을 왜곡한다.
- 자신의 경험과 지식을 맹신하여 처음부터 특정 영역을 문제에서 제외한다.
어떻게 하면 이와 같은 문제를 해결할 수 있을까?
- 초반에는 문제의 원인은 충분히 넓게 잡아라.
이후에 검증과 분석을 통해서 문제의 원인을 좁혀간다. - 최대한 중립적인 입장에서 결과를 해석해라.
- 주변 사람을 최대한 이용한다.
원인을 추론하는 과정에서 선입관과 결과의 왜곡을 막는데 도움이 된다.
2013/06/04 - [Issues/Miscellaneous] - 제대로된 결론을 이끌어 내는 대화의 방법.
2013/11/12 - [Programming/Debugging] - 문제의 원인을 추측에만 기대지말고 분석으로 밝혀내라.
'Programmer > Programming' 카테고리의 다른 글
Lisp 비교 : 암호 문자열 감추기 문제 풀이 (1) 2016.01.13 리습(Lisp)을 위한 SyntaxHighlighter 3.0 플러그인 작성 (0) 2015.03.17 리스프 개발 팁: 명령창 결과 저장하기 (0) 2014.06.27 리습의 개발 방법을 배우자: 함수의 구현 (0) 2014.06.26 리습의 개발 방법을 배우자: 함수와 하위 함수의 개발 (3) 2014.06.24 댓글
- 자신의 추정(내적으로는 거의 단정)을 증명할 수 있는 검사를 주로 시행한다