개발자는 "문제 해결 능력" 이 중요하다라는 말을 개발자라면 누구나 한번쯤은 들어봤을 것이다. 나 역시 많이 들었고, 문제 해결능력을 키우기 위해 알고리즘 문제나 시스템 디자인 문제를 주기적으로 풀며 다방면으로 노력해 왔다. 하지만 나의 문제 해결 능력이 발현되기 위해서는 선행되어야 할 게 있다는 사실을 깨달았고 이를 구독자들과 공유하고자 한다. 

 

실제로 문제 해결 능력은 언제 사용되고 있는가?

회사에서 개발을 하다보면 요구사항을 받게 되고 요구사항에 따라 개발을 하게 된다. 여기서 요구사항은 개발자에게는 문제이고 요구사항에 따라 개발하는 행위가 문제를 해결하는 것에 해당한다. 우리는 이런 식으로 평소에도 많은 문제들을 해결하고 있다. 그렇다면 유트브와 같은 스트리밍 플랫폼을 만든다고 가정해 보자. 여기서 '실시간 스트리밍 기능'과 같은 복잡한 기능을 구현해야 한다면, 이 문제를 잘 해결(구현)했다고 해서 그 개발자가 능력이 뛰어나다고 할 수 있을까? 필자가 최근 깨달은 것은 '아니다'이다. 단순히 구현만 잘 한다고해서 뛰어난 개발자라고 할 수는 없다. 중요한 것은 어떤 문제를 인지했는지에 있다. 뛰어난 개발자는 주어진 요구사항만 처리하는 데 그치치 않고 그 요구사항 뒤에 숨겨진 추가적인 문제를 인식하고 해결하는 능력을 갖추고 있다. 

 

그렇다면, 어떤 문제를 인지해야하는가?

실시간 스트림 기능 구현으로 돌아가서 생각해 보자. '영상 스트리밍 구현' 자체도 요구사항이지만, 이를 넘어 부가적인 문제가 존재한다. 예를 들어, 실시간으로 영상을 스트리밍 하려면 네트워크 상태에 따라 끊김 없이 동영상을 제공해야 한다. 즉, 어떻게 해야 네트워크 환경에 따라 끊김 없는 스트리밍을 제공할 수 있을까? 혹은, 사용자 수가 급격히 늘어나거나 서버가 장애를 겪었을 때 어떻게 대응할 것인가? 이런 추가적인 문제들이 개발자가 인지하고 스스로 정의해야 하는 부분이다.

 

문제가 정의되었다면 이후 문제를 해결하면 된다. 이때가 문제 해결 능력이 발현되는 구간이다. 예를 들어, 위와 같은 상황에서는 적응형 비트레이트(Adaptive Bitrate Streaming) 기술을 도입해 사용자의 네트워크 상태에 맞춰 비디오 품질을 동적으로 조정하도록 구현할 수 있고, 동영상 끊김 문제 외에도 서버의 과부하를 방지하고 전 세계 사용자에게 안정적인 서비스를 제공하기 위해 CDN을 사용하는 방법을 사용할 수 있다.

 

문제 정의를 잘하기 위해서는 어떻게 해야  할까?

트래픽이 많은 회사에 다니거나 서버 운영을 하다 보면 자연스럽게 다양한 문제를 마주하게 된다. 이러한 경험을 통해 문제를 인지하는 경우도 많지만, 모든 도메인에서 발생하는 문제를 직접 겪어보지는 못한다. 그렇기 때문에 추론하거나 창의력을 발휘해 문제를 정의하는 능력을 키워야 한다. 창의력을 발휘하려면 탄탄한 기본기가 필수적이다. 기본적인 기술 지식과 원리를 깊이 있게 이해하고 있어야, 개발자는 문제를 다양한 시각에서 바라볼 수 있으며, 창의적으로 문제를 스스로 정의할 수 있기 때문이다.

 

앞서 언급한 예시에서 지연 시간(latency)과 대역폭(bandwidth)의 개념을 이해하고 있었다면, 네트워크 상태가 불안정할 때 끊김 현상이 발생할 수 있음을 쉽게 예측할 수 있다. 특히, 지연 시간이 길어질 때는 끊김 없는 스트림을 제공하기 어려울 수 있음을 이해하게 되고, 이를 문제라고 인지할 수 있다.

 

결론

필자는 "문제를 정의할 수 있어야지 문제를 해결할 기회가 생긴다." 라고 생각한다. 따라서 우리는 문제 해결 능력 만큼이나 문제 정의 능력을 기르는데 집중해야 한다. 문제를 잘 정의하려면 추론 능력창의력이 요구되며, 이 두 가지 능력은 모두 탄탄한 기본기에서 비롯된다. 결국, 기본기를 충실히 다져야 좋은 개발자로 성장할 수 있을 것이다.

 

 
 

 

'의식의 흐름' 카테고리의 다른 글

리눅스 자격증 공부  (0) 2024.08.08

+ Recent posts