나는 프론트엔드를 안다고 말할 수 있을까?
이번 포스팅에서는 개발보다는 약간 철학적인 고민 이야기를 해보려고 한다. 사실 이 고민은 필자가 처음 개발을 시작할 때부터 가지고 있던 고민인데, 아직도 해답을 찾지 못했던 질문이기에, 이번 포스팅은 필자의 생각을 제시하는 것이 아니라 질문을 던지는 느낌으로 끄적여볼까한다.
필자가 개발을 시작하고 나서 6년 동안이나 하고 있는 이 고민은 바로 “안다는 것은 무엇인가?”이다.
사실 필자가 이런 고민을 하게 된 이유는 주변 개발자들의 평가로부터 출발한다. 약 5년 정도 여러 조직에서 프론트엔드 개발자로 일을 하게 되면서 다양한 동료들의 평가나 피드백을 받을 수 있었는데, 그 중 감사하게도 필자를 높게 사주시는 몇몇 분들이 “에반은 프론트엔드를 잘 한다”라는 평가를 해주셨을 때 도저히 자신있게 “아유 그럼요”라는 말을 할 수가 없었기 때문이다.
그 이유는 단순하게도 필자가 스스로 프론트엔드 개발을 잘 못한다고 생각하기 때문이다. 그리고 다른 사람들이 결정하는 주관적 가치에 대한 신뢰가 없기 때문이기도 하다. 필자는 누가 봐도 인정할 수 있을 정도의 객관적인 가치를 가진 “잘 하는 개발자”가 되고 싶었고, 지금도 바라고 있다.
물론 사람마다 기준은 다르겠지만, 객관적인 기준의 “잘 한다”라는 것은 어떤 지식에 대해 통달했다는 의미라고 생각한다. 하지만 필자가 프론트엔드 개발에 통달했냐고 묻는다면 대답은 당연히 “No”다. 아직도 모르는 것이 너무 많고, 매일 새로운 문제에 쩔쩔매며 구글신에게 기도드리는 일상을 보내고 있기 때문이다.
그래서 필자는 6년 동안이나 “진정한 앎이란 무엇인가?”에 대한 고민을 하고 있다.
나는 잘 하는 개발자”였다”
사실 필자도 처음부터 이런 고민을 했던 것은 아니였다. 지금 생각해보면 상당히 우습고 거만하지만 처음 개발을 시작할 때는 스스로 실력이 좋고 학습 속도가 굉장히 빠른 편이라고 생각하고 있었다.
2015년 당시 필자는 사운드 엔지니어로 어떤 연예기획사에서 일을 하고 있었는데, 그때 회사에서 만난 동료와 함께 어떤 제품을 만들고 싶다는 이야기를 나누게 되었다.
하지만 당시 필자와 그 친구는 웹 개발에 대한 지식이 너무나도 부족했기에 가진 인맥을 총동원해서 이 제품을 함께 만들 친구들을 구하게 되었고, 그게 바로 필자가 지금 6년째 활동하고 있는 토이 프로젝트 팀인 루비콘의 시작이다.
당시 이 팀에서 필자가 맡게 된 포지션이 바로 프론트엔드 개발자였고, 그때 처음으로 프로그래밍을 독학으로 공부하기 시작하며 제품을 만들기 시작했다. 이후 회사를 그만두고 학교에도 다시 복학을 하며 전공 수업을 통해 부족한 CS(Computer Science) 지식을 보충하면서 실력이 쑥쑥 자라던 시기였다.
어깨를 으쓱거리던 시절
2015년 당시 Angular가 조금씩 떠오르고 있긴 했지만 지금의 React나 Vue처럼 대부분의 개발자들이 알 정도로 유명하지는 않았기 때문에 필자는 자연스럽게 jQuery를 사용했었다.
비록 요즘 jQuery가 퇴물 취급받기는 하지만, 당시에는 CSS 셀렉터와 동일한 문법으로 간단하게 DOM 요소를 선택하고 조작할 수 있는 라이브러리였기 때문에 나름 혁신적인 평가를 받는 라이브러리였고, 필자는 이 친구를 사용하여 뷰를 만드는 것에 대해 생각보다 빠른 속도로 익숙해질 수 있었다. (document.getElementById('foo')
가 $('#foo')
로 줄어드는 매직…)
당시 루비콘이 서비스에는 웹 상에 obj
나 fbx
같은 3D 모델 파일을 업로드하고 자유롭게 이리저리 돌려볼 수 있는 뷰어 기능과 마테리얼이나 배경 스카이박스도 설정할 수 있는 간단한 모델 에디터 기능을 구현해야 했었는데, 필자는 이 과정에서 WebGL이라는 기술을 처음 접하고 사용하게 되었다.
사실 WebGL은 일반적인 서비스 개발자들이 크게 사용할 일이 없는 기술인데다가, 자유자재로 사용하려면 컴퓨터 그래픽스, 선형대수학에 대한 기본적인 이해가 필요하기 때문에 러닝커브가 완만한 편은 아니다. 그래서 그런지 다른 개발자들을 만나서 “저 WebGL로 이런 거 만들고 있어요”라고 이야기하면 대부분 “호에? 그거 겁나 어렵지 않아요?”라는 반응을 보였었다.
이런 반응을 자주 듣다보니 필자의 어깨는 저절로 으쓱거렸고, 점차 “나는 잘 하는 개발자다”라는 건방진 생각을 하게 된 것이다. 그러나 이런 귀여운 생각을 하루 아침에 개박살내는 사건이 있었는데, 이 사건이 지금까지 계속된 필자의 고민의 시작이었다.
사실 나는 아는 게 없었다
어느 날 필자는 친구의 소개로 Code For Seoul이라는 밋업에 참여하게 되었는데, 막상 가봤더니 필자같이 꼬꼬마 개발자는 별로 없었고 경력이 지긋하신 시니어 개발자 분들이 대다수였다. (분위기는 진짜 가족같은 따뜻한 분위기라서 좋았다)
그렇게 모여 앉아 맛있는 다과를 먹으며 기술에 대한 이야기를 도란도란 나누던 중에 늘 듣던 그 질문이 다시 나오게 되었다.
동욱님은 토이 프로젝트 하신다던데, 어떤 걸 만드시는 거에요?
이 질문을 들은 필자는 평소대로 “WebGL을 사용해서 간단한 웹 에디터랑 뷰어를 만들고 있어요”라고 대답했지만, 그 이후에 그 분들이 보여주신 반응은 평소에 필자가 겪던 상황과 많이 달랐다.
필자의 대답을 들은 아저씨들은 “호에?” 같은 반응 대신 WebGL이 가지고 있는 퍼포먼스 이슈나 캔버스 렌더링 시 발생하는 메모리 릭과 같은 문제점을 어떻게 해결하고 있는지에 대한 질문을 쏟아내기 시작했지만, 필자는 애초에 그런 이슈들이 있는 줄도 몰랐기 때문에 어벙벙하고 있을 수 밖에 없었다.
게다가 저 질문들을 던지신 분이 개발자도 아니고 DA(Data Analyst)였다는 점도 충격이었다. 이때 필자는 한 가지 중요한 사실을 깨달았다.
그도 그럴 것이 대학교에 다니는 학생들과 실무에서 10년 넘게 경력을 쌓아온 개발자의 짬밥 차이는 어마무시하다. 필자는 학교 안에서는 “꽤 잘하는 학생”이었지만, 학교 밖 정글에서는 그저 한 마리 올챙이에 불과했던 것이다.
물론 질문을 하셨던 아저씨는 “모를 수도 있지 허허허” 하면서 넘어가셨지만, 필자는 이 상황이 너무 부끄러워서 어디 쥐구멍에라도…아니 쥐구멍을 만들어서라도 숨고 싶었다.
필자는 러닝커브가 가파른 WebGL이라는 기술을 사용하고 있다는 것만으로 거들먹거렸지만, 사실은 단지 WebGL API를 사용할 수 있었을 뿐이지 이 기술들에 대해서 제대로 알고 있지 않았던 것이다.
이 사건 이후 벌써 6년이 지났지만, 아직도 필자는 어디 가서 뭘 잘 한다는 이야기를 하지 못하고 있다. 누군가 필자에게 “에반 잘 하잖아요!”라고 하면 “잘 하는 것과 할 줄 아는 것은 다르죠”라고 대답하는 것이 거의 습관이 되어버릴 정도다.
그리고 이때 처음으로 스스로에게 이런 질문을 던지게 되었다.
내가 뭘 잘 한다는 이야기를 하려면 얼마나 알고 있어야 하는 걸까…?
나는 프론트엔드 개발자인가?
이처럼 내가 스스로 잘 알고 있다고 생각했던 것들이 사실은 제대로 모르고 있다는 것임을 깨닫는 경험을 비단 필자만 겪었던 것은 아닐 것이라고 생각한다.
사실 이 고민의 시작은 “얼마나 알고 있어야 한다는 것일까?”였지만, 이러한 고민을 계속 반복하다보니 결국은 “그래서 안다는 게 뭔데…?”라는 고민까지 오게 된 것이다.
자, 필자와 함께 앎에 대한 깊은 고민을 해보기 전에 이런 경험이 없으신 분들은 앎이라는 것이 얼마나 모호한 개념인지 공감이 잘 되지 않을 수도 있으니 간단하게 예시를 하나 들어볼까 한다. 필자가 여러분에게 던지고 싶은 질문은 바로 이것이다.
프론트엔드 개발자와 퍼블리셔는 같은 포지션인가?
아마 이 업계에서 일을 하시는 분들이라면 이 포지션들이 굳이 무엇인지 설명하지 않아도 다들 아실 것이라고 생각한다. 그리고 이 포지션들에 대한 의견들도, 이 질문에 대한 대답들도 각자 가지고 있을 것이다.
물론 필자가 실제로 개발자들을 모아놓고 이런 질문을 던져보지는 않았지만, 채용 사이트에 올라와 있는 포지션들이나 구글링을 통해 읽어본 정보들을 보면 실제로 많은 사람들이 프론트엔드 개발자와 퍼블리셔를 구분하고 있다는 사실을 알아내는 것은 그리 어려운 일이 아니다.
그럼 여기서 다시 질문을 던져보겠다.
여러분은 이 두 개의 포지션을 구분할 수 있는가?
만약 그렇다면 어떠한 기준으로 이 두 개의 포지션을 구분하는가?
이 질문을 던짐으로써 여러분에게 묻고 싶은 것은 말 그대로 프론트엔드 개발자와 퍼블리셔를 구분하는 명확한 기준이 무엇인지에 대한 것이다.
사실 이 두 포지션은 모두 웹 클라이언트를 만드는 포지션이다. 그러나 방금 이야기했듯이 사람들은 꽤 철저하게 이 두 포지션을 구분하고 있다. 즉, 구분하는 방법을 알고 있다는 것이다.
일반적으로 프론트엔드 개발자는 웹 브라우저에서 작동하는 클라이언트 프로그램을 작성하는 개발자를 의미한다. HTML을 사용하여 DOM 구조를 정의하고, 자바스크립트를 사용하여 백엔드 시스템과 데이터를 주고 받거나 스탠드얼론 클라이언트 프로그램을 만들기도 하고, 때로는 CSS를 사용하여 사용자에게 유려한 UI/UX를 제공하기도 하는 개발자말이다.
하지만 이렇게 놓고 보자니 왠지 퍼블리셔와도 비슷한 부분이 많은 것 같다. 아니, 실제 직장에서 하는 일을 생각해보면 비슷한 정도가 아니라 똑같다.
혹자는 퍼블리셔는 React나 Vue같은 기술을 모르기 때문에 프론트엔드 개발자가 아니라고도 한다. 그렇다면 예전에 jQuery를 사용하여 복잡한 웹 클라이언트를 개발하던 사람들은 퍼블리셔였을까? 하지만 당시 업계에는 분명히 “프론트엔드 개발자”라는 포지션이 인식되고 있었고, 실제로 필자도 그렇게 불렸었다.
또 어떤 사람은 퍼블리셔는 자바스크립트나 컴퓨터 공학에 대한 기본 지식이 프론트엔드 개발자보다 부족하다고도 한다. 음… 그렇다면 이런 질문을 한번 던져볼 수 있겠다.
퍼블리셔가 자바스크립트를 어디까지 알아야 프론트엔드 개발자라고 할 수 있는가?
퍼블리셔가 단순히 CS에 대한 지식을 얻기만 하면 바로 그 사람은 프론트엔드 개발자가 되는 것인가?
이런 질문을 던지면 이제 사람들마다 답이 갈리게 된다. 어떤 사람은 클로저 정도는 알아야한다고 할 수도 있고, 어떤 사람은 클로저는 몰라도 되는데 CORS 정책 위반 정도는 스스로 해결할 수 있어야 한다고 대답할 수도 있다.
한 발 물러서서 클로저를 능숙하게 사용할 수 있으면 프론트엔드 개발자라고 치자. 그렇다면 클로저의 대략적인 원리를 알고 사용만 할 수 있어도 되는 것인가? 아니면 자바스크립트 엔진 내에서 함수 스코프와 클로저가 어떤 방식으로 생성되는 정도까지는 알아야 되는 것인가? 애매모호하다.
여러분은 어떤 기준으로 이 두 개의 포지션을 나누고 있었는가? 여러분은 정확히 그 기준을 알고 나누고 있었던 것이 맞는가? 아니면 이 포지션을 나누는 것 자체가 처음부터 의미가 없었던 일인가?
소피스트가 아닌 소크라테스가 되어야 한다
만약 이 질문들에 제대로 대답하지 못했다면 사실 여러분은 퍼블리셔와 프론트엔드의 차이를 정확히 알지 못하고 있는 것이다. 아니 어쩌면 사실은 이러한 차이 자체가 존재하지 않았을지도 모르는 일이다.
필자는 이 예시를 통해 우리가 사실은 잘 알고 있었다고 생각한 것들이 정작 자세히 들여다보려고 하면 정확하게 알고 있는 것이 아닐 수 있다는 이야기를 하고 싶었다.
마치 우리가 프론트엔드, 퍼블리셔, 풀스택 개발자와 같은 포지션이 명확히 나누어져 있는 것처럼 인식하고 있지만, 막상 이것들이 정확히 어떤 기준으로 나눠지는지 고찰해보면 쉽게 대답하지 못하거나 사람마다 다른 답변이 나오는 등 정확한 기준이 없는 것처럼 말이다.
사실 우리의 삶이나 우리가 사랑하는 프로그래밍 속에는 이런 문제들이 굉장히 많이 널려있다. 단지 우리가 “알고 있다”라고 생각하기 때문에 고찰해보지 않았을 뿐이다.
고대 그리스의 소크라테스는 이런 문제에 대해 깊게 고민했던 사람 중 하나인데, 이 아저씨는 진정한 앎이 무엇인지, 현명하다는 것이 무엇인지 알기 위해 당대 똑똑하다고 소문났던 소피스트들을 찾아가 질문을 던지는 짓을 했던 것으로 유명한 아저씨다.
소피스트는 나름 똑똑한 사람들이었다
소크라테스가 활동하던 당시의 아테네는 진짜 말 그대로 “말빨”로 먹고 사는 사회였다. 아테네 한 가운데 있는 아고라에서는 늘 토론이 활발하게 일어났으며, 연설을 통해 시민들의 지지를 얻음으로써 정치적 기반 또한 만들 수 있었다.
게다가 아테네에서는 시민들 간의 소송도 활발하게 이루어졌었는데, 변호사같이 전문가가 대리 변호를 해준다는 개념도 없었기 때문에 법정에서도 스스로 자신의 변호를 해야했다. 결국 지식이 부족하고 말을 잘 못하는 것만으로도 실질적인 손해를 입을 수 있는 사회였던 것이다.
그래서 아테네 시민들은 논쟁에 필요한 지식과 말빨을 중요하게 생각할 수 밖에 없었고, 이때 등장하는 사람들이 바로 아테네의 고액 과외 선생님들인 “소피스트”다.
소피스트들은 시민들에게 수사학, 변론술, 웅변술 등을 가르쳐 주면서 돈을 받았는데, 남을 가르치려면 당연히 많은 지식을 가지고 있어야 했으니 대부분의 소피스트들은 당대 유명한 웅변가나 철학가들이었다.
사실 소크라테스도 달변가로 유명했기 때문에 충분히 소피스트로 활동할 수 있는 지식 수준이 되었지만 소크라테스는 자신이 사람들을 가르치는 것이 아니라 그저 사람들이 본래 알고 있던 것을 질문을 통해 끌어내기만 하는 것이라는 신념을 가지고 있었기에 공짜로 사람들을 가르쳐 주었고, 이 때문에 소크라테스는 다른 소피스트들에게 약간 밉상같은 존재였다.
그러던 어느 날 소크라테스는 델포이 신전에서 우연히 한 가지 신탁을 받게 되는데, 이 신탁이 소크라테스가 앎에 대한 탐구를 본격적으로 시작하게 된 계기가 되었다.
나는 내가 모른다는 것을 알고 있다
소크라테스는 델포이 신전에서 “아테네에서 가장 현명한 사람은 소크라테스다”라는 신탁을 받게된다. 이 시대는 아직 신화적인 사고를 하던 시대였기 때문에 신탁은 거의 법이나 마찬가지였지만, 소크라테스는 절대 그럴 리가 없다며 직접 자신보다 현명한 사람을 찾아내겠다는 다짐을 하게 된다.
이때부터 소크라테스는 당대 용하다는 고액 과외 선생님들인 소피스트들을 찾아다니며 질문을 하며 그 사람이 얼마나 현명한 사람인지 알아보기 시작했는데, 소크라테스가 소피스트들에게 했던 질문의 흐름을 앞서 이야기했던 퍼블리셔와 프론트엔드에 대한 주제에 대입해보면 이런 느낌이다.
Q: 프론트엔드 개발자는 어떤 사람인가?
A: 웹 클라이언트를 만드는데 필요한 지식을 알고, 웹 클라이언트를 실제로 구현할 수 있는 사람입니다.Q: 그럼 퍼블리셔도 프론트엔드 개발자 아닌가?
A: 아닙니다.Q: 그렇다면 프론트엔드와 퍼블리셔의 차이는 무엇인가?
A: 퍼블리셔는 프론트엔드보다 컴퓨터 공학 지식이 적다고 생각합니다.Q: 그럼 퍼블리셔가 컴퓨터 공학 지식을 공부하기만 하면 프론트엔드 개발자가 되는 것인가?
A: 프론트엔드 개발자로 이직까지 해야 프론트엔드 개발자라고 할 수 있을 것 같습니다.Q: 그렇다면 회사에서 정해주는 포지션이 영향을 준다는 것인가?
A: …그런 것 같습니다.Q: 그럼 유명한 IT기업에서 일하던 프론트엔드 개발자가 웹 에이전시의 퍼블리셔로 이직하면 그 사람은 프론트엔드 개발자인가 퍼블리셔인가?
A: … (모순 발생)
이렇게 소크라테스는 소피스트들에게 원론적인 질문들을 던지고 그 사람이 답변을 하면 다시 의문이 드는 부분에 대해서 질문을 던지는 식의 대화법을 사용했는데, 이렇게 소크라테스의 질문을 몇 번 받은 소피스트들은 어느 순간 답변이 막히게 되며 자신이 알고 있는 것이 사실 오류가 있는 개념임을 깨닫고 당황하거나 화를 내었다고 한다.
결국 이렇게 소피스트들을 찾아다니며 질문을 해도 자신의 질문에 제대로 끝까지 대답하는 사람이 없자, 소크라테스는 “이들이 제대로 아는 것은 없다”라는 결론을 내리게 된다.
여러분은 어떤가? 소크라테스가 여러분에게 프로그래밍에 대한 질문이나 프론트엔드와 퍼블리셔를 구분하는 기준에 대한 질문을 던지면 끝까지 대답할 수 있을까?
만약 대답할 수 있다면, 여러분은 적어도 그 지식에 대해서는 소크라테스를 이긴 사람이다. 하지만 만약 소크라테스가 필자에게 저런 질문을 건네온다면 필자는 열심히 대답하다가 결국 아포리아 상태에 빠지고 말 것 같다는 생각이 든다.
그리고 이러한 질문법은 비단 소피스트들 뿐 아니라 소크라테스가 스스로에게 던지는 질문이기도 했다. 결국 소크라테스는 이 짓을 계속 반복하다가 한 가지를 깨닫게 된다.
내가 알고 있는 단 한 가지는 내가 아무것도 모르고 있다는 사실이다
이 말은 소크라테스 자신에게 하는 말이기도 했으며, 다른 소피스트들에게 하는 말이기도 했다. 너나 나나 제대로 아는 것은 하나도 없지만, 나는 적어도 “내가 모른다는 것”은 알고 있다는 것이다.
근데 소크라테스의 이런 결론이 딱히 틀린 것도 아닌게, 자신이 모른다는 것을 인정해야 더 깊은 진리를 탐구할 수도 있기 때문이다. 애초에 “난 알고 있다”라고 생각하고 있는 사람이 그 주제에 대해서 더 깊은 탐구를 하지는 않을테니 말이다.
당연히 소크라테스의 이런 태도는 소피스트들에게 곱게 보일리가 없었고 결국 소크라테스는 “아테네의 전통을 해치고 젊은이들을 타락시켰다”라는 죄목으로 기소되었다.
뭐 사실 법원에서도 눈치 잘 보고 입만 잘 털면 살아남을 수 있었지만 소크라테스가 스스로의 신념을 끝까지 굽히지 않았고, 배심원들을 자극하는 변론을 하며 자충수를 두는 바람에 사형당해버렸다. (다른 도시국가로 망명 신청도 할 수 있었는데, 그냥 독약을 마신 상남자…)
이렇게 똑똑했던 아저씨도 결국 그 긴 고민 끝에 내린 결론이 “나는 아무것도 모른다”라니, 약간은 허무하기 그지 없는 결론이다.
마치며
이렇게 긴 이야기를 풀어내다보니 필자의 질문은 “앎이란 무엇인가?”에서 “우리가 알고 있는 것이 정말로 알고 있다는 것인가?”로 바뀌게 되었을 뿐 결국 어떠한 답을 찾아내지는 못했다.
뭐 4대 성인으로 불리는 소크라테스 아저씨도 결국 저런 허무한 결론을 낸 질문이니 필자가 이 질문에 대해 쉬이 대답하지는 못할 것 같다는 생각도 들지만, 필자가 궁극적으로 목표하는 “객관적인 기준으로 잘하는 개발자”가 되기 위해서는 반드시 이 질문에 대한 나름의 해답을 정의해야하기에, 앞으로도 이 고민은 계속 될 것이다.
애초에 이 포스팅은 답변을 제시하기 위한 포스팅이 아니다. 이 포스팅을 쓰기 전에도 필자는 6년 정도 이런 고민을 계속 해왔지만 점점 질문에 질문이 꼬리를 물고 깊어져 갈 뿐, 어떠한 해답의 실마리 조차 잡지 못했기 때문이다.
물론 필자도 늘 바쁘게 일하고 공부하다보면 이런 철학적인 고민은 쉽사리 잊혀지기 마련이라는 것은 알고 있다. 이런 것보다 당장 내일 출근해서 신경써야하는 것들이 많다는 것도 알고 있다. (필자도 일 오지게 밀려있다…)
그러나 가끔은 프로그래밍에 대한 직접적인 고민보다 이렇게 한 걸음 물러선 시선에서 바라보는 고민이 오히려 더 도움이 될 때도 있는 것 같기에 여러분도 필자와 같은 고민을 한번 쯤은 해봤으면 하는 마음으로 필자의 고민을 공유하려고 한다.
이상으로 “나는 프론트엔드를 안다고 말할 수 있을까?” 포스팅을 마친다.