쾌락코딩

자바스크립트의 치명적인 단점이 뭐라고 생각하시나요?

|

언젠가 신입 웹 개발자를 채용하는 최종 면접에서 이런 질문을 받은 기억이있다.

자바스크립트의 치명적인 단점이 하나 있는데, 뭐라고 생각하시나요?

글쎄 치명적인 단점이라… 나름 대기업 CTO분이신데 이렇게 주관적인 질문을 주시네요…?? 지금 돌이켜보면 내가 지금보다도 훨씬 더 부족했던 시기에 보았던 면접이고 공부량도 많지 않던 때라 어처구니 없던 대답을 했던걸로 기억한다.

객체지향 프로그래밍과 함수형 프로그래밍을 모두 지원하다보니 미숙한 개발자에게 혼란을 주는 것이 큰 단점이라고 생각합니다(그래 떨어질만했다).

이제와서 느끼는거지만 함수형과 객체지향을 모두 지원하는건 정말이지 강력한 무기이다. 다만, 이 질문을 받았던 당시의 나는 함수형 프로그래밍이란 것을 정복하고 싶었으나 깊게 공부하기에는 내공이 너무 부족했던지라 학습의 어려움을 하소연하고 온 것이 아니었나 싶다.

면접을 본지 꽤 오래 되었지만, 아직도 가끔 면접관이 원했던 답이 무엇이었을까 생각해보곤 한다. 자바스크립트의 단점이 얼마나 많은데 어떻게 당신의 생각과 취향에 맞는 단점을 골라 말하리. 게다가 어떤 힌트도없는 단 한 문장의 질문만으로..

프론트엔드 개발자로서 자질을 물어보기 위해 했던 질문이라면, 아마 “브라우저에 종속적입니다”라는 대답이 적절했을까? 분명 브라우저에서 돌아가는 자바스크립트는 브라우저에 종속적일 수 밖에 없다. 내 블로그의 “크로스브라우징이란?” 포스팅의 인기가 많은 이유도 자바스크립트가 브라우저에 종속적이기 때문에 생기는 문제가 많기 때문이다. 쉽게 말해 내가 작성한 자바스크립트의 코드가 어떤 브라우저에서 돌아가느냐에 따라 개별적으로 신경써줘야 할 부분이 많다는 것이고, 한참 잘 돌아가는 코드가 어느날 갑자기 브라우저의 정책이나 지원에 따라 이상하게 작동할 수도 있다는 것이다. 분명 단점이다.

혹은, 아주 일반적인 자바스크립트의 단점을 듣고 싶었던 것이라면 어떤 답이 적절했을까? 블록 수준의 스코프를 지원하지 않는 점? 호이스팅? 언제 어떻게 변할지 예측하기 귀찮은 this바인딩? this의 경우는 정말 이해하기 어려운 코드를 만들 수도 있으므로 정말 잘 살펴 사용해야한다. 잘만 사용한다면 좋겟지만, 대부분의 경우 라이브러리나 도구를 개발하는 사람들이 언어의 맥락을 교모히 왜곡시켜 특정한 요건을 구현하는데 사용해오는 정도인 것 같다. 면접관에게 this의 바인딩 문제를 대답했다면 글쎄, 왠지 원하는 답은 아니었을 것 같다.

최근에 떠오르는 치명적인 단점은 자바스크립트가 언어 차원에서 immutable함을 제공해주지 않는 다는 것이다. 함수형 프로그래밍을 지원하는 것이 장점인 자바스크립트인데, 함수형과 땔래야 땔 수 없는 관계인 불변성을 지원하지 않는다니 꽤나 모순적이다. 아니 모순을 넘어서, 함수형이 대세로 떠어로는 요즘같은 때에는 치명적이라고 대답해도 괜찮지 않았을까?

자바스크립트 객체는 너무나도, 너무나도 동적이다. 언제건 속성을 추가, 삭제, 수정할 수 있다. 클래스 밖에서도 언제든 클래스의 속성을 바꿀 수 있다. 함수형 프로그래밍에서 불변성은 정말 중요한 개념인데 자바스크립트는 너무나 쉽게 객체를 변경시킬 수 있다. 클래스와 관련된 다양한 간편 구문이 추가되었지만, 그것과 무관하게 객체의 속성은 언제든지 자유롭게 변경될 수 있다. 기본형 값은 바꿀 수 없지만, 기본형을 가리키는 변수의 상태는 바뀐다.

const라는 키워드만으로는 함수형프로그래밍이 요구하는 수준의 불변성을 실현하기 어렵다. const로 객체를 선언할 경우 객체의 주소값 자체를 변경시킬 순 없어도, 객체 내부의 속성이 변경되는 것 까지는 막지 못하기 때문이다. 즉 객체의 속성값에 어떤 값이 추가되든 수정되든 삭제되든 지지고 볶든 삶아 먹든 기존 객체의 주소값은 동일한데, 그것까지 const가 캐치할 순 없다.

물론 자바스크립트 개발자들이 이런 현상을 두고도 가만히 있을리가 없다. Object.assign, Object.freeze등 불변성을 지키기위한 언어적 측면의 노력이 있지만 커다란 시스템에서 깊은 깊이까지의 불변성을 보장해 주지 못한다. 그래서 우리는 immutable.js같은 라이브러리의 도움을 받아야만 한다.

면접관이 원햇던 대답이 궁금하긴 하다. 가끔은 내게 질문을 던졌던 면접관을 찾아가서 “당신이 원했던 대답이 이 중에 있습니까?”라고 물어고 싶기도 하다. 그러나 그 분께서 원하는 대답을 들은들 무슨 의미가 있나 싶다. 분명 그것 말고도 더 많은 단점이 존재하고 사람마다 느끼는 단점의 온도차가 심한 것을.

내가 써놓은 자바스크립트의 단점들 뿐만 아니라 더 많고 많은 단점들 중에서, 운좋게 면접관이 생각했던 단점 한 개를 찍어 맞췄다면 합격에 가까워 졌을 수도 있었겠다라는 생각을 하니 면접도 참 운이 중요하겠다는 생각이든다. 이야기가 왜 여기까지 흘러오고 있는지 모르겠지만 면접에서 떨어진 모든 숨은 보석들이 너무 낙심하거나 자책하지 않았으면 좋겠다. 면접은 정말 운이 끼치는 영향이 생각보다 크기 때문이다.

Comments