문제 이해하기

문제 이해하기

  • 오류나 문제는 언제나 발생함

  • 문제를 잘 해결하면 생산성이 늘어나게됨

  • 대부분의 문제 해결 기술들은 개인 경험과 같이 암묵지와 같은 노하우에 기반을 두고있음

    • 문제를 해결하는데 상당한 수준의 개인적인 경험이 필요하고, 이미 겪은 문제들을 통해 유사 문제들을 빠르게 파악할 수 있음

  • 프로덕션 환경에서 디버깅 도구를 사용할 수 없기 때문에 더 보편적인 방법들을 배우는것도 중요

  • 문제를 해결하는데 개인적인 경험을 제외한, 적절히 사용할 수 있는 기술들을 알아보자

문제를 이해하는 기술

이해하기

문제를 해결하려면, 먼저 문제를 이해해야한다.

  • 왜 제데로 동작하지 않는지 이해하지 못한다면, 일단 그 이유를 이해하는데 주력해야함

  • 코드를 이해한다면 문제를 더 쉽게 해결할 확률이 높아짐

  • 문제가 발생하면, 먼저 그 문제가 왜 일어나는지 이해하려고 해야함

    • 대게는 뭐가 문제인지 어느정도 짐작하고 있을 것

    • 예측을 통해 현재 문제를 실험해보고, 실험 결과와 예측을 비교하는 과정을 문제가 이해될 때까지 반복

  • 작업의 목적이 문제를 해결하는것이 아니라 문제를 제데로 이해하는 것

단순화

일부 코드를 제거하면 문제가 사라질 수 있는지 생각해보기

  • 코드를 단순하게 만듦으로써 생각보다 많은 문제를 해결할 수 있음

  • 단순함을 유지하기 위해서는 소프트웨어 공학적인 부분(클린 코드, 설계 등)을 알아야함

  • 코드 정리를 통해 문제를 해결할 수 있는지 항상 고민해보기

고무오리 디버깅

만일 문제에 대해 아무것도 떠오르지 않는다면?

  • 문제를 설명하는 과정에서 새로운 통랓렭을 얻을 수 있음

  • 동료들에게 도움을 요청해서, 문제를 설명해보는것도 도움이 됨 (없다면 고무오리를 준비하자)

시간 관리 & 휴식

시간을 관리하지 않으면 한 가지 문제에 너무 오랫동안 매달리게되고, 생각의 범위가 좁아지게됨

  • 한 가지 문제에 대해 최대 25분을 할당하고, 이 시간이 지나도록 진척이 없으면 휴식을 취하자.

  • 쉴 때는 최대한 컴퓨터와 멀리 떨어져서, 뇌에서 다른 생각이 떠오르도록 준비

  • 일시적으로 문제에서 마음이 벗어나 새로운 관점을 가지게하는데 충분함


결함

결함을 해결하는데 있어서 가장 어려운 부분은 결함을 이해하고 재현하는것

  • 결함의 수를 줄일 수는 있지만, 결함을 없앨수는 없음

  • 자신에게 도움이 되는 방향으로, 결함이 쌓이게 두지 않기

  • '나중에 처리'하겠다며 미뤄두지 말자. '나중'은 절대 안한다와 같은 말

결함을 테스트로 재현하기

  • 무엇이 문제인지 이해했다고 생각이 든다면 실험을 해봐야 한다.

  • 가설을 세우고, 이를 바탕으로 테스트 케이스를 작성

  • 실제로 테스트를 실행했을 때 테스트가 실패한다면 가설이 검증된 것

    • 또는 테스트가 성공한다면 가설이 틀렸다는 의미, 검증될 때 까지 이 과정을 여러번 반복

  • 테스트가 실패하면, 이제 테스트가 통과되도록만 만들면됨

  • 결함을 고치는 것 자체는 쉽지만, 한 번 했던 실수는 다음에도 발생할 수 있기 때문에 이전의 버그가 다시 발생하는 회귀버그를 방지하는것이 중요

Last updated