프로그램은 왜 실패하는가?

1,076 views

Published on

아꿈사 스터디 - 프로그램은 왜 실패하는가?
2009.08

Published in: Technology, Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,076
On SlideShare
0
From Embeds
0
Number of Embeds
203
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

프로그램은 왜 실패하는가?

  1. 1. 프로그램은 왜 실패하는가<br />12장 Cause and Effect원인과 결과<br />아키텍트를 꿈꾸는 사람들 (http://andstudy.com)<br />현수명(soomong80@gmail.com)<br />
  2. 2. Cause 원인<br />Effect 결과<br />사건 A 가 사건 B 보다 먼저 일어나며<br />사건 A 가 일어나지 않으면<br />사건 B 도 일어나지 않을때<br />사건 A 를 원인 (cause) ,<br />사건 B 를 결과 (effect) 라고 부른다.<br />
  3. 3. 원인 그리고 대안의 세계<br />원인의 검증<br />인과관계의 예<br />실제 원인 찾기<br />원인 좁히기<br />차이 좁히기의 예<br />공통 문맥<br />디버깅에서의 원인들<br />
  4. 4. 실패하는 세계<br />통과하는 세계<br />
  5. 5. 역사속에서 원인을찾으려면 <br />어떻게해야할까?<br />과거로 돌아가서 <br />원인을 제거하고 <br />역사를 반복한다<br />
  6. 6. 원인을 제거하고 실제세계와<br />최대한 근접한 세계를 만들자!<br />Alternate world 대안세계<br />Real world<br />실패하는 세계<br />비실패<br />원인들<br />실패 <br />원인들<br />공통 문맥<br />Alternate world<br />통과하는 세계<br />즉 실제세계와 대안세계의 차이가<br />문제의 원인이 된다.<br />
  7. 7. <ul><li>원인 그리고 대안의 세계</li></ul>원인의 검증<br />인과관계의 예<br />실제 원인 찾기<br />원인 좁히기<br />차이 좁히기의 예<br />공통 문맥<br />디버깅에서의 원인들<br />
  8. 8. “주어진 무언가가 해당 실패의 원인인지를 어떻게 알 수 있을까?”<br />Cause!!<br />이것다음에, 따라서 이것 때문에<br />posthoc ergo propter hoc<br />지금 맥락에서 한 비정상 다음에<br />실패가 일어났다면 그 비정상이 <br />실패의 원인일 것이다.<br />
  9. 9. <ul><li>원인 그리고 대안의 세계
  10. 10. 원인의 검증</li></ul>인과관계의 예<br />실제 원인 찾기<br />원인 좁히기<br />차이 좁히기의 예<br />공통 문맥<br />디버깅에서의 원인들<br />
  11. 11. a = compare_value();<br />printf(“a = %d ”, a);<br />a = 0<br />어떤것도, 심지어 <br />명백해 보이는것도<br />믿어서는 안된다.<br />가설 : a 가 0 이라는 점이 a = 0 이 출력된 원인이다.<br />가설 : compare_value함수 수행결과가 0 일 것이다.<br />
  12. 12. 가설 : a 가 0 이라는 점이 a = 0 이 출력된 원인이다.<br />가설 : compare_value함수 수행결과가 0 일 것이다.<br />원인을 제거한 Alternate world 를만들자<br />a = compare_value();<br />a = 1;<br />printf(“a = %d ”, a);<br />a = 0<br />
  13. 13. 가설 : a 값에 관계없이 항상 a = 0 이 출력된다.<br />double a;<br />…<br />a = compare_value();<br />printf(“a = %d ”, a);<br />가설 : %d 가원인!<br />a = compare_value();<br />printf(“a = %f ”, a);<br />a = 1.5<br />
  14. 14. Alternate world를 만들어서 실험.<br />통과하는 세계<br />디버깅에서의 실험은 <br />인과관계를 증명하는 유일한 방법이다.<br />그럼 재현이 안되는 경우는?<br />
  15. 15. <ul><li>원인 그리고 대안의 세계
  16. 16. 원인의 검증
  17. 17. 인과관계의 예</li></ul>실제 원인 찾기<br />원인 좁히기<br />차이 좁히기의 예<br />공통 문맥<br />디버깅에서의 원인들<br />
  18. 18. 실패가 나타나지 않도록 <br />프로그램을 변경하는 방법은 많다.<br />그리고 각 변경은 <br />각각 하나의 실패원인을 가지고있으니<br />실패의 원인도 수없이 많다고 할수있다.<br /><ul><li>printf문 전체가 실패의 원인이다.
  19. 19. 코드 전체가 실패의 원인이다.
  20. 20. 전기,수학,컴퓨터의 존재자체가 원인이다.</li></ul>이건 좀-_-<br />
  21. 21. 그럼 실패의 실제 원인을 <br />어떻게 찾아내는가?<br />오컴의 면도날<br />Ockham’s Razor<br />어떠한 결과를 설명하는 이론이<br />여러 개 있다면 그중<br />가장 단순한 것을 고르라<br />두 원인 중 하나를 골라야 할때<br />그 대안세계가 실제세계에 <br />더 가까운 것을 선택하라<br />
  22. 22. <ul><li>원인 그리고 대안의 세계
  23. 23. 원인의 검증
  24. 24. 인과관계의 예
  25. 25. 실제 원인 찾기</li></ul>원인 좁히기<br />차이 좁히기의 예<br />공통 문맥<br />디버깅에서의 원인들<br />
  26. 26. 실패결과가 발생하지 않는 대안세계를 찾아낸다.<br />실제세계와의 초기 차이를 좁혀 나간다.<br />Alternate world를 찾기<br />통과하는 세계<br />어려운 것은 <br />대안세계의 실패에 관련된 다른행동이 나오게 만드는 <br />또 다른 차이를 식별하는 것이다.<br />그 차이를 점차 좁힘으로써 결국은 실제 원인을 찾게 된다.<br />
  27. 27. <ul><li>원인 그리고 대안의 세계
  28. 28. 원인의 검증
  29. 29. 인과관계의 예
  30. 30. 실제 원인 찾기
  31. 31. 원인 좁히기</li></ul>차이 좁히기의 예<br />공통 문맥<br />디버깅에서의 원인들<br />
  32. 32. 프리젠테이션 원격조정 프로그램<br />최근 upgrade 후 비정상종료 (이전 계정사용)<br />실험끝에 Alternate world 를 찾았음! (새로운 계정사용)<br />이전계정과 새로운 계정의 차이를 좁히기<br />Alternate world<br />새로운 사용자 계정으로<br />모든것을 새로 설정<br />Real world<br />프로그램 upgrade<br />(이전 계정설정)<br />
  33. 33. <ul><li>원인 그리고 대안의 세계
  34. 34. 원인의 검증
  35. 35. 인과관계의 예
  36. 36. 실제 원인 찾기
  37. 37. 원인 좁히기
  38. 38. 차이 좁히기의 예</li></ul>공통 문맥<br />디버깅에서의 원인들<br />
  39. 39. 두 세계에서 차이가 나지 않는 측면<br />Alternate world<br />통과하는 세계<br />Real world<br />실패하는 세계<br />Common Context<br />공통문맥<br />공통문맥은 실패원인이 아니다!<br />
  40. 40. <ul><li>원인 그리고 대안의 세계
  41. 41. 원인의 검증
  42. 42. 인과관계의 예
  43. 43. 실제 원인 찾기
  44. 44. 원인 좁히기
  45. 45. 차이 좁히기의 예
  46. 46. 공통 문맥</li></ul>디버깅에서의 원인들<br />
  47. 47. 입력<br />실패가 발생한 실행의 실제 입력과<br />실패가 발생하지 않는 가장 가까운 입력 <br />사이의 최소 차이이다.<br />상태<br />실패가 발생한 실행의 실제 프로그램 상태와<br />실패가 발생하지 않는 가장 가까운 상태 <br />사이의 최소 차이이다.<br />코드<br />실패가 발생한 실제 프로그램코드와<br />실패가 발생하지 않는 가장 가까운 코드 <br />사이의 최소 차이이다.<br />
  48. 48. <ul><li>원인 그리고 대안의 세계
  49. 49. 원인의 검증
  50. 50. 인과관계의 예
  51. 51. 실제 원인 찾기
  52. 52. 원인 좁히기
  53. 53. 차이 좁히기의 예
  54. 54. 공통 문맥
  55. 55. 디버깅에서의 원인들
  56. 56. 디버깅 사례</li></li></ul><li>Real world<br />실패하는 세계<br />해당화면 진입시 <br />폰비정상 종료<br />2일안에 해결못하면<br />큰일나는 상황<br />아무리 찾아봐도<br />코드에는 전혀 문제없음<br />
  57. 57. Alternate world<br />통과하는 세계<br />임의로 Thumbnail<br />안나오도록 수정하니 <br />문제발생 안함<br />이 대안세계는<br />너무 민망함<br />
  58. 58. class Thumbnail<br />{<br /> static map<key,thumb> m;<br /> ...<br />}<br />static map 에 무언가를 insert 하는순간 문제발생<br />시간이 얼마 없다. <br />일단 민망하지않은 대안세계부터 만들자<br />
  59. 59. class Thumbnail<br />{<br /> //static map<key,thumb> m;<br /> thumbMap.getInstance().m;<br /> ...<br />}<br />class ThumbMap <br />{<br />private:<br /> ThumbMap();<br />public:<br /> map<key,thumb> m;<br />}<br />static 대신에 <br />singleton class 로 변경<br />문제발생안함<br />
  60. 60. 일단 급한 일정을 넘기고<br />진짜 원인이 무엇인지 다시 분석<br />BaseChip 에서 STL 을 static 하게<br />사용할경우 문제가 있었음<br />

×