읽는 시간: 9분
이 글은 내가 토스에 약 4년 정도 재직하면서 얻은 문제 해결력에 대해 간략하게 두서없이 휘갈겨 쓴 내용이다.
ㅤ
개발자는 대개 문제를 푸는데 흥미를 느끼죠. 하지만 문제를 "잘 푼다"
는 것은 어떤 의미일까요? 최고의 해결사(Best Solver)
란 어떤 모습이라고 생각하시나요?
이 글에서는 제가 생각하는 문제 해결
에 대해 다뤄보려 합니다. 특히 "올바른 문제 해결"이 개발자의 성장과 어떤 관계가 있는지 이야기하고자 해요. 성장에 관심이 있는 개발자라면 꼭 한번 읽어 보시길 추천해요!
개발자들은 문제 해결 그 자체를 좋아하는 것 같아요. 그래서 몇몇 개발자들은 어떤 문제를 보게 되면 일단 풀고 싶어지는 경향이 있어요.
'어? 저거 저렇게 하면 풀릴 것 같은데,,?'
코드를 변경하고 동작하는지 아닌지 확인해보고, 안되면 왜 안되는지 알아보고, 잘 되면 왜 되는 건지 알아봐요. 문제 푸는 걸 좋아하는 개발자를 넘어서 진짜 문제를 잘 푸는 개발자란 어떤 모습일지 상상해보면서 읽어봐요!
ㅤ
Best Solver 라면 문제를 탁월한 방식으로 다뤄야하는데, 지금부터 제가 생각한 방법을 하나씩 소개드릴게요.
문제를 처음 맞이하는 순간에 필요한 건 명확한 요구사항의 수집이에요.
요청자가 요구사항을 명확히 설명하지 않으면 해결해야 할 문제를 오해할 수 있거든요. 안타깝지만 이 문제는 요청자가 맥락을 숨긴 채로 요청해도 발생할 수 있어요. 따라서 우리는 요청자의 문제를 문자 그대로 받아들이지 말고 요청자가 정말 원하는 것이 무엇인지 의심하고 깊게 파악하는 것이 중요해요.
다음으로는 풀고자 하는 "문제의 명확한 정의"가 필요해요. 여기서 중요한 건 문제를 풀 수 있는 형태로 정의하는 것이에요. 대개 복잡한 문제는 다양한 맥락이 얽혀 있기 때문에, 문제를 구체적으로 정의하기 어렵고 어떻게 풀어야 할지 알기 어려워요.
이 때 문제를 추상적으로 정의하면, 오히려 해결 방법이 모호할 수 있기에, 풀기 쉬운 형태의 구체적인 키워드로 정의하는 것이 좋아요. 예를 들면, "웹페이지 성능이 구리다"보다는 "초기로딩 속도가 느리다."가 더 좋은 문제 정의예요. 이를 이용하면 해결하고자 하는 문제가 초기로딩 이라는 걸 명확하게 정할 수 있어요.
이 "문제가 완전히 해결된 상황을 상상"해 보는 것도 좋아요. 이 문제를 해결했을 때 시스템이나 업무에 어떤 변화가 일어날지, 이 문제가 실제로 풀어야만 하는 문제인지 혹은 단순한 불편사항에 불과한 건 아닌지 예측해보세요. 그리고 이 문제가 그대로 유지될 때와의 상황을 비교해보면, 문제 해결의 필요성이 더 명확해질 수 있어요. 만약 이 문제를 풀어도 임팩트가 크지 않다면, 과감하게 당장 더 중요한 일을 하러 떠나세요!
표면적으로 드러나는 증상만을 보고 해결하면, 시간이 지나 비슷한 문제가 다시 나타날 수 있어요. 이를 방지하려면 문제의 근본 원인을 탐색하고 그 뿌리를 찾는 게 중요해요. 이 과정에서는 반드시 '왜?'라는 질문을 하게 될거에요. 그때 피하지 말고 궁금한 내용을 하나씩 알아가봐요. 근본 원인을 찾는다면, 문제를 해결할 뿐만 아니라 재발 방지도 챙기면서 비슷한 문제를 해결하는 역량도 기를 수 있어요. 마치 운동하면 근육이 성장하는 것 처럼 말이죠!
ㅤ
그렇다면, 그냥 문제 푸는 것과 "잘 풀기"는 어떻게 다를까요? 저는 이를 3단계로 나누어 생각해보기로 했어요.
1단계는 "일단 빨리 해결하기"입니다. 문제의 시급도와 난이도에 따라 1단계 수준에 맞게 처리할 수 있을 것 같아요. 가장 중요한 건 동작하는 코드입니다.
e.g.) 뭔진 모르겠지만 구글링을 통해 알아낸 대응책을 복붙한다.
그 다음 수준의 문제 해결 방식은 근본적인 문제를 박멸하는 것 입니다. 더 이상 같은 문제는 발생하지 않게되어 시스템이 안정화되고 앞으로의 미래에 리소스를 투자할 수 있어 발전 가능성을 높일 수 있습니다.
e.g.) 오류 메시지를 분석하고 어떤 컨텍스트의 몇 번 라인 어떤 변수에 문제가 생겼다를 알 수 있다.
2단계를 여러번 하다보면 결국 어려운 문제들이 유형화가 되면서 어렵지 않게 된다.
다시 말하자면, 문제를 제대로 푸는 것은 결국 학습과 다를바가 없어요. 즉 업무를 제대로 해내는 것이 바로 학습이자 성장이에요.
ㅤ
문제를 더 잘 풀기 위해서는 단계별 성장이 중요합니다. 일단 구글링하며 문제를 해결해왔다면 이제는 2단계인 근본적인 문제 박멸하기에 집중해보면 어떨까요?
ㅤ
ㅤ1) 문제를 어떤 식으로 접근할지 정리하고
ㅤ2) 그 문제를 정의하며
ㅤ3) 문제가 해결되는 조건을 명확하게 세우고
ㅤ4) 해결하기 위한 전략을 수립하고
ㅤ5) 수립된 전략의 일정을 세밀하게 예측하고
ㅤ6) 일정이 지켜지기 어려운 리스크를 관리하기 위해 작업을 쪼개고
ㅤ7) 문제 해결의 결과에 대해서 평가하는 방법을 만들어 문제 종결 조건을 세우고
ㅤ8) 문제 해결 과정에서 앞으로 더 빨리 문제를 해결하기 위한 교훈을 얻기위해 회고하기
이렇게 빠름을 챙기면서 동시에 제대로 문제를 풀어보고 싶다면?
지금까지 정의된 어려운 문제를 많이 풀어봤고, 앞으로 더 많은 문제를 풀고 싶다면?