////
Search
Duplicate
😋

2. 문제해결

1. 재현 방법을 찾아라

문제가 발생했을 때, 해당 특정 상황을 재현할 수 있어야 한다. 문제의 답을 내렸다하더라도 그 상황을 재현하지 못한다면 완전히 해결했다고 볼 수 없다.
새로운 문제를 해결할 땐, 테스트 케이스를 충분하게 도출하여야 해당 문제를 올바르게 문제를 해결한 코드를 작성할 수 있다.
문제를 재현하는 과정의 비용을 낮춰야 한다. 즉 테스트 범위를 좁혀 작은 범위에서 테스트가 가능하게 해야 한다. 범위가 커지는 경우, 테스트 비용이 많이 든다.

2. 문제를 풀기 위한 기술

문제를 해결하기 위한 방법을 선택하는 것보다 문제를 정의하는 것이 먼저가 되어야 한다. 소잡는 칼로 닭잡지 말라는 뜻이다.
기술을 선택함에 있어서도 맹목적인 끌림을 너무 신봉해서도 안 된다. 새로운 것이 좋은 것이 아니라 적합한 것이 좋은 것이다.
우리가 던져야 할 중요한 질문은 “어떤 기술로 문제를 풀었는가?”가 아니라 “이 문제를 풀기 위해서는 어떤 기술이 필요한가?”이다.

3. 서비스 상태에 대한 직감

소프트웨어를 배포했다고 끝이 아니다. 자원 사용량과 로그를 살펴보면서 문제가 없는지, 점진적으로 개선시켜나갈 부분을 찾아 개선시킬 수 있어야 한다.
소프트웨어를 모니터링하면서 메모리가 더 필요한지, 디스크가 부족하지는 않은지, 오류 로그는 없는지, 자원 분배는 잘 되고 있는지 등을 끊임없이 직감적으로 간파하고 지속해서 개선해나가야 한다.

4. 문제를 외면하지 마라

문제가 발생했을 때, 이를 외면하지 마라, 문제해결에 적극적인 태도를 보이자. 문제를 빠르게 해결하는 개발자일수록 문제를 만들어내지 않은 개발자에 가까워질 수 있다.
문제를 해결할 때, 도움을 청해야 한다면 역지사지의 마음으로 도움을 청하자. 상대가 도움을 주고싶게끔 충분히 맥락을 제공해서 도움을 받자.

5. 고장률 제로라는 목표의 함정

고장률 제로가 아닌 다음 세가지를 서비스의 목표로 삼는 것을 추천한다.
신속한 장애 감지 - 사용자가 알기 전 또는 거의 동시에 능동적으로 고장을 알아차릴 수 있는지
수준 높은 장애의 극복 - 사용자에게 고장에 대한 적절한 피드백을 주고 빠른 시간 안에 문제를 특정하여 수정할 수 있었는지
동일한 유형의 장애가 재발하지 않는 것 - 이전에 발생했던 장애가 다시 발생했는 지 여부
이와 같은 목표가 설정된다면 개발자들은 좀 더 빠르게 고장을 감지하기 위한 여러 가지 장치를 하게 될 것이고, 좀 더 수준 높게 고장을 극복할 수 있도록 시스템을 개선해 나갈 것이다.