SlideShare ist ein Scribd-Unternehmen logo
1 von 89
Debug It! 실용주의 디버깅 아꿈사 우정권
문제의 핵심 구조적 접근 재현 진단 수정 반영
문제의 핵심 구조적 접근 재현 진단 수정 반영 반복 검증된 디버깅 방법을 보자 은탄환은 아니지만 효과적으로 핵심에 다가설 수 있다
구조적 접근 디버깅 경험주의 접근법 핵심 디버깅 과정 중요한 일부터 실천하기
구조적 접근 디버깅 경험주의 접근법 핵심 디버깅 과정 중요한 일부터 실천하기 디버깅은 버그를 없애는 것 그 이상이다!
효과적인 디버깅 단계 이상 작동 원인 분석 문제 수정 회귀 방지 품질 유지, 향상 재발 방지 문제를 없애는 것은 디버깅의 여러 목표 중 하나일 뿐!
근본 원인 찾아내기 무엇보다 중요 이해 하는 게 전부 근본 원인의 진단 없이 수정 회귀 발생 해결 되지 않은 문제를 숨긴다 흑마술 프로그래밍 우연에 맡기는 프로그래밍
구조적 접근 디버깅 경험주의 접근법 핵심 디버깅 과정 중요한 일부터 실천하기
경험주의 접근법 이론, 논리 보다 관찰, 경험에 기반 	 -   실험 과정 작성 	 -> 작동 관찰 	 -> 결과 확인 문제를 찾는데 효율적 디버깅 중인 소프트웨어야 말로 어떻게 돌아가고 있는지를 보여줄 가장 강력한 도구
소프트웨어의 결정적 성질 현재 상태에 따라 다음 상태가 완전하게 결정 자동차 엔진을 순간적으로 멈추고 살펴 볼 수 있는 것과 다를 바 없다 그래서경험주의 접근법이 디버깅에 강력한 것이다. 소프트웨어는 굉장하다
구조적 접근 디버깅 경험주의 접근법 핵심 디버깅 과정 중요한 일부터 실천하기
핵심 디버깅 과정 재현 문제를 재현하는 쉽고 신뢰 있는 방법 진단 버그 발생 원인을 찾을 때까지 가설 & 실험으로 테스트 수정 코드 수정에 대한 설계 및 구현 회귀 방지 및 품질 유지, 향상 반영 버그에서 교훈 얻기, 재발 방지
디버깅 과정에 대한 다른 관점 TRAFFIC Track – 문제점 추적 Reproduce – 재현 Automate – 자동화, 단순화 Find – 감염원 찾기 Focus – 감염원에 집중 Isolate – 감염 사슬을 격리 Correct – 결함을 정정
비교 아까 반복 검증된 디버깅 방법을 본다 그랬음
디버깅은 반복 과정! 재현 진단 수정 반영 새로 알게 된 정보를 바탕으로 이전 단계를 더 편하게 만들 수 있다
구조적 접근 디버깅 경험주의 접근법 핵심 디버깅 과정 중요한 일부터 실천하기
먼저 할 일이 있다! 무엇을 찾으려는지 알고 있나? 어떤 일이 발생하고 있는가 어떤 일이 벌어져야 하는가 버그리포트도 틀릴 수 있다 (버그가 아닌 명세) 명확하지 않다면 아무런 변경도 하지 마라 제대로 돌아가던 것을 틀리게 수정하기 맞는걸 틀리게 수정한 예) 한번에 한 문제만 간단한 것부터 살펴보기 제대로 돌아가던 거라면 날로 먹은 기분!
먼저 할 일이 있다! 무엇을 찾으려는지 알고 있나? 한번에 한 문제만 유혹에 넘어가지 말자 다른 버그에 영향을 줄 수 없게 간단한 것부터 살펴보기 흙탕물을 만들지 않더라도 디버깅은 이미 충분히어렵다
먼저 할 일이 있다! 무엇을 찾으려는지 알고 있나? 한번에 한 문제만 간단한 것부터 살펴보기 	Not Invented Here 	(이건 내가 만든게 아니야) 증후군 일단 한번 물어보자 저비용 고 효율 안 물어봐서 삽질 한 예)
구조적 접근 디버깅 경험주의 접근법 핵심 디버깅 과정 중요한 일부터 실천하기
실천하기 SW의 이상 작동 원인 알기 문제 고치기 다른 부분 깨뜨리지 않기 품질 유지,향상 시키기 재발을 막기 한번에 한 문제만 해결하기 무엇을 찾고 있는지 정확하게 알기 간단한 것부터 먼저 살피기
문제의 핵심 구조적 접근 재현 진단 수정 반영 재현을 잘하기 위해 필요한 것들을 알아보자
재현 재현 소프트웨어 제어 환경제어 입력제어 재현 방법 다듬기 정말로 재현할 수 없다면? 실천 고민하기 전에 재현부터!
No 재현, No 진도 SW가 실행되는 모습을 살펴볼 수 없다 	(경험주의 적용할 수 없다) 이론을 증명 할 수 없다 문제가 수정됐는지 확인할 수 없다
분명한 것부터 버그리포트부터 따라 해보자 정보 부족으로 돌려 보내지 말고 일단 따라 해본다 간단하다면 복잡하다면 관련 자료를 모두  모을 필요가 있다  버그 보고는 정확한 과학이 못 된다 우리는 우연한 것들을 디버깅하느라 시간을 소비할 여유가 없다 잘되면 정보를 더  요청할 필요가 없다 안되면? 뭐 그렇게  시간낭비 한 것도 아니다 So Chic So Cool
재현 재현 소프트웨어 제어 환경제어 입력제어 재현 방법 다듬기 정말로 재현할 수 없다면? 실천 성공적인 재현은 제어에 달려 있다
소프트웨어 제어 사용자가 실행한 버전을 만들자 컴파일러 설정, 라이브러리, 서드파티 코드, 빌드 순서 환경 제어 실행 환경을 비슷하게 OS, 브라우저,하드웨어,etc=>가상머신 소프트웨어의 작동에 영향을 미칠 수 있는 것이라면 무엇이든 환경!
입력 제어 어떤 입력을 받았는지 파악한 후 재생 버그리포트에 적혀 있다면 lucky 정보가 부족하다면 추론 기록
입력 추론하기 거꾸로 찾아가기 탐색하기 경계 값 분석(+/- , 10,11 …) 분기 커버리지 다른 코드 분기를 실행 할 입력 값 에러 상태 만들기 임의성 도입하기 퍼지 프로그램?
퍼징? 출처 : http://twtpoll.com/r/mwilg5
Fuzzy[fʌ́zi] 4. 유연성 있는, 경계가 모호한 퍼지 테스팅 임의의 데이터를 프로그램에 입력 퍼지 생성기 위 과정을 자동화 생성한 입력은 얼마든지 다시 생성 가능 문제가 발생 했을 때 원하는 대로 재현
입력 기록하기 printf를 전략적으로 호출 내부로그 로그 프레임웍 손쉬운 on/off 로그 수준, 양 조절 추가 정보 분석 툴
Import java.util.loggin.Logger private static final Logger log= Logger.getLogger(Dispatcher.class.getName()); Public static void dispatchLoop(){ 	while(true){ 		try{ 			long start = System.currentTimeMillis(); log.fine(“Processing item:”+item); item.process(); 			long timeInMillis  = System.currentTimeMillis() – start; log.info(“Processing”+item+”took”+ timeInMillis + “ms”); 		}catch(Exception e){ log.severe(“Unhandled exception: “+e); }}}}}
코드에 (디버깅에 필요한)로그 남기기 장점 문제가 생겼을 때 빠르게 찾을 수 있다 단점 애매한 코드 최신 코드를 반영하지 않는 문제 실용주의적으로 접근 정말 도움이 된다면 남기자 항상최신 코드를 반영하도록 한다 AOP 도 있다
외부 로그 네트워크 뿐 아니라 API 도 가능 클라이언트 서버 로깅프락시 클라이언트 서버 로그 파일
부하와 스트레스 특정 환경에서만 발생한다면 동시요청 대규모데이터 네트워크 트래픽 메모리 제한 환경 만들기 로그 재생 방법 부하 테스트 도구 클라우드 컴퓨팅 플랫폼
재현 재현 소프트웨어 제어 환경제어 입력제어 재현 방법 다듬기 정말로 재현할 수 없다면? 실천 재현 방법을 신뢰할 수 있게,편리하게
피드백 루프 최소화 실험 주기를 빠르게 수정-컴파일-실행-재현 주기 많은 실험을 빠르게 => 철저한 이해 주기가 짧을 수록 적절한 피드백 (TDD 동영상 참조) 주기가 길수록 여러 가지를 동시에 손대고 싶은 유혹이 온다 흙탕물을 만들지 않더라도 디버깅은 이미 충분히어렵다
단순하게 불필요한 부분을 제거한다 직감으로 찾기 비직관적인 방법 이진 검색 자동화 실제로 본적은 없지만 멋있어! 재현 방법 다듬기는 진단 과정 내내 고민할 문제! 한번 하고 말일이 아니다
비결정적인 버그를 결정적으로 소프트웨어의 멋진 점 : 결정적 시작 상태가 같다면 결과도 같다 그런대 비결정성이 생겨요 내부 상태를 초기화 하지 않음 외부 시스템과 상호작용 일부러 넣은 임의성 다중 스레드
초기화 없이 사용 최신 OS 나 언어 에서는 자동 초기화 	C/C++ 프로그래머는 주의하세요 초기화로 인한 비결정성이 생긴다면 디버깅용 메모리 할당기 메모리 검증기 	VS 의 /GZ 옵션
외부 시스템과 상호작용 제어할 수 있는 것으로 교체하자 테스트 대역 임의성 의사 난수의시드 값 을 제어한다
다중 스레드 어렵다 문맥전환을 제어할 방법을 찾는다 sleep() 어렵다 재현이나 진단에는 좋다 어렵다 버그 수정 방법으로는 좋지 않다 어렵다
비결정적 버그의 문제 버그 상황을 확인하기 어렵다 수정 확인이 어렵다 추론이 힘들다 잘못된 결론에 도달하기 쉽다 다 떠나서 이런 버그는 그냥 골치 아프다
자동화 빠른 재현, 실수 감소 테스트 자동화 테스트 프레임웍이 가장 좋은 방법 로그파일 재생 반복 획득한 정보를 통해 재현을 다듬기 어떻게 하면 좀 더 편하게 살 수 있을까를 계속 고민하는 것이 디버깅을 잘하는 요령
재현 재현 소프트웨어 제어 환경제어 입력제어 재현 방법 다듬기 정말로 재현할 수 없다면? 실천
정말로 재현이 안되요 버그가 정말로 존재하는가? 모든 가능성을 다 따져 봤는지 확인 추가 정보는 없는지 확인 같은 영역 다른 문제부터 해결 해당 영역의 코드를 정리한다 원래 문제를 더 명확하게 볼 수 있다 안되면?뭐 다른 버그 수정했으니 손해 본 건 없다
정말로 재현이 안돼요 다른 사람 끌어 들이기 다른 시각으로 문제를 따져 본다 버그를 알려준 사람을 데려온다 IBM 한국 developer Works : 창의성의 아이러니 (김창준 님) 1. 다른 사람을 활용하라 참조
정말로 재현이 안돼요 데드레커닝 SW의 이상원인을 순전히 논리만으로 증명한다 참고 게임에서 일반 적인 데드레커닝 용어 대게 네트워크 게임에서 부하를 줄이기 위해 움직임을 예측해서 미리 시뮬레이션 하는 과정 SW의 동작 방식을 예측해서 시뮬레이션
재현 재현 소프트웨어 제어 환경제어 입력제어 재현 방법 다듬기 정말로 재현할 수 없다면? 실천
실천 무엇보다도 먼저 재현 방법을 찾는다 버그가 발견된 버전의 SW 실행하기 재현 환경을 똑같이 만들기 재현에 필요한 입력을 찾기 추론 기록 재현 방법 다듬기 비결정성 제거 자동화
문제의 핵심 구조적 접근 재현 진단 수정 반영
진단 과학 계략 디버거 실수 심리전 확인 실천하기 지금부터는 과학을 할 겁니다
진단은 머리로 하는 것 체계적 열린 마음 창의적 철저 모순된 요구 사이에서의 균형
디버깅 방법 가설을 세운 뒤 검증할 실험으로 확인 시작 가설 만들기 실험 설계 yes 실패? yes no 다른 증거 필요 종료 no
실험 가설의 특징을 보고 방법을 선택한다 내부 상태 검사 작동 변경 검사 로직 변경 검사 실험에는 목표가 있어야 한다 실험 목표를 자문 데블스애드버킷(보고 싶은 것만 본다)
한번에 하나만 고치기 무슨 이유에서인지 사람들이 이 원칙을 너무 자주 까먹는다
시도를 기록해 두기 오랜 진단 이전에 했던 것을 놓칠 위험 실험과 결과를 기록해 두자 뭘 했는지 까먹지 않을 정도만 일일노트, 개인위키 가설 써놓기 (허점을 찾기 좋다) 아이디어 목록 써놓기 낙서하기 (머리를 식히자)
아무것도 무시하지 않기 예상 못한 일이 발생 가정 중 틀린 곳이 있다 하던 일을 멈추고 고치는 게 최선 뭐든지 이해하지 못하는 부분은 잠재적인 버그다
진단 과학 계략 디버거 실수 심리전 확인 실천하기 반복적으로 도움이 되어 온 기법, 방법
진단 코드 진단은 정보가 전부다 	SW 에 진단 코드를 추가 로그를 활용 하이젠 버그에 주의한다 소스코드를 최대한 원형에 가깝게
분할 정복 여러 후보들을 빠르게 추리자 	Log2N 소스 관리 시스템 활용 체크인 설명 확인 리비전으로 이진 검색 Git의 bisect 		Mercurial 에도 있어요
널리 쓰이는 기술 이라면 다른 사람이 먼저 겪었을걸 포럼, 블로그를 검색해보자 오캄의 면도날 다른 모든게 같다면 가장 쉬운 설명이 좋다 가장 간단한 것부터 확인 해 보자
진단 과학 계략 디버거 실수 심리전 확인 실천하기 이제서야 디버거에 대한 이야기를 하는 이유
디버거 가장 강력한 디버깅 방법 디버거를 사용 하는 이유 의도대로 실행 되는지 코드를 단계별로 확인 코드 실행에 대한 이론 증명/반증 이상하게 실행되는 코드 검사
TDD 를 대입해 본다면?
테스트 우선개발 의도한 코드 실행 확인을 위해 작동을 보여줄 테스트를 작성한다 버그 발생에대한 이론이 있다면 증명할 테스트를 작성한다 디버거로 확인하는 것은 순간, 테스트 결과는 계속 남는다 이론 증명 뿐 아니라 수정도 검증 디버거는 검사용
진단 과학 계략 디버거 실수 심리전 확인 실천하기 실전에서 배운 교훈들을 살펴보자
고쳤을 때 효과가 없다면 원했던 부분이 아니다 맞는 걸 고치고 있는지 확인 헷갈리기 쉬운 흔한 함정 다른 바이너리 실행 다른 서버에 접속 코드 비활성화 함정에 빠진걸 쉽게 알려면 명확한 실패 코드를 추가한다 가정을 비판적으로 검토한다 실험 결과가 달라진다면 정확하게 무엇이 변경 됐는지를 찾아 제어한다
문제가 정말 복잡할 때 원인이 여러 개는 아닌지 의심해 본다 원인이 여러 개라면 문제를 격리 하나의 원인에만 의존하는 버그 재현방법 찾아보기 같은 영역의 다른 버그를 확인 다 통하지 않는다면 심호흡을 한다 누구도 디버깅이 쉽다고 하지 않았다
진단 과학 계략 디버거 실수 심리전 확인 실천하기 더 이상 뭘 해야 할지 모르겠다고 상처받지 말자 장애물에 가로막혔을 때 도움되는 기법을 보자
또! 다른 사람에게 도움을 요청 역할극 피규어 디버깅 생각을 정리 가정을 나열 기본 원리로 부터 논거를 구성 문제를 설명하는 것만으로도 영감 못 찾았으면?뭐 딱히 잃은 것도 없다
다양한 디버깅 툴들
문제 묵혀두기 진전이 없어 자책 중? 휴식이 필요 잠재의식을 활용한다 갑자기 머릿속에 해답이 안 떠오르면? 충전된 상태로 문제를 본다 남용은 금물 계속 압박해야 찾을 수 있는 버그도 있다 복잡한 버그를 찾으려면 여러 다른 것들을 기억하고 있어야 한다
셜록홈즈 법칙 ‘불가능한 것들을 전부 제거하고 나면 아무리 불가능해 보이는 것이라도 남아 있는 것이 진실이다’ 너무 아닐 것 같다는 이유만으로 설명을 기각하지 말자 인내 사실 진단할 수 없는 버그는 없다 쉽진 않지만 시간, 노력, 각오 만 있다면 언젠가는 해답을 찾을 수 있다
진단 과학 계략 디버거 실수 심리전 확인 실천하기
견제와 균형 진단 내용을 다른 사람에게 설명 깨끗한 소스코드로 유효한지 검증 생각한 대로 돌아가는지 확인 데블스애드버킷
진단 과학 계략 디버거 실수 심리전 확인 실천하기
가설을 세우고 실험으로 확인 실험 목표 분명히 한 번에 하나만 시도들을 기록 아무것도 무시하지 않는다 제대로 안되면 가정 확인 원인이 여러 개인지 확인 진단을 확인
문제의 핵심 구조적 접근 재현 진단 수정 반영 이미 문제를 알고 있기 때문에 수정하기는 식은 죽 먹기
수정 지금부터는 형사가 아닌 SW 엔지니어로 돌아 오세요 단순히 SW가 올바르게 작동하게 만드는 것보다 더 좋게 수정할 방법 문제 수정 회귀 방지 품질 유지, 향상
깨끗한 상태에서 시작한다 시작 지점을 신뢰 할 수 있다 증상이 아닌 근본 원인을 고친다 잘 설명할 수 있는지 확인 	‘이유는 모르겠지만’, 	‘ 확실치않지만’… 정직하라 원인을 확신 할 수 있는 수준이 아니라면 버그 수정을 신뢰할 수 없음을 인정하는 용기가 필요
테스트 주도 개발 중이라면 기존 테스트가 통과 되는지 확인 새로운 테스트를 실패 시킨다 테스트 추가, 수정 버그를 수정한다 새로운 테스트가 통과되는지 확인 회귀를 확인 기존의 테스트도 통과
아니라면 수동으로 테스트 그래도 테스트는 중요 회귀가 들어갈 가능성이 높다 회귀가 생기지 않게 굉장히 조심한다
리팩토링 광범위한 테스트 스위트가안전망 역할을 해줄 때 안전하게 수정 할 수 있다 작동 변경과 리팩토링을 동시에 하면 안 된다 버그가 있는 코드는 개선할 여지가 있을 가능성이 높음을 의미 버그 수정 만큼이나 중요하다 (품질 향상) 리팩토링-> 버그 수정 버그 수정 -> 리팩토링 사이를 반복
체크인 디비겅 관점에서 소스 관리 시스템의 가치는 감사 추적 기능 로직을 하나 바꿀 때마다 체크인 한다 체크인 설명을 최대한 의미 있게 구체적으로 작성한다 체크인 하기 전에 어떤 것을 체크인 하려는지 검사한다
코드리뷰 받기 분명하지 않거나 위험하다고 생각되는 부분 에서 익숙하지 않은 분야의 작업이라면 작업에 익숙한 누군가에게 이미 잘 알고 있는 코드라면 모르는 사람의 신선한 시각으로
실천하기 버그 수정의 3가지 목표 문제 수정 회귀 방지 품질 유지, 향상 깨끗한 소스에서 시작한다 테스트를 확인한다 증상이 아닌 원인을 고친다 리팩토링 한다 로직을 바꿀 때마다 체크인 한다
끝 Reference Debug It! 실용주의 디버깅 프로그램은 왜 실패하는가 실용주의 프로그래머 적당한 스터디 발표자료 만들기 : http://www.slideshare.net/ohyecloudy/ss-4722063?from=ss_embed Kuler :  http://kuler.adobe.com/#themes/search?term=corporate%20flair IBM 한국 developer Works : http://www.ibm.com/developerworks/kr/library/dwclm/20100630/ TDD 동영상 : http://xper.org/LineReaderTdd/ Twtpoll : http://twtpoll.com/r/mwilg5 데드레커닝: http://www.g-matrix.pe.kr/feature/multi/deadreckoning.htm Git : http://namhyung.springnote.com/pages/3132772 Mecrurial : http://mercurial-korean-doc.googlecode.com/hg/hg.1.kor

Weitere ähnliche Inhalte

Was ist angesagt?

단위테스트자동화지원도구 임성현 최종
단위테스트자동화지원도구 임성현 최종단위테스트자동화지원도구 임성현 최종
단위테스트자동화지원도구 임성현 최종
guest7178884
 
소프트웨어 테스팅
소프트웨어 테스팅소프트웨어 테스팅
소프트웨어 테스팅
영기 김
 
애자일 도입과 사례 공유
애자일 도입과 사례 공유애자일 도입과 사례 공유
애자일 도입과 사례 공유
agilekorea
 
xUnitTestPattern/chapter17
xUnitTestPattern/chapter17xUnitTestPattern/chapter17
xUnitTestPattern/chapter17
Yoon Hee Hwang
 

Was ist angesagt? (18)

자동화된 Test Case의 효과
자동화된 Test Case의 효과자동화된 Test Case의 효과
자동화된 Test Case의 효과
 
testing for agile?, agile for testing
testing for agile?, agile for testingtesting for agile?, agile for testing
testing for agile?, agile for testing
 
TDD: Test Driven Development 첫번째 이야기
TDD: Test Driven Development 첫번째 이야기TDD: Test Driven Development 첫번째 이야기
TDD: Test Driven Development 첫번째 이야기
 
파이썬 TDD 101
파이썬 TDD 101파이썬 TDD 101
파이썬 TDD 101
 
단위테스트자동화지원도구 임성현 최종
단위테스트자동화지원도구 임성현 최종단위테스트자동화지원도구 임성현 최종
단위테스트자동화지원도구 임성현 최종
 
TDD
TDDTDD
TDD
 
TDD&Refactoring Day 01: Refactoring
TDD&Refactoring Day 01: RefactoringTDD&Refactoring Day 01: Refactoring
TDD&Refactoring Day 01: Refactoring
 
IoT 개발자를 위한 Embedded C에서 TDD를 해보자
IoT 개발자를 위한 Embedded C에서 TDD를 해보자IoT 개발자를 위한 Embedded C에서 TDD를 해보자
IoT 개발자를 위한 Embedded C에서 TDD를 해보자
 
소프트웨어 테스팅
소프트웨어 테스팅소프트웨어 테스팅
소프트웨어 테스팅
 
애자일 테스트 프랙티스와 사례들 (부제: 협업의 힘)
애자일 테스트 프랙티스와 사례들 (부제: 협업의 힘)애자일 테스트 프랙티스와 사례들 (부제: 협업의 힘)
애자일 테스트 프랙티스와 사례들 (부제: 협업의 힘)
 
Tdd ver.2
Tdd ver.2Tdd ver.2
Tdd ver.2
 
TDD - 테스트 주도로 개발하기
TDD - 테스트 주도로 개발하기TDD - 테스트 주도로 개발하기
TDD - 테스트 주도로 개발하기
 
애자일 도입과 사례 공유
애자일 도입과 사례 공유애자일 도입과 사례 공유
애자일 도입과 사례 공유
 
행복한 개발을 위한_테스트_케이스
행복한 개발을 위한_테스트_케이스행복한 개발을 위한_테스트_케이스
행복한 개발을 위한_테스트_케이스
 
[AUG]개발자와 QA가 상생하는 테스트 프로세스
[AUG]개발자와 QA가 상생하는 테스트 프로세스[AUG]개발자와 QA가 상생하는 테스트 프로세스
[AUG]개발자와 QA가 상생하는 테스트 프로세스
 
xUnitTestPattern/chapter17
xUnitTestPattern/chapter17xUnitTestPattern/chapter17
xUnitTestPattern/chapter17
 
테스트 케이스와 SW 품질
테스트 케이스와 SW 품질테스트 케이스와 SW 품질
테스트 케이스와 SW 품질
 
Tdd live spring camp 2013
Tdd live spring camp 2013Tdd live spring camp 2013
Tdd live spring camp 2013
 

Andere mochten auch (7)

가상화와 보안 발표자료
가상화와 보안 발표자료가상화와 보안 발표자료
가상화와 보안 발표자료
 
AWS Enterprise Summit :: 클라우드 운영 - Cloud CoE, Cloud Ops, Cloud MSP (이원일 시니어 컨...
AWS Enterprise Summit :: 클라우드 운영 - Cloud CoE, Cloud Ops, Cloud MSP (이원일 시니어 컨...AWS Enterprise Summit :: 클라우드 운영 - Cloud CoE, Cloud Ops, Cloud MSP (이원일 시니어 컨...
AWS Enterprise Summit :: 클라우드 운영 - Cloud CoE, Cloud Ops, Cloud MSP (이원일 시니어 컨...
 
20140512 node.js를 활용한 실시간 웹채팅
20140512 node.js를 활용한 실시간 웹채팅20140512 node.js를 활용한 실시간 웹채팅
20140512 node.js를 활용한 실시간 웹채팅
 
Leadweb Nodejs
Leadweb NodejsLeadweb Nodejs
Leadweb Nodejs
 
1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)1.자료구조와 알고리즘(강의자료)
1.자료구조와 알고리즘(강의자료)
 
국가의 신성장 동력으로서 공간정보의 가치와 활용 2016-0603
국가의 신성장 동력으로서 공간정보의 가치와 활용 2016-0603국가의 신성장 동력으로서 공간정보의 가치와 활용 2016-0603
국가의 신성장 동력으로서 공간정보의 가치와 활용 2016-0603
 
빅데이터 기술을 활용한 뉴스 큐레이션 서비스 - 온병원
빅데이터 기술을 활용한 뉴스 큐레이션 서비스 - 온병원빅데이터 기술을 활용한 뉴스 큐레이션 서비스 - 온병원
빅데이터 기술을 활용한 뉴스 큐레이션 서비스 - 온병원
 

Ähnlich wie DebugIt/chapter1~4

Ähnlich wie DebugIt/chapter1~4 (20)

[H3 2012] 행복한 개발을 위한 테스트 케이스
[H3 2012] 행복한 개발을 위한 테스트 케이스[H3 2012] 행복한 개발을 위한 테스트 케이스
[H3 2012] 행복한 개발을 위한 테스트 케이스
 
스타트업 인턴 개발자 3달간의 고군분투기 김은향
스타트업 인턴 개발자 3달간의 고군분투기 김은향스타트업 인턴 개발자 3달간의 고군분투기 김은향
스타트업 인턴 개발자 3달간의 고군분투기 김은향
 
엔지니어의 학습, 그리고 테스트 코드
엔지니어의 학습, 그리고 테스트 코드엔지니어의 학습, 그리고 테스트 코드
엔지니어의 학습, 그리고 테스트 코드
 
KERIS 실험학교 연수(기초과정
KERIS 실험학교 연수(기초과정KERIS 실험학교 연수(기초과정
KERIS 실험학교 연수(기초과정
 
발표자료 1인qa로살아남는6가지방법
발표자료 1인qa로살아남는6가지방법발표자료 1인qa로살아남는6가지방법
발표자료 1인qa로살아남는6가지방법
 
테스트 냄새
테스트 냄새테스트 냄새
테스트 냄새
 
Windows Debugging Technique #1
Windows Debugging Technique #1Windows Debugging Technique #1
Windows Debugging Technique #1
 
KERIS SW교육 연계 로봇 활용 심화과정 (중등)
KERIS SW교육 연계 로봇 활용 심화과정 (중등)KERIS SW교육 연계 로봇 활용 심화과정 (중등)
KERIS SW교육 연계 로봇 활용 심화과정 (중등)
 
애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)
애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)
애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)
 
클린코드와 테스트코드
클린코드와 테스트코드클린코드와 테스트코드
클린코드와 테스트코드
 
프로젝트 Xxx에 적용하고 싶은 개발방법
프로젝트 Xxx에 적용하고 싶은 개발방법프로젝트 Xxx에 적용하고 싶은 개발방법
프로젝트 Xxx에 적용하고 싶은 개발방법
 
초보개발자의 TDD 체험기
초보개발자의 TDD 체험기초보개발자의 TDD 체험기
초보개발자의 TDD 체험기
 
『이펙티브 디버깅』 맛보기
『이펙티브 디버깅』 맛보기『이펙티브 디버깅』 맛보기
『이펙티브 디버깅』 맛보기
 
전통적인 개발과 테스트 주도 개발, 그리고 애자일
전통적인 개발과 테스트 주도 개발, 그리고 애자일전통적인 개발과 테스트 주도 개발, 그리고 애자일
전통적인 개발과 테스트 주도 개발, 그리고 애자일
 
애자일의 모든것
애자일의 모든것애자일의 모든것
애자일의 모든것
 
개발이 테스트를 만났을 때(Shift left testing)
개발이 테스트를 만났을 때(Shift left testing)개발이 테스트를 만났을 때(Shift left testing)
개발이 테스트를 만났을 때(Shift left testing)
 
C++ 코드 품질 관리 비법
C++ 코드 품질 관리 비법C++ 코드 품질 관리 비법
C++ 코드 품질 관리 비법
 
DebugIt/chapter5~8
DebugIt/chapter5~8DebugIt/chapter5~8
DebugIt/chapter5~8
 
깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)
 
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
 

DebugIt/chapter1~4

  • 1. Debug It! 실용주의 디버깅 아꿈사 우정권
  • 2. 문제의 핵심 구조적 접근 재현 진단 수정 반영
  • 3. 문제의 핵심 구조적 접근 재현 진단 수정 반영 반복 검증된 디버깅 방법을 보자 은탄환은 아니지만 효과적으로 핵심에 다가설 수 있다
  • 4. 구조적 접근 디버깅 경험주의 접근법 핵심 디버깅 과정 중요한 일부터 실천하기
  • 5. 구조적 접근 디버깅 경험주의 접근법 핵심 디버깅 과정 중요한 일부터 실천하기 디버깅은 버그를 없애는 것 그 이상이다!
  • 6. 효과적인 디버깅 단계 이상 작동 원인 분석 문제 수정 회귀 방지 품질 유지, 향상 재발 방지 문제를 없애는 것은 디버깅의 여러 목표 중 하나일 뿐!
  • 7. 근본 원인 찾아내기 무엇보다 중요 이해 하는 게 전부 근본 원인의 진단 없이 수정 회귀 발생 해결 되지 않은 문제를 숨긴다 흑마술 프로그래밍 우연에 맡기는 프로그래밍
  • 8. 구조적 접근 디버깅 경험주의 접근법 핵심 디버깅 과정 중요한 일부터 실천하기
  • 9. 경험주의 접근법 이론, 논리 보다 관찰, 경험에 기반 - 실험 과정 작성 -> 작동 관찰 -> 결과 확인 문제를 찾는데 효율적 디버깅 중인 소프트웨어야 말로 어떻게 돌아가고 있는지를 보여줄 가장 강력한 도구
  • 10. 소프트웨어의 결정적 성질 현재 상태에 따라 다음 상태가 완전하게 결정 자동차 엔진을 순간적으로 멈추고 살펴 볼 수 있는 것과 다를 바 없다 그래서경험주의 접근법이 디버깅에 강력한 것이다. 소프트웨어는 굉장하다
  • 11. 구조적 접근 디버깅 경험주의 접근법 핵심 디버깅 과정 중요한 일부터 실천하기
  • 12. 핵심 디버깅 과정 재현 문제를 재현하는 쉽고 신뢰 있는 방법 진단 버그 발생 원인을 찾을 때까지 가설 & 실험으로 테스트 수정 코드 수정에 대한 설계 및 구현 회귀 방지 및 품질 유지, 향상 반영 버그에서 교훈 얻기, 재발 방지
  • 13. 디버깅 과정에 대한 다른 관점 TRAFFIC Track – 문제점 추적 Reproduce – 재현 Automate – 자동화, 단순화 Find – 감염원 찾기 Focus – 감염원에 집중 Isolate – 감염 사슬을 격리 Correct – 결함을 정정
  • 14. 비교 아까 반복 검증된 디버깅 방법을 본다 그랬음
  • 15. 디버깅은 반복 과정! 재현 진단 수정 반영 새로 알게 된 정보를 바탕으로 이전 단계를 더 편하게 만들 수 있다
  • 16. 구조적 접근 디버깅 경험주의 접근법 핵심 디버깅 과정 중요한 일부터 실천하기
  • 17. 먼저 할 일이 있다! 무엇을 찾으려는지 알고 있나? 어떤 일이 발생하고 있는가 어떤 일이 벌어져야 하는가 버그리포트도 틀릴 수 있다 (버그가 아닌 명세) 명확하지 않다면 아무런 변경도 하지 마라 제대로 돌아가던 것을 틀리게 수정하기 맞는걸 틀리게 수정한 예) 한번에 한 문제만 간단한 것부터 살펴보기 제대로 돌아가던 거라면 날로 먹은 기분!
  • 18. 먼저 할 일이 있다! 무엇을 찾으려는지 알고 있나? 한번에 한 문제만 유혹에 넘어가지 말자 다른 버그에 영향을 줄 수 없게 간단한 것부터 살펴보기 흙탕물을 만들지 않더라도 디버깅은 이미 충분히어렵다
  • 19. 먼저 할 일이 있다! 무엇을 찾으려는지 알고 있나? 한번에 한 문제만 간단한 것부터 살펴보기 Not Invented Here (이건 내가 만든게 아니야) 증후군 일단 한번 물어보자 저비용 고 효율 안 물어봐서 삽질 한 예)
  • 20. 구조적 접근 디버깅 경험주의 접근법 핵심 디버깅 과정 중요한 일부터 실천하기
  • 21. 실천하기 SW의 이상 작동 원인 알기 문제 고치기 다른 부분 깨뜨리지 않기 품질 유지,향상 시키기 재발을 막기 한번에 한 문제만 해결하기 무엇을 찾고 있는지 정확하게 알기 간단한 것부터 먼저 살피기
  • 22. 문제의 핵심 구조적 접근 재현 진단 수정 반영 재현을 잘하기 위해 필요한 것들을 알아보자
  • 23. 재현 재현 소프트웨어 제어 환경제어 입력제어 재현 방법 다듬기 정말로 재현할 수 없다면? 실천 고민하기 전에 재현부터!
  • 24. No 재현, No 진도 SW가 실행되는 모습을 살펴볼 수 없다 (경험주의 적용할 수 없다) 이론을 증명 할 수 없다 문제가 수정됐는지 확인할 수 없다
  • 25. 분명한 것부터 버그리포트부터 따라 해보자 정보 부족으로 돌려 보내지 말고 일단 따라 해본다 간단하다면 복잡하다면 관련 자료를 모두 모을 필요가 있다 버그 보고는 정확한 과학이 못 된다 우리는 우연한 것들을 디버깅하느라 시간을 소비할 여유가 없다 잘되면 정보를 더 요청할 필요가 없다 안되면? 뭐 그렇게 시간낭비 한 것도 아니다 So Chic So Cool
  • 26. 재현 재현 소프트웨어 제어 환경제어 입력제어 재현 방법 다듬기 정말로 재현할 수 없다면? 실천 성공적인 재현은 제어에 달려 있다
  • 27. 소프트웨어 제어 사용자가 실행한 버전을 만들자 컴파일러 설정, 라이브러리, 서드파티 코드, 빌드 순서 환경 제어 실행 환경을 비슷하게 OS, 브라우저,하드웨어,etc=>가상머신 소프트웨어의 작동에 영향을 미칠 수 있는 것이라면 무엇이든 환경!
  • 28. 입력 제어 어떤 입력을 받았는지 파악한 후 재생 버그리포트에 적혀 있다면 lucky 정보가 부족하다면 추론 기록
  • 29. 입력 추론하기 거꾸로 찾아가기 탐색하기 경계 값 분석(+/- , 10,11 …) 분기 커버리지 다른 코드 분기를 실행 할 입력 값 에러 상태 만들기 임의성 도입하기 퍼지 프로그램?
  • 30. 퍼징? 출처 : http://twtpoll.com/r/mwilg5
  • 31. Fuzzy[fʌ́zi] 4. 유연성 있는, 경계가 모호한 퍼지 테스팅 임의의 데이터를 프로그램에 입력 퍼지 생성기 위 과정을 자동화 생성한 입력은 얼마든지 다시 생성 가능 문제가 발생 했을 때 원하는 대로 재현
  • 32. 입력 기록하기 printf를 전략적으로 호출 내부로그 로그 프레임웍 손쉬운 on/off 로그 수준, 양 조절 추가 정보 분석 툴
  • 33. Import java.util.loggin.Logger private static final Logger log= Logger.getLogger(Dispatcher.class.getName()); Public static void dispatchLoop(){ while(true){ try{ long start = System.currentTimeMillis(); log.fine(“Processing item:”+item); item.process(); long timeInMillis = System.currentTimeMillis() – start; log.info(“Processing”+item+”took”+ timeInMillis + “ms”); }catch(Exception e){ log.severe(“Unhandled exception: “+e); }}}}}
  • 34. 코드에 (디버깅에 필요한)로그 남기기 장점 문제가 생겼을 때 빠르게 찾을 수 있다 단점 애매한 코드 최신 코드를 반영하지 않는 문제 실용주의적으로 접근 정말 도움이 된다면 남기자 항상최신 코드를 반영하도록 한다 AOP 도 있다
  • 35. 외부 로그 네트워크 뿐 아니라 API 도 가능 클라이언트 서버 로깅프락시 클라이언트 서버 로그 파일
  • 36. 부하와 스트레스 특정 환경에서만 발생한다면 동시요청 대규모데이터 네트워크 트래픽 메모리 제한 환경 만들기 로그 재생 방법 부하 테스트 도구 클라우드 컴퓨팅 플랫폼
  • 37. 재현 재현 소프트웨어 제어 환경제어 입력제어 재현 방법 다듬기 정말로 재현할 수 없다면? 실천 재현 방법을 신뢰할 수 있게,편리하게
  • 38. 피드백 루프 최소화 실험 주기를 빠르게 수정-컴파일-실행-재현 주기 많은 실험을 빠르게 => 철저한 이해 주기가 짧을 수록 적절한 피드백 (TDD 동영상 참조) 주기가 길수록 여러 가지를 동시에 손대고 싶은 유혹이 온다 흙탕물을 만들지 않더라도 디버깅은 이미 충분히어렵다
  • 39. 단순하게 불필요한 부분을 제거한다 직감으로 찾기 비직관적인 방법 이진 검색 자동화 실제로 본적은 없지만 멋있어! 재현 방법 다듬기는 진단 과정 내내 고민할 문제! 한번 하고 말일이 아니다
  • 40. 비결정적인 버그를 결정적으로 소프트웨어의 멋진 점 : 결정적 시작 상태가 같다면 결과도 같다 그런대 비결정성이 생겨요 내부 상태를 초기화 하지 않음 외부 시스템과 상호작용 일부러 넣은 임의성 다중 스레드
  • 41. 초기화 없이 사용 최신 OS 나 언어 에서는 자동 초기화 C/C++ 프로그래머는 주의하세요 초기화로 인한 비결정성이 생긴다면 디버깅용 메모리 할당기 메모리 검증기 VS 의 /GZ 옵션
  • 42. 외부 시스템과 상호작용 제어할 수 있는 것으로 교체하자 테스트 대역 임의성 의사 난수의시드 값 을 제어한다
  • 43. 다중 스레드 어렵다 문맥전환을 제어할 방법을 찾는다 sleep() 어렵다 재현이나 진단에는 좋다 어렵다 버그 수정 방법으로는 좋지 않다 어렵다
  • 44. 비결정적 버그의 문제 버그 상황을 확인하기 어렵다 수정 확인이 어렵다 추론이 힘들다 잘못된 결론에 도달하기 쉽다 다 떠나서 이런 버그는 그냥 골치 아프다
  • 45. 자동화 빠른 재현, 실수 감소 테스트 자동화 테스트 프레임웍이 가장 좋은 방법 로그파일 재생 반복 획득한 정보를 통해 재현을 다듬기 어떻게 하면 좀 더 편하게 살 수 있을까를 계속 고민하는 것이 디버깅을 잘하는 요령
  • 46. 재현 재현 소프트웨어 제어 환경제어 입력제어 재현 방법 다듬기 정말로 재현할 수 없다면? 실천
  • 47. 정말로 재현이 안되요 버그가 정말로 존재하는가? 모든 가능성을 다 따져 봤는지 확인 추가 정보는 없는지 확인 같은 영역 다른 문제부터 해결 해당 영역의 코드를 정리한다 원래 문제를 더 명확하게 볼 수 있다 안되면?뭐 다른 버그 수정했으니 손해 본 건 없다
  • 48. 정말로 재현이 안돼요 다른 사람 끌어 들이기 다른 시각으로 문제를 따져 본다 버그를 알려준 사람을 데려온다 IBM 한국 developer Works : 창의성의 아이러니 (김창준 님) 1. 다른 사람을 활용하라 참조
  • 49. 정말로 재현이 안돼요 데드레커닝 SW의 이상원인을 순전히 논리만으로 증명한다 참고 게임에서 일반 적인 데드레커닝 용어 대게 네트워크 게임에서 부하를 줄이기 위해 움직임을 예측해서 미리 시뮬레이션 하는 과정 SW의 동작 방식을 예측해서 시뮬레이션
  • 50. 재현 재현 소프트웨어 제어 환경제어 입력제어 재현 방법 다듬기 정말로 재현할 수 없다면? 실천
  • 51. 실천 무엇보다도 먼저 재현 방법을 찾는다 버그가 발견된 버전의 SW 실행하기 재현 환경을 똑같이 만들기 재현에 필요한 입력을 찾기 추론 기록 재현 방법 다듬기 비결정성 제거 자동화
  • 52. 문제의 핵심 구조적 접근 재현 진단 수정 반영
  • 53. 진단 과학 계략 디버거 실수 심리전 확인 실천하기 지금부터는 과학을 할 겁니다
  • 54. 진단은 머리로 하는 것 체계적 열린 마음 창의적 철저 모순된 요구 사이에서의 균형
  • 55. 디버깅 방법 가설을 세운 뒤 검증할 실험으로 확인 시작 가설 만들기 실험 설계 yes 실패? yes no 다른 증거 필요 종료 no
  • 56. 실험 가설의 특징을 보고 방법을 선택한다 내부 상태 검사 작동 변경 검사 로직 변경 검사 실험에는 목표가 있어야 한다 실험 목표를 자문 데블스애드버킷(보고 싶은 것만 본다)
  • 57. 한번에 하나만 고치기 무슨 이유에서인지 사람들이 이 원칙을 너무 자주 까먹는다
  • 58. 시도를 기록해 두기 오랜 진단 이전에 했던 것을 놓칠 위험 실험과 결과를 기록해 두자 뭘 했는지 까먹지 않을 정도만 일일노트, 개인위키 가설 써놓기 (허점을 찾기 좋다) 아이디어 목록 써놓기 낙서하기 (머리를 식히자)
  • 59. 아무것도 무시하지 않기 예상 못한 일이 발생 가정 중 틀린 곳이 있다 하던 일을 멈추고 고치는 게 최선 뭐든지 이해하지 못하는 부분은 잠재적인 버그다
  • 60. 진단 과학 계략 디버거 실수 심리전 확인 실천하기 반복적으로 도움이 되어 온 기법, 방법
  • 61. 진단 코드 진단은 정보가 전부다 SW 에 진단 코드를 추가 로그를 활용 하이젠 버그에 주의한다 소스코드를 최대한 원형에 가깝게
  • 62. 분할 정복 여러 후보들을 빠르게 추리자 Log2N 소스 관리 시스템 활용 체크인 설명 확인 리비전으로 이진 검색 Git의 bisect Mercurial 에도 있어요
  • 63. 널리 쓰이는 기술 이라면 다른 사람이 먼저 겪었을걸 포럼, 블로그를 검색해보자 오캄의 면도날 다른 모든게 같다면 가장 쉬운 설명이 좋다 가장 간단한 것부터 확인 해 보자
  • 64. 진단 과학 계략 디버거 실수 심리전 확인 실천하기 이제서야 디버거에 대한 이야기를 하는 이유
  • 65. 디버거 가장 강력한 디버깅 방법 디버거를 사용 하는 이유 의도대로 실행 되는지 코드를 단계별로 확인 코드 실행에 대한 이론 증명/반증 이상하게 실행되는 코드 검사
  • 66. TDD 를 대입해 본다면?
  • 67. 테스트 우선개발 의도한 코드 실행 확인을 위해 작동을 보여줄 테스트를 작성한다 버그 발생에대한 이론이 있다면 증명할 테스트를 작성한다 디버거로 확인하는 것은 순간, 테스트 결과는 계속 남는다 이론 증명 뿐 아니라 수정도 검증 디버거는 검사용
  • 68. 진단 과학 계략 디버거 실수 심리전 확인 실천하기 실전에서 배운 교훈들을 살펴보자
  • 69. 고쳤을 때 효과가 없다면 원했던 부분이 아니다 맞는 걸 고치고 있는지 확인 헷갈리기 쉬운 흔한 함정 다른 바이너리 실행 다른 서버에 접속 코드 비활성화 함정에 빠진걸 쉽게 알려면 명확한 실패 코드를 추가한다 가정을 비판적으로 검토한다 실험 결과가 달라진다면 정확하게 무엇이 변경 됐는지를 찾아 제어한다
  • 70. 문제가 정말 복잡할 때 원인이 여러 개는 아닌지 의심해 본다 원인이 여러 개라면 문제를 격리 하나의 원인에만 의존하는 버그 재현방법 찾아보기 같은 영역의 다른 버그를 확인 다 통하지 않는다면 심호흡을 한다 누구도 디버깅이 쉽다고 하지 않았다
  • 71. 진단 과학 계략 디버거 실수 심리전 확인 실천하기 더 이상 뭘 해야 할지 모르겠다고 상처받지 말자 장애물에 가로막혔을 때 도움되는 기법을 보자
  • 72. 또! 다른 사람에게 도움을 요청 역할극 피규어 디버깅 생각을 정리 가정을 나열 기본 원리로 부터 논거를 구성 문제를 설명하는 것만으로도 영감 못 찾았으면?뭐 딱히 잃은 것도 없다
  • 74. 문제 묵혀두기 진전이 없어 자책 중? 휴식이 필요 잠재의식을 활용한다 갑자기 머릿속에 해답이 안 떠오르면? 충전된 상태로 문제를 본다 남용은 금물 계속 압박해야 찾을 수 있는 버그도 있다 복잡한 버그를 찾으려면 여러 다른 것들을 기억하고 있어야 한다
  • 75. 셜록홈즈 법칙 ‘불가능한 것들을 전부 제거하고 나면 아무리 불가능해 보이는 것이라도 남아 있는 것이 진실이다’ 너무 아닐 것 같다는 이유만으로 설명을 기각하지 말자 인내 사실 진단할 수 없는 버그는 없다 쉽진 않지만 시간, 노력, 각오 만 있다면 언젠가는 해답을 찾을 수 있다
  • 76. 진단 과학 계략 디버거 실수 심리전 확인 실천하기
  • 77. 견제와 균형 진단 내용을 다른 사람에게 설명 깨끗한 소스코드로 유효한지 검증 생각한 대로 돌아가는지 확인 데블스애드버킷
  • 78. 진단 과학 계략 디버거 실수 심리전 확인 실천하기
  • 79. 가설을 세우고 실험으로 확인 실험 목표 분명히 한 번에 하나만 시도들을 기록 아무것도 무시하지 않는다 제대로 안되면 가정 확인 원인이 여러 개인지 확인 진단을 확인
  • 80. 문제의 핵심 구조적 접근 재현 진단 수정 반영 이미 문제를 알고 있기 때문에 수정하기는 식은 죽 먹기
  • 81. 수정 지금부터는 형사가 아닌 SW 엔지니어로 돌아 오세요 단순히 SW가 올바르게 작동하게 만드는 것보다 더 좋게 수정할 방법 문제 수정 회귀 방지 품질 유지, 향상
  • 82. 깨끗한 상태에서 시작한다 시작 지점을 신뢰 할 수 있다 증상이 아닌 근본 원인을 고친다 잘 설명할 수 있는지 확인 ‘이유는 모르겠지만’, ‘ 확실치않지만’… 정직하라 원인을 확신 할 수 있는 수준이 아니라면 버그 수정을 신뢰할 수 없음을 인정하는 용기가 필요
  • 83. 테스트 주도 개발 중이라면 기존 테스트가 통과 되는지 확인 새로운 테스트를 실패 시킨다 테스트 추가, 수정 버그를 수정한다 새로운 테스트가 통과되는지 확인 회귀를 확인 기존의 테스트도 통과
  • 84. 아니라면 수동으로 테스트 그래도 테스트는 중요 회귀가 들어갈 가능성이 높다 회귀가 생기지 않게 굉장히 조심한다
  • 85. 리팩토링 광범위한 테스트 스위트가안전망 역할을 해줄 때 안전하게 수정 할 수 있다 작동 변경과 리팩토링을 동시에 하면 안 된다 버그가 있는 코드는 개선할 여지가 있을 가능성이 높음을 의미 버그 수정 만큼이나 중요하다 (품질 향상) 리팩토링-> 버그 수정 버그 수정 -> 리팩토링 사이를 반복
  • 86. 체크인 디비겅 관점에서 소스 관리 시스템의 가치는 감사 추적 기능 로직을 하나 바꿀 때마다 체크인 한다 체크인 설명을 최대한 의미 있게 구체적으로 작성한다 체크인 하기 전에 어떤 것을 체크인 하려는지 검사한다
  • 87. 코드리뷰 받기 분명하지 않거나 위험하다고 생각되는 부분 에서 익숙하지 않은 분야의 작업이라면 작업에 익숙한 누군가에게 이미 잘 알고 있는 코드라면 모르는 사람의 신선한 시각으로
  • 88. 실천하기 버그 수정의 3가지 목표 문제 수정 회귀 방지 품질 유지, 향상 깨끗한 소스에서 시작한다 테스트를 확인한다 증상이 아닌 원인을 고친다 리팩토링 한다 로직을 바꿀 때마다 체크인 한다
  • 89. 끝 Reference Debug It! 실용주의 디버깅 프로그램은 왜 실패하는가 실용주의 프로그래머 적당한 스터디 발표자료 만들기 : http://www.slideshare.net/ohyecloudy/ss-4722063?from=ss_embed Kuler : http://kuler.adobe.com/#themes/search?term=corporate%20flair IBM 한국 developer Works : http://www.ibm.com/developerworks/kr/library/dwclm/20100630/ TDD 동영상 : http://xper.org/LineReaderTdd/ Twtpoll : http://twtpoll.com/r/mwilg5 데드레커닝: http://www.g-matrix.pe.kr/feature/multi/deadreckoning.htm Git : http://namhyung.springnote.com/pages/3132772 Mecrurial : http://mercurial-korean-doc.googlecode.com/hg/hg.1.kor