문제 해결 능력에 앞서 문제 정의 능력이 중요하다.

안녕하세요. 멘티가 쉬운 길만 찾는 개발자가 아닌, 어렵더라도 수준 높은 추론을 할 수 있는 개발자로 성장할 수 있도록 이끌어주는 F-Lab 입니다.

이 글은 개발자에게 필요한 능력인 “문제를 해결하는 능력” 이 무엇인지 정의하고, 이 능력을 키우려면 어떻게 해야하는지에 대해 다루고 있습니다.

문제 해결 능력이란 무엇일까?

“개발자는 문제 해결 능력이 중요하다”라는 말은 개발자들 사이에 많이 돌고 있는 말들 중 하나입니다. 그리고 이 얘기를 듣고 문제 해결능력을 키우고자 하는 개발자들 또한 많습니다.

하지만 “문제 해결 능력”이라는 것은 명확하게 와닿는 말이 아니기 때문에 어떤 것을 의미하는지 파악하기 어렵습니다. 그래서 단순히 문제 해결 능력을 알고리즘 문제 풀이 정도로만 알고 있는 경우도 흔하게 보이고 있습니다.

단순히 뜻만 풀어보자면 “문제를 해결하는 능력”이라는 것인데 사실 우리는 개발을 해나가면서 평소에 많은 문제들을 해결하고 있습니다.

예를 들자면 쿠팡과 같은 커머스를 만들면서 결제 기능을 구현해달라는 요구사항을 예로 들 수 있습니다. 이 기능은 결제 모듈 연동까지 필요한 복잡한 작업입니다.

많은 개발자들이 위의 예시처럼 여러 복잡한 요구사항들을 구현해달라는 문제를 해결해내고 있습니다. 그럼 위의 예시와 같은 문제를 곧잘 해결해내고 있는 사람은 문제 해결 능력이 뛰어난 개발자라고 볼 수 있을까요?

아쉽지만 이 기능을 구현한 것으로는 문제 해결 능력이 뛰어난 개발자라고 보기는 힘듭니다.

분명 결제 기능을 구현해달라는 요구사항을 잘 이행했는데 왜 이거로는 부족한 것일까요? 이러한 상황은 어떤 것을 문제로 인지했느냐에서 차이가 발생합니다.

애초에 지금 내가 마주친 문제는 무엇일까?

문제를 잘 해결하려면 애초에 내가 풀어야할 문제가 무엇인지 잘 정의해야합니다.

결제 모듈을 구현해달라는 요구사항을 받았을 때에도 이 요구사항 자체를 문제로 인지하는 경우가 많습니다. 하지만 이 요구사항에서 부가적으로 발생할 수 있는 추가 요구사항이 무엇인지를 개발자의 관점에서 스스로 도출해내야 합니다.

위에서 얘기했던 “결제 모듈 연동”도 부가적인 요구사항이라고 볼 수 있습니다. 하지만 여기서 끝내는 것이 아니라 여기서 또 한 단계 들어가서 요구사항을 도출해내야합니다.

외부 결제모듈 API를 호출하려면 네트워크 통신이 필요합니다. 즉 IO가 발생하는데 어떻게 해야 이 IO 작업을 성능에 지장을 주지 않을 수 있게 처리할 것인가? 또는 결제 모듈에 장애가 발생했을 때에는 어떻게 처리해야할까 등이 될 수 있습니다.

위의 예를 보면 결제를 구현해주세요 라는 1차원적인 문제에서 한 단계 더 깊이 들어가 결제 모듈 통신이 성능에 주는 영향을 덜 하게 하자라는 추가적인 문제를 정의했습니다. 즉 “문제 정의 능력”을 활용한 것이지요.

그럼 문제를 정의했으니 이제는 문제를 풀 차례입니다. 여기서 “문제 해결 능력”을 발휘해야하고 여러 추론 단계를 거쳐서 Non-Blocking I/O를 이용해 비동기로 처리하여 해결할 수도 있겠죠.

몇 가지 예를 더 들어보자면 아래와 같은 문제도 정의해볼 수 있습니다.

  • 돈이 걸려있기에 연산의 일관성이 중요할텐데 어떻게 해야 동시성 성능을 높히면서도 우리가 필요한 수준의 일관성을 확보할 수 있을까?
  • 여러 테이블에 연산을 해야할텐데 어떻게 해야 이 연산을 더 빠르게 수행할 수 있을까?
  • 무통장 입금, 카드결제 등 결제수단별로 처리 방법이 다를텐데 추상화를 잘 시켜서 코드 중복을 줄일 수 있지 않을까?

큰 회사에 다녀본 것도 아니고 이런 것들을 어떻게 아나요?

물론 트래픽이 많은 큰 회사에 다니다보면 어쩔 수 없이 문제에 당면하게 되어서 이런 문제들에 대해 자연스럽게 인지하게 되는 경우도 있습니다.

하지만 모든 사람이 큰 회사에서 이런 문제들을 경험해보기는 힘들기 때문에 “쿠팡 같은 큰 회사에서 저런 것을 직접 경험해본 것도 아닌데 내가 이런 문제가 있는지 어찌 아나요?” 라고 말할 수도 있습니다. 하지만 굳이 경험해보지 않더라도 저런 문제들은 창의력을 활용해 정의해볼 수도 있습니다.

그리고 창의력을 발휘하려면 기본기가 탄탄해야합니다. 많은 큰 기업들이 컴퓨터 사이언스 지식이 탄탄한 개발자를 선호하는 이유도 그 때문입니다. 어떤 서적에 나오는 말을 인용하자면 “진정한 의미의 창의성이란 정석이 몸에 배고 난 후의 자유로운 응용”이라고 할 수 있습니다.

제일 처음 언급했던 IO 문제는 자바 기본 서적에 나오는 스레드와 IO에 대해서 깊히 공부해놨다면 떠올려낼 수 있는 문제입니다. 또한 결제수단별로 다른 로직들의 공통화 같은 경우는 객체지향 이론을 잘 공부해놨다면 떠올릴 수 있는 문제이고요. 또한 성능과 일관성의 트레이드오프 문제는 데이터베이스의 트랜잭션과 락 혹은 병렬 프로그래밍을 공부해보면 떠올릴 수 있었을겁니다.

이렇게 기본기를 잘 닦아놨다면 많은 문제들에 대해 창의력을 발휘해 문제를 정의하는 것이 가능해집니다.

기본기는 정말 중요합니다.

요즘은 블로그와 유튜브 등 정보를 접할 수 있는 수단이 많아졌기 때문에 자바에 대한 이론이 없더라도 문법만 익혀서 개발이 가능합니다. 즉 컴퓨터의 동작원리 서적이나 자바 서적을 읽지 않고서도 비즈니스 코드 구현이 가능하다는 말입니다. 하지만 이에 대한 역효과로 이론의 부재로 인해 문제 정의 능력이 부족하여 사이드이펙트를 만들어낼 가능성이 높은 코드를 작성하게 된다는 점도 생기고 있습니다.

그래서 이렇게 세세한 부분까지 창의력을 발휘하여 문제를 정의할 수 있는 추론할 수 있는 개발자가 되려면 기본기를 꼼꼼하게 공부해둬야합니다. 또한 자신이 지금 사용하고 있는 기술에 대해서도 서적이나 공식 문서를 읽어가면서 잘 알고 사용해야 합니다.

그렇기 때문에 “개발자는 평생 공부해야 한다”라는 말이 나올 정도로 필요한 학습량이 아주 많은 것이고, 이 것이 F-Lab“단기간에는 제대로 된 개발자로 성장하기 힘들다”라고 주장하는 이유이기도 합니다.

마무리

결론을 지어보자면 “문제 해결 능력을 발휘하려면 애초에 문제부터 잘 정의해야 한다. 내가 풀어야 할 문제들을 정의하는 것은 창의력이 중요하고 이 창의력은 기본기에서 나온다” 입니다.

기본기에 대한 지식을 많이 학습하면서, 요구사항 하나하나를 구현할 때마다 여기서 생길 수 있는 문제는 무엇일까?라는 고민을 해보시면 점점 문제를 잘 정의하실 수 있으실 것이고, 깊게까지 접근한 수준 높은 문제를 해결하는 개발자가 되실 수 있으실겁니다.

읽어주셔서 감사합니다.

홍보

멘티 모집

F-Lab에서는 현재 멘티들을 모집하고 있습니다.

멘토링 대상은 취업준비생, 현직 개발자까지 개발에 관심있는 모든 분입니다. 멘토님들의 수준이 매우 높기 때문에 현업에서도 경험하기 힘든 내용들에 대해 전달받을 수 있기 때문에 현직에 계시더라도 다양한 깊은 스킬들을 제시받으실 수 있습니다.

F-Lab에서 멘토링 받기를 희망하시는 분들은 아래의 홈페이지에서 내용을 읽어보신 다음 신청해주시면 감사하겠습니다.

홈페이지 : https://intro.f-lab.kr

멘토 모집

F-Lab과 함께 “추론할 수 있는 개발자”를 양성해나갈 멘토님들을 모집하고 있습니다.

관심이 있으신 분들은 F-Lab 멘토 채용 페이지를 확인해보시고 멘토로 지원해주시면 감사하겠습니다.