개발자는 문제 해결 능력에 앞서 문제 정의 능력이 중요하다.
F-Lab : 상위 1% 개발자들의 멘토링
개발자에게 필요한 능력인 “문제를 해결하는 능력” 이 무엇인지 정의하고, 이 능력을 키우려면 어떻게 해야 하는지 알아보겠습니다.
문제 해결 능력이란 무엇일까?
“개발자는 문제 해결 능력이 중요하다”라는 말이 개발자들 사이에서 유명하죠. 그만큼 문제 해결능력을 키우고자 하는 개발자가 많지만, ‘문제 해결 능력’이라는 말을 명확하게 이해하는 것은 어렵습니다. 문제 해결 능력을 단순히 알고리즘 문제 풀이 정도로만 알고 있는 경우를 흔하게 볼 수 있습니다.
그러나 우리는 평소 개발을 하면서 많은 문제들을 해결하고 있습니다. 쿠팡과 같은 커머스를 만든다고 가정하면 결제 기능 구현은 결제 모듈 연동까지 필요한 복잡한 작업입니다. 이런 문제를 곧잘 해결해 내고 있는 사람은 문제 해결 능력이 뛰어난 개발자라고 볼 수 있을까요?
아쉽지만 이 기능을 구현한 것으로는 문제 해결 능력이 뛰어난 개발자라고 보기는 힘듭니다. 어떤 것을 문제로 인지했느냐에서 차이가 발생하기 때문이죠.
내가 마주한 문제는 무엇일까?
문제를 잘 해결하려면 내가 풀어야 할 문제가 무엇인지부터 잘 정의해야 합니다. 결제 모듈을 구현해달라는 요구사항을 받으면 이것 자체를 문제로 인지하는 경우가 많습니다. 하지만 부가적으로 발생할 수 있는 추가 요구사항이 무엇인지를 개발자의 관점에서 스스로 도출해 내야 합니다.
‘결제 모듈 연동’도 부가적인 요구사항이라고 볼 수 있습니다. 하지만 여기서 끝내는 것이 아니라 여기서 한 단계 더 들어가서 요구사항을 도출해 내야 합니다. 외부 결제 모듈 API를 호출하려면 네트워크 통신이 필요합니다. 즉 IO가 발생하는데 어떻게 해야 이 IO 작업을 성능에 지장을 주지 않을 수 있게 처리할 것인가 또는 결제 모듈에 장애가 발생했을 때에는 어떻게 처리해야 할까 등이 될 수 있습니다.
위의 예를 보면 결제를 구현해 달라는 1차원적인 문제에서 한 단계 더 깊이 들어가 결제 모듈 통신이 성능에 주는 영향을 덜자는 추가적인 문제를 정의했습니다. 즉 ‘문제 정의 능력’을 활용한 것이지요.
그럼 문제를 정의했으니 이제는 문제를 풀 차례입니다. 여기서 ‘문제 해결 능력’을 발휘해야 하고 여러 추론 단계를 거쳐서 Non-Blocking I/O
를 이용해 비동기로 처리하여 해결할 수도 있겠죠.
아래와 같은 문제도 정의해 볼 수 있습니다.
- 돈이 걸려있기에 연산의 일관성이 중요할 텐데 어떻게 해야 동시성 성능을 높이면서도 우리가 필요한 수준의 일관성을 확보할 수 있을까?
- 여러 테이블에 연산을 해야 할 텐데 어떻게 해야 이 연산을 더 빠르게 수행할 수 있을까?
- 무통장 입금, 카드 결제 등 결제수단별로 처리 방법이 다를 텐데 추상화를 잘 시켜서 코드 중복을 줄일 수 있지 않을까?
큰 회사에 다녀본 것도 아니고 이런 것들을 어떻게 아나요?
트래픽이 많은 회사에 다니다 보면 어쩔 수 없이 문제에 당면하게 되어 자연스럽게 인지하게 되는 경우도 있습니다.
하지만 모든 사람이 큰 회사에서 문제를 경험해 보기는 힘들기 때문에 “쿠팡 같은 큰 회사에서 저런 것을 직접 경험해 본 것도 아닌데 내가 이런 문제가 있는지 어찌 아나요?”라고 말할 수도 있습니다. 하지만 굳이 경험해보지 않더라도 저런 문제들은 창의력을 활용해 정의해 볼 수도 있습니다. 그리고 창의력을 발휘하려면 기본기가 탄탄해야 합니다. 많은 큰 기업들이 컴퓨터 사이언스 지식이 탄탄한 개발자를 선호하는 이유도 그 때문입니다. 한 서적에 나오는 말을 인용하자면 “진정한 의미의 창의성이란 정석이 몸에 배고 난 후의 자유로운 응용”이라고 할 수 있습니다.
제일 처음 언급했던 IO 문제는 자바 기본 서적에 나오는 스레드와 IO에 대해서 깊이 공부했다면 떠올려낼 수 있는 문제입니다. 또한 결제수단별로 다른 로직들의 공통화 같은 경우는 객체지향 이론을 잘 공부했다면 떠올릴 수 있는 문제이고요. 또한 성능과 일관성의 트레이드오프 문제는 데이터베이스의 트랜잭션과 락 혹은 병렬 프로그래밍을 공부해 보면 떠올릴 수 있었을 겁니다. 이렇게 기본기를 잘 닦으면 많은 창의력을 발휘해 문제를 정의하는 것이 가능해집니다.
기본기는 정말 중요합니다.
요즘은 블로그와 유튜브 등 정보를 접할 수 있는 수단이 많아졌기 때문에 자바에 대한 이론이 없더라도 문법만 익혀서 개발을 할 수 있습니다. 즉 컴퓨터의 동작원리 서적이나 자바 서적을 읽지 않고서도 비즈니스 코드 구현이 가능합니다. 하지만 이론의 부재로 인해 문제 정의 능력이 부족하여 사이드이펙트를 만들어낼 가능성이 높은 코드를 작성하게 된다는 점도 생기고 있습니다.
그래서 이렇게 세세한 부분까지 창의력을 발휘하여 문제를 정의할 수 있는 추론할 수 있는 개발자가 되려면 기본기를 꼼꼼하게 공부해야 합니다. 또한 자신이 지금 사용하고 있는 기술에 대해서도 서적이나 공식 문서를 읽어가면서 잘 알고 사용해야 합니다.
“개발자는 평생 공부해야 한다”라는 말이 나올 정도로 학습량이 아주 많고, 이것이 F-Lab이 “단기간에 제대로 된 개발자로 성장하기 힘들다”라고 주장하는 이유이기도 합니다.
맺음말
마무리하겠습니다. “문제 해결 능력을 발휘하려면 문제부터 잘 정의해야 한다. 내가 풀어야 할 문제들을 정의하는 것은 창의력이 중요하고 이 창의력은 기본기에서 나온다” 이 말을 잘 기억하세요.
기본기에 대한 지식을 많이 학습하면서, 요구사항을 구현할 때마다 여기서 생길 수 있는 문제는 무엇일까?라는 고민을 해보시면 문제를 잘 정의하실 수 있으실 것이고, 깊고 수준 높은 문제를 해결하는 개발자가 되실 수 있으실 겁니다.
읽어주셔서 감사합니다.
이 컨텐츠는 F-Lab의 고유 자산으로 상업적인 목적의 복사 및 배포를 금합니다.