개발자에게 성장은 연차 무관 언제나 가장 중요한 과제다. 그 관심사나 중요도에 비해 달성하기는 굉장히 어렵고 구체적으로 다루기도 어려운 문제다. 추상적인 개념이기도 하거니와 연차별로 딱딱 떨어질 수도 없는, 개인차가 워낙 큰 화두라는 점이 정확한 이야기를 나누기 힘들게 하는 요인인 것 같다.
나 또한 전 회사에서 성장이 막혀 있다는 생각에 사로잡혀 한참을 힘들어 했었다. 다행히 요즘은 뭘 공부해야 더 좋은 개발자가 될 수 있을지 감을 잡은 것 같은 느낌이 든다. 그 때 성장이라고 여겼지만 사실은 그렇지 않았던 행동들도 몇 가지 깨닫게 되었다.
그러던 차에 최근 취업을 준비하는 분에게서 ‘어떤 것을 알아야 프론트엔드로서 단단하면서 빠르게 취업을 할 수 있는지’에 대한 질문을 받았다. 이 참에 정리해두면 좋을 것 같다.
시간만 보내면 성장일까?
흔히 성장이 무엇인지를 이야기 할 때 ‘어제 보다 나은 오늘의 나’를 이야기 한다. 오늘 뭐라도 했으면 어제보다는 더 많이 알게 됐으니 그런 시간들의 누적만으로도 성장을 하고 있다고 할 수 있다고 혹자는 말한다.
이 말은 반은 맞고 반은 틀리다. 뭔가 더 경험했다는 것 자체만으로는 ‘개발자의 성장‘이라고 말하기는 어렵다. 성장은 보통 선형적이라기 보다는 계단식에 가깝고, 내가 이뤄낸다기 보다는 문득 찾아오는 깨달음의 감각에 가깝다. 깨달음을 일으킬 정도의 역치(threshold)를 넘기는 노력이 있어야 한다.
충분한 경험이 재료가 되는 것은 맞지만 깨달음, 즉 계단식의 성장이 가능하기 위해서는 기계적인 반복이 아니라 ‘의식적인 노력’과 ‘피드백’이 반드시 따라와야 한다. 특별한 계획이나 반성 없이 시간과 노력을 열심히 투자하는 것만으로는 어렵다는 뜻이다.
커리어 초입에 서있는 개발자들이 흔히 빠지는 함정의 대표적인 예시가 몇 가지 있다. 하던대로만 하는 관성적인 개발이 첫 번째임은 물론이다. 아는게 없을 때인데도 하던대로만 한다…? 말 그대로 커리어적 자살이다. 이렇게 살아갈 수 밖에 없는 환경으로 개발자를 몰아넣는 회사의 업무 환경도 포함이다. 그 다음으로 해로운 것은 무지성 개발 스터디나 아티클 정리인 것 같다.
개발 스터디 자체가 해롭다는 의미는 아니다. 정말 필요한 스터디도 물론 있다. 다만 경험상 상당수의 경우 이런 활동들은 개발자로서의 성장에 있어 크리티컬한 요소이기 보다는 부차적인 요소일 때가 많다. 부차적인 요소에 시야를 뺏겨 진짜 핵심적인 성장의 기회를 놓칠 수 있다는 점에서 기회비용적으로 손실일 수 있다는 의미이다. 열심히 노력을 투입하고 있다는 사실 때문에 내가 정말 집중해야 할 것이 무엇인지 탐색하는 시간을 갖기 어렵다.
특히 주니어 개발자들은 자신의 좁은 시야 안에서 뭘 알아야 할지 판단해야 하는데, 그 시점에서 그나마 만만한게 언어나 프레임워크 관련 서적이나 강의다. 혹은 최신 기술 관련한 아티클이나 fancy한 주제들에 대한 소식을 팔로우 업 하는 일 등이다. 안타깝게도 이런 일들은 대체로 투자 시간 대비 영양가가 없다… 그리고 이 모든 일들은 내 경험이다…
그럼 뭘 하라고…
너무 뻔한 결론이지만 웹 개발을 잘 알고 잘 하고 싶으면, 웹 개발에 진짜 필요한 핵심 지식들을 공부해야 한다. 내 힘으로 웹 개발의 처음부터 끝까지 필요한 것들을 리스트업하고 그걸 직접 부딪혀 봐야 뭐가 필요한지 알 수 있다. 책 외워서 시험치고 써먹지 않는 사지선다식 공부는 아무런 의미가 없다. 공부하기 위해 공부하는 게 아니라, 내일 출근해서 당장 업무에 사용하게 될 것들을 공부해야 한다.
나는 부트캠프에서 개발을 처음 배웠다. 당시 나는 모든 지식들을 굉장히 재밌게 배웠는데 왜 그랬는지 그 이유를 곰곰 생각해보면, 아무리 작은 배움이라도 꼭 그날 곧바로 활용했기 때문이었다. 그리고 그렇게 배운 지식은 몇 번의 반복을 통해 근육처럼 단단하게 손가락에 달라 붙었다. 하지만 개발자로 취업하고 나서는 이런 느낌을 크게 받지 못했다. 이제서야 돌아보자면 머리가 조금 컸다고 만들면서 배우는 실전적인 학습의 방식으로부터 조금씩 멀어지고 있었던 게 이유였다.
게시판 처럼 아주 작은 프로젝트의 작은 요소들이라도 꼼꼼하게 탐구하면서 진행하다보면 결코 간단하지 않다는 사실을 깨닫게 된다. 이는 놓치기 쉽지만 곰곰 생각해보면 아주 소름돋는 사실이다. 우리는 성장을 위해 정말 먼 길을 떠나지만 결국 열쇠는 내 방 서랍에 들어있는 것과 같은 상황에 비유할 수 있다.
가짜 문제에 속으면 안된다. 개발적인 문제들은 대부분 “React 18 버전의 Suspense나 Fiber 내부 구현” 같은 최신의 주제 혹은 어디 구석에 숨겨져 있는 지식의 형태로 찾아오지 않는다. “서로 다른 도메인 간에 어떻게 로그인을 유지시킬까”, “font 같은 정적 파일들의 캐싱이 작동하지 않는 이유는 뭘까” 같은 어떤 식으로 접근해야 할지 얼른 떠오르지 않는 열린 문제의 형태로 나타난다. 이런 문제들은 기본기가 탄탄할 때 좀 더 빠르고 우아하게 해결할 수 있게 된다.
조금 더 구체적으로 이야기 해보자. React를 사용해서 CRUD 기능을 구현하여 배포하는 상황이다. 화면 띄우고 서버에서 데이터를 받아와서 보여주는 복잡할 것도 없는 기능이라고 할 수 있다. 하지만 대부분의 웹 서비스는 큰 틀에서는 CRUD이기 때문에 이 과정을 올바르게 할 줄 안다면 최소한의 기본기를 갖추고 있다고 보아도 좋다.
과정을 따라가며 필요한 지식들을 나열해보자. 화면을 그려줄 브라우저가 필요하다. 브라우저는 서버에 요청을 보내고 화면을 그리는데 필요한 asset들을 서버로부터 다운로드 받는다. HTML, CSS, JS 파일이나 폰트, 이미지 등이 그 asset들이 (대체로 EC2나 람다나 S3, CloudFront 같은 AWS 제품을 활용한) 서버에 올라가 있을 것이다.
이 때 사용자에게 사이트를 최대한 빨리 보여주기 위해서 필요한 몇 가지 최적화 기법들이 있다. 주요 렌더링 경로의 각 지표들을 개선한다든가, asset들을 병렬 다운로드, prefetch, lazy loading 등을 활용하거나 이미 다운로드 받은 컨텐츠들에 대해서는 cache를 최대한 활용하도록 하는 등의 방법이 있을 수 있다.
사용자 인증을 위해 라우팅이나 쿠키, 브라우저 스토리지 등을 사용할 수 있는데, 이 과정에서 XSS 등 주의해야 하는 보안적인 이슈들이 있다.
자바스크립트 번들 크기를 줄일 수도 있다. bundle analyzer를 사용하여 번들을 분석하고 트리셰이킹, 코드 스플리팅 등의 기법을 적용할 수 있다. Webpack을 사용했다면 몇 가지 세팅을 건드려야 할 수도 있다. 빌드 과정이 오래 걸린다면 몇 가지 대안이 되는 좋은 번들러들이 있다.
배포 프로세스가 너무 수동 반복적이라 개선하고 싶다면 너무 본격적인 인프라까지는 아니더라도 Github Action처럼 CI/CD에 간단하게 활용할 수 있는 몇 가지 툴들을 알아볼 수도 있을 것 같다.
물론 프로젝트의 코드 레벨에서 중요한 요소들도 있다. 코드를 적절한 폴더, 파일, 함수 단위로 나누어 관리할 수 있어야 한다. 그것들이 잘 되어 있다면 개별 함수나 변수의 구현이 조금은 지저분하게 되어 있더라도 각 모듈들이 서로의 역할을 적절히 캡슐화하고 있을 것이므로 크게 문제가 되지 않는다.
결국 좋은 코드는 중요한 부분은 보기 쉽게 드러나 있고, 그렇지 않은 코드는 숨겨져 있는 코드이기 때문이다. 어떤 개발자가 확인하더라도 중요한 부분을 쉽게 확인해 사용 혹은 수정할 수 있고, 실수할 여지가 줄어들어 안전한 코드를 작성할 수 있게 된다.
지금까지 나열한 목록들에서도 확인할 수 있다시피 여러가지 라이브러리나 기술 스택, 혹은 자바스크립트나 타입스크립트의 신규 기능 혹은 기발한 로직이 기여할 수 있는 자리는 극히 제한적이다. 내가 이 글을 통해 전달하고 싶었던 핵심이 바로 이 부분이다. 오히려 굉장히 오랜 기간동안 웹의 척추를 떠받쳐온 낯익은 기술들을 생소하게 보고 깊게 이해하기 위해 노력해야 한다.
나가며
너무나 당연하게도, 나도 그저 한 명의 주니어 개발자일 뿐이라서 지금까지 나열한 모든 것들을 다 알지 못한다. 다만 이제 간신히 자세 신경쓰지 않고 수영을 할 수 있게 된 입장에서 남겨본 나름의 체크포인트이자 앞으로 공부해 나갈 투두리스트라고 생각하고 썼다.
쓰려고 키보드를 잡았을 때는 머리를 한대 맞은 듯 커다란 깨달음이었는데 다 쓰고 나니 별 얘기도 아니라 솔직히 좀 머쓱하다… 하지만 혹시라도 프론트엔드 공부를 어떻게 해야할지 막막함을 느끼고 있는 분들께 조금이라도 도움이 되었으면 좋겠다.
아 시니어 되고 싶다~