개발자에게는 어떤 능력이 필요한가?

문제 해결 능력이란 무엇인가?

John Cho
5 min readMay 31, 2021
Photo by NeONBRAND on Unsplash

예전부터 느꼈던 점이지만 채용 단계에서 개발자에게 필요하다고 느끼는 역량과, 개발자 본인이 필요하다고 느끼는 역량은 차이가 있다고 생각한다. 내 글이 당연히 정답이라고 생각하기에는 어려울 수 있겠고, 내 주관이 포함되어 있는 사실은 반드시 알아주었으면 한다.

문제 해결 능력

많은 사람들이 문제 해결 능력을 알고리즘과 동일한 의미로 생각하는 경향이 있다. 하지만 문제 해결 능력은 알고리즘과 동일한 의미라 보기 어려우며, 문제 해결 능력에 알고리즘에 대한 이해도를 포함할 수는 있으나 알고리즘이 문제 해결 능력의 전부라고 볼 수는 없다.

먼저 문제 해결 능력에서 첫째로 중요한 건 명확한 요구사항 분석을 통해 문제 도출 해내기이다. 어떤 기능이나 서비스에 대한 요구사항이 생겼을 때, 대부분의 경우에는 그 기능이나 서비스가 왜 필요한가에 초점이 맞춰져 있고 이 문제를 내가 어떻게 해결해야하는가 개발자의 역량이기 때문이다.

그래서 나는 문제가 무엇이었으며, 왜 이 문제를 해결하려고 하였는가? 이 문제는 어떻게 해결할 수 있는가에 집중하는 사람을 더 개발자로서 높게 평가한다. 개발에는 특히 완전히 정해진 정답이라는 게 없기 때문에 더욱 이 능력은 중요하다.

또한 시점에 따라서도, 개발팀의 구성에 따라서도, 현재 내 상태에 따라서도 다르고, 그런 사실에 대해서는 면접관이 인지하고 있는 경우가 더 많기 때문에 오히려 최대한 솔직하게 본인이 알고 있는 사실을 가감없이 이야기하는 게 중요하다.

문제를 명확하게 인지하고 난 후에는 문제에 어떻게 접근하는 지가 중요하다. 내가 지금 해결할 수 있는 문제인 지, 해결하지 못한다면 어떤 식으로 접근하는 게 좋을 지, 해결할 수 있다면 어떤 식으로 접근하는 게 좋을 지, 현재 상황에서 가장 좋은 선택지는 무엇인 지에 대해서 결정할 수 있어야 한다.

개인적으로 좋아하는 책 중 하나인 리팩토링에서는 ‘코드를 고쳐 쓰는 것보다 다시 구현하는 게 더 빠르다면 다시 구현하는 게 더 나은 선택일 수 있다’ 라는 표현이 있다. 그 말대로 다른 사람들이 이야기하는 좋은 방식과 현재 내 상황에서 좋은 방식 사이에는 차이가 있을 수밖에 없다.

성장 가능성

경력에 상관없이 성장하고자 하는 의지, 그리고 그 의지를 바탕으로 성장을 이루어내는 게 굉장히 중요하다. 의지가 있다는 사람은 많지만, 그 의지를 바탕으로 성장을 이루어내는 사람은 굉장히 적다. 무엇이든 마음을 먹는 것까지는 쉽지만, 마음을 먹어서 실체가 있는 무언가를 만들어내는 행위는 굉장히 어렵다.

내가 바라보는 성장 가능성이라는 건 실천해내는 사람에 더 가깝다. 여기서 말하는 실천도 ‘프로젝트 몇 개 해봤다’ 같은 게 아니라, 내 현재 상태에서 어떤 문제를 해결하기 위해 이런 프로젝트들을 해보았더니 이런 점들을 배웠고, 이런 점들이 나에게는 약하다는 점을 느꼈다. 그래서 이런 식으로 처리를 하게 되었는데, 코드가 동작은 하지만 이런 부분에서는 개선이 가능해보이나 아쉬운 점이 있어 피드백을 들어보고 싶다. 예를 들어 내가 아쉽다고 느낀 건 이런 부분이다.

학습하는 방법에 대해서는 여러 방법론과 철학이 있지만 그 또한 다른 사람의 정답이니 그게 반드시 내 정답이라고 말하기는 어렵다. 어떤 면을 공부하면서 지속하여 피드백을 얻고 거기서 성장해내는 것, 그 자체가 개발자로서의 성장 가능성이라고 나는 생각한다.

기초 개발 지식

특히 FE 분야에서는 React가 굉장히 강세를 보이면서 React를 바탕으로만 FE 개발을 해 본 사람도 많다보니 반대로 JS 자체에 대한 지식이 부족하거나, 심지어 React 자체도 어떻게 활용해야 하는 지 모르는 경우가 많다.

다음 질문에 답하기 어렵다면 더 공부가 필요하다.

  • React를 왜 사용하나요? 어떤 이점이 있나요?
  • JavaScript 엔진은 어떻게 동작하나요?
  • JavaScript 만 가지고 있는 언어적 특성에는 어떤 게 있을까요?
  • DOM Event에 대해서 이해하고 있나요?
  • 웹 표준은 무엇이며 왜 준수해야하나요?
  • 웹 접근성은 무엇이며 웹 접근성 개선을 위해서는 어떻게 해야할까요?
  • 자바스크립트의 비동기 프로그래밍에 대해서 말해주세요.

앞서 이야기했지만 언어 특성에 대해 이해를 깊이 하는 것만이 능사는 아니다. 하지만 적어도 문제를 보았을 때 ‘이 문제는 어떻게 해결해야하는가?’ 를 알아낼 때 언어 특성을 바탕으로 해결책을 찾아낼 수 있어야 한다.

성능 문제가 생겼을 때 메모리를 어떻게 살펴보아야 하는 지, 어느 지점에서 연산이 병목이 걸리는 지, 현재 메모리가 쓸 데 없이 쓰이는 곳은 없는 지, 반복해서 렌더링이 발생하는 곳은 없는 지, 현재 데이터 파이프라인은 어떤 식이고 데이터 포맷은 어떻게 처리하고 있는 지, 백엔드 구조는 어떤 지 등등.

기초가 기초에서 끝나지 않는다. 나는 여전히 배우고 있고, 앞으로도 배우겠지만 배우기 위한 근간이 기초일 뿐, 기초가 점점 더 깊어지고 있다는 생각을 하고 있다. Advanced 라고 부르는 영역일 수록 그 만큼 기초가 깊어져야 한다.

Back to the Basics, 언제나 기초로 돌아가는 게 좋다.

많이 실패해도 괜찮다.

개발은 적어도 실패해도 괜찮다. 실패에서 배울 점이 많으면서 동시에 개발은 실패한다고 해서 리스크가 크지 않기 때문이다. React로 안해봐도 괜찮고, Redux를 써보지 않아도 괜찮다.

지금 중요한 건 왜 이렇게 하는가에 대해서 이해하는 거고, 그 이해를 바탕으로 향후 어떻게 문제 해결에 접근할 지를 결정하는 것이다. 남들이 다 하니까 이렇게 한다 라는 답은 정말 최악의 답변이라고 생각한다. 참고로 Stack overflow를 기준으로 하면 전세계에서 가장 많이 쓰이는 라이브러리는 여전히 jQuery다.

여러 경험을 해보고, 본인이 판단했을 때 거기서 가장 적절한 정답을 찾아내는 것이 실패하는 과정이며 그를 바탕으로 성공에 도달하는 것이다. 그러니 많이 실패해보기를 바란다.

--

--