🚴

성장하는 것

Created
2022/05/29 12:08
Tags
ETC
Subtitle
20살 여름, 친구 두 명과 함께 자전거를 타고 전국 일주를 했다. 돈은 통장에 든 20만원이 전부였다. 자전거 가게에 갔고 18만원 정도에 가게에서 가장 저렴한 자전거 한 대를 구매하고 나니 남은 돈은 2만원 가량이었다. 그리고 25박 26일 간의 전국 일주를 딸랑 2만원으로 보냈다.
까맣게 탄 피부와 함께 학교에 가니 다들 대단하다며 치켜세웠다. 하지만 나는 그 때 정말 나 스스로 대단하다고 생각한 적이 없었다. 페달을 번갈아 밟고, 멈춘 곳에서 잠들고, 배고프면 구걸하고, 가끔 특별한 일이 생기곤 했지만 대부분은 지루한 반복이었다. 굳이 대단한 점을 찾자면 열악 했다는 것 정도라고 생각했다.

 학습과 훈련

자전거 여행이 지루한 반복의 연속이었음에도 불구하고 몇 가지 도움은 되었다. 가령 성격이 날카로운 편이었는데 요령있게 사람을 대처할 수 있게 되었다. 새로운 경험이 숨쉬듯 익숙해지면 사람이 바뀌는구나 그 때 깨달은 거 같다. 그래도 이러한 변화가 대단한 것은 아니라는 생각엔 변함이 없었다. 대단한 일이란 많은 지식과 뛰어난 능력을 가졌을 때 해낼 수 있는 것들이었다. 이것들은 모두 특별한 것을 배워서 얻을 수 있는 것이라 생각했다. 다들 그렇지 않은가. 책을 읽고 강의를 듣고 좋은 학교와 회사를 다니고 싶어하고. 내가 이전 회사를 그만 둔 것도 마찬가지였다. 더 이상 특별한 것을 배울 수 없었기에 아무리 페달을 밟아도 같은 풍경이라고 느꼈다. 그랬기에 지난 2달 간 좋은 책 좋은 강의들을 찾아 들었다. 성장을 위해 열심히 학습에 노력을 기울였다. 하지만 학습을 통해 깨달은 것은 성장은 좋은 학습을 통한 깨달음과 함께 많은 훈련이 필요하다는 것이었다. 그것은 깨달음이 숨쉬듯 익숙해 지는 작업이었다. 그래, 성장에는 두 가지가 필요하다. 익숙함에서 벗어나 새로운 것을 학습하는 것이다. 그리고 그것이 익숙해질때까지 지루하게 훈련하는 것이다. 성장하기 위해선 학습과 훈련이 모두 필요하다.

 기초와 학습

나는 스스로 비전공자 라는 것을 의식하진 않지만, 그래도 Computer Science 학문은 오랫동안 컴플렉스로 느껴왔다. 이게 과연 쓸모가 있을까 의심을 아직도 하기도 한다. 그런 나에게 이번 한 달간의 기초 공부는 꽤 특별했다. 시작 전에는 실무를 2년을 겪어 오며 무엇이 중요한지 그렇지 않은지 나름대로의 기준이 있어서, 이번 공부가 자신 있었다. 실제로 공부를 하면서 느낀 바는 CS는 고전과 비슷하다는 점이다. 실제로 어플리케이션에 직접적인 도움을 주진 않더라도, 근본적인 아이디어를 제공한다. 예를 하나 들어보자. 웹 프론트엔드 개발자는 C의 포인터에 대한 개념을 알 필요가 있을까? 내 주위에 다수의 프론트엔드 개발자분들은 이러한 지식 없이도 훌륭하게 페이지를 생산하고 기업이 가진 문제를 해결 해낸다. 그럼에도 나는 분명히 도움이 된다고 말하고 다닌다.
C의 포인터는 MV*를 해결하기 위한 가장 기초적인 아이디어를 제공한다. 포인터, 즉 참조는 상대적인 것이다. 그리고 이러한 특징이 대체 가능성을 만들고, 이는 공통된 인터페이스라는 아이디어를 만들어낸다. 이것은 곧바로 객체지향을 이해하는 근본적인 설명으로 이어진다. 수시로 변화하는 어플리케이션을 대처하기 위한 문제는 동적으로 상대적인 참조라는 아이디어로 해결한다. 여기에는 객체지향을 설명하기 위해 어떠한 비유도 필요하지 않다. 친숙한 개념을 통한 비유는 이해를 돕는것 처럼 보이지만 정확하지 않은 설명으로 이어질 수 있다.
결국 가장 정확하게 이해하기 위해서는 가장 기초적인 아이디어가 내 스스로의 지식 수준 내에서 항상 참인 명제 즉, 공리여야 한다는 것이다. 그리고 CS의 기초는 새로운 기술을 학습하기 위한 공리를 선별한 것이다. 그리고 MV*와 객체지향의 성질들이 친숙한 개념이 되면서 함수지향이나 MVC를 해결하기 위한 Vue 팀의 MVVM이나 React팀의 Flux를 정확하게 이해할 수 있게 될 준비가 된다. 이것을 정확하게 이해하는 것은 프레임워크를 얼마나 의도에 맞게 사용하는가를 의미하는 것이고 이는 결국 좋은 코드를 작성하기 위한 가이드라인을 정확히 이해할 수 있게 됨을 의미한다. 이는 포인터에서 그치지 않는다. 가령 운영체제의 스케쥴링은 React의 Hook이 상태를 변화하는데 있어 자원을 합리적으로 관리하는가 이해를 돕는다. (requestIdleCallback 혹은 requestanimationframe 를 통해 Queue 내의 Job에 있는 상태 변경을 처리하는 일)
분명히 고전을 학습하는 것은 새로운 기술을 무엇보다 단순하고 정확하게 이해하는데에 도움을 준다.

 훈련

모든 학습이 그렇지는 않지만, 분명한 것은 학습 후 많은 훈련이 필요한 영역이 존재한다. 가령 알고리즘과 자료구조 디자인 패턴과 같은 것이 그렇다. 이해하는 것은 간단하지만 내 상황에 맞게 녹여내는 것은 쉽지 않다. 반복해서 정확하게 구현하는 것을 숙달 해야만 내가 필요한 상황에도 정확하게 쓰일수 있다. 간단한 예로 MVC 패턴을 살펴보자. Model은 데이터와 비즈니스 로직을 관리하는 영역이라고 한다. View 는 레이아웃 화면을 처리하는 부분이라고 한다. Controller 는 명령을 모델과 뷰 부분으로 라우팅하는 부분이라고 한다.
위 설명이 아주 어렵지 않다. 데이터는 Model 화면은 View 명령을 라우팅 하는 부분은 Controller
하지만 이것을 녹여내는 디테일은 전혀 단순하지 않다.
좋은 예시로 프로그래머스에 과제테스트MVC로 해결한다고 상상하자.
검색창이 있고 검색을 하면 아래 추천 키워드가 나오는 식이다.
어떻게 작성하면 좋을지 먼저 고민해보길 바란다. 아마 MVC로 만들어본 적이 없다면 어디서부터 시작해야할지 막막할 것이다. 추천 키워드는 데이터이니 Model 인 것처럼 보이고 화면은 View 인데 HTMLView 로 바라보아야 하는 것인지 등.
하나부터 열까지 알려주는 강의같은 것이 아니라면 만드는 순서 까지는 알려주지 않는다. 태스크를 분석하거나 어디까지가 모델인지 모델링하는 것은 매 상황에 맞게 처리해야 하므로 딱 잘라 설명할 수 없다. 또한 실제로 MVC를 구현하는데 Model View Controller 말고도 다른 개념들이 필요해지는 순간도 오게 되는데 이 또한 학습만으로는 모두 파악할 수 없는 이유다.
추천 키워드 모델을 정의해보자.
const SuggestionModel = class{ constructor(input){ keyword = this.input } };
JavaScript
하지만 어떤 개발자들은 네트워크 레이어에 대한 캐싱등의 처리를 위해 데이터를 보관하는 객체를 Entity 혹은 VO 라는 개념을 두어 보관하기도 한다.
class Model { constructor(){} }; const Suggestion = class{ constructor(input){ keyword = this.input Suggestion.instances.add(this); } }; Suggestion.instances = new Set(); const Model = class{} export const SuggestionoModel = class extends Model{ get data(){return [...Suggestion.instances];} };
JavaScript
이 라인에 추천 검색어를 위한 Entity 인스턴스에 Set을 사용한 이유는 또 무엇일까?
Suggestion.instances = new Set();
JavaScript
Suggestion 는 객체이고 MVC는 기본적으로 객체지향을 기본으로 하기 때문이다. 인스턴스를 저장하기 위해 배열을 컨테이너로 사용하는 대신 Set 자료구조를 사용한 이유는 같은 값인 객체가 두 번 들어가면 안되기 때문이다. 저장된 값이 원시 값이라면 중복된 값이 들어가는 것이 의미가 있다.
["Value", "Value", "Value"];
JavaScript
중복된 인스턴스가 들어가는 상황 역시 살펴보자
const instance = new Suggestion("Value"); [instance, instance, instance]
JavaScript
이것은 값의 저장과 달리 의미가 없을 뿐더러 의도한 결과와 전혀 다르다. 주소 값을 중복해서 저장하는 것은 어떤 의도도 담고 있지 않다. 때문에 객체를 담을 컨테이너로써 Set 을 선택하게 되었다.
이처럼 실제상황은 학습한 것대로 흘러가지 않는다. 상황에 필요한 판단과 사소한 디테일이 요구되기 때문에 학습과 훈련은 함께 이루어져야 한다는 의견이다.

 좋은 학습과 체계적인 훈련

훈련이 중요성을 설명했지만, 무작정 반복하는게 정답은 아니다. 다른 답 혹은 더 나은 답을 참고하는 것은 큰 도움이 된다. 잘못된 방식을 교정받는 것은 더욱 도움이 될 것이라 생각한다. 좋은 학습은 훈련 사이사이에 절대적으로 필요하다. 하지만 운이 좋은 일부를 제외하고는 그러한 경험을 하기란 쉽지 않다. 좋은 사수, 좋은 멘토 내 수준에 맞는 동료는 대게 멀리 있는 법이다. 결국 성장하기 위해선 스스로 좋은 학습을 하는 방법을 찾아야 한다.
나 역시 오랜 기간동안 많은 방황을 했고 지금도 어떻게 좋은 학습, 즉 좋은 훈련환경을 만들 지에 대해 고민이 많다. 그 중 몇가지 소개를 하자면 다음과 같다.

1. SNS 활용

좋은 개발자들은 항상 영향력을 하루에 수십번도 노출하고 있다. 그리고 가장 단편적이며, 인스턴트 섭취가 가능한 장소를 꼽자면 트위터이다. 국내 해외 할 것 없이 하루에도 수십번 기술에 대한 아이디어나 신기술 정보를 빠르게 캐치 할 수 있다. 만약 NodeJS개발자라면 NodeJS 팀을 팔로우 하면 Github의 대쉬보드 보다도 빨리 업데이트 정보를 확인할 수 있을 것이다. 기능에 대한 코멘트 및 반응은 덤이다. 좋은 개발자들에게 지속적으로 노출되어 있는 곳이야 말로 좋은 훈련환경에 있어서 가장 중요한 포인트다.
그 외에도 꿀팁 대방출만을 위한 계정이나, 퍼포먼스 향상에 대해서만 기술하는 계정등 팔로우하고 천천히 시도해볼 것들이 많다.

2. Github 활용

1번은 좋은 개발자들에게 지속적으로 노출하는 방법이라면, Github 활용은 좋은 코드에 자주 노출되는 방식이다. 다만 처음 시도하는 것이라면 어려운 방법이다. 어디서부터 어떻게 읽어야 하는지 오히려 Github학습을 위한 체계적인 훈련방식이 따로 필요하다고 생각한다. 그럼에도 불구하고 꽤 괜찮은 방식이 있는데 Core를 보는 것이 아니라 Home혹은 Example등을 적극 활용하라고 말씀드리고 싶다. 읽는 것도 좋고 컨트리뷰트하는 것도 좋다. Example은 기초적인 기능만으로 구성하기 때문에 짧은 코드 작성으로 할 수 있고, 하지만 가장 본질적인 것들로 구성되어 있다.
컨트리뷰터분들이 리뷰하기도 부담스럽지 않다. 사소하지만 값진 교정을 받을 수 있는 좋은 기회를 만들기 적합하다.

3. KOCW

유명 유튜버 혹은 온라인 강의, 좋은 책들은 다들 알아서 잘 찾으리라 생각한다. 때문에 조금은 잘 알려지지 않은 무료 강의사이트를 소개하고자 한다. 대학 강의들을 무료로 제공해주는 서비스이고 CS지식을 쌓는데 도움이 된다. 특히 CS공부가 간절했던 분들이라면 크게 도움이 될 것이라 생각한다. 다시금 말하지만 CS는 고전이라 생각한다. 가장 근본적인 컴퓨터 사고방식 및 문제해결들을 배우는 과정이고, 복잡한 문제를 단순하게 설명하는 관점을 넓히는데 도움을 준다. 만약 한번도 CS공부를 해 본적이 없다면 업계 최고 선배들이 수십년 전 해결하고자 하는 문제를 함께 고민해보는 것도 좋은 경험이 될 것이다.

 마치며

나 역시 다를 바 없지만, 성장에 간절한 주니어들이 정말 많다. 특히 IT업계가 계속해서 커지면서 신규유입이 많아짐에 따라 더욱 그러한 것 같다. 물론 좋은 교육기관들도 계속해서 늘어나는 추세이지만 그럴 여건이 안되는 분들 혹은 이들이 직장생활을 하며 만나는 성장의 부재를 해소하는 것이 정말 어려운 것 같다.
이전에 아파치 카프카 에 대한 교육을 받으러 간 적이 있었는데 대부분의 참가자분들이 어느정도 규모가 있는 회사에 재직중이었다. 그에 반해 나는 중소기업 수준의 트래픽 및 규모를 가진 서비스를 운영하고 있었고 그 때문에 MSA라던지 실시간 데이터 처리 라던지 내겐 공감할 수 없는 너무 뜬 구름 잡는 이야기였다. 서비스의 트래픽이 많지 않은 백엔드 개발자였던 나는 수업을 이해하기 위해 대게 “상상하거나”, “스스로 환경을 만들고 임의로 테스트” 해보아야한다는 이야기다. 이러한 격차를 줄여나가는 것은 정말 쉽지 않다.
휴식을 취하면서 이러한 고민들을 계속 했고, 앞으로 좀 더 쉽고 도움이 되는 글을 써야겠다고 다짐했다. 누구나 성장에 대한 고민이 있다면 어떤 것이라도 해소할 수 있게, 영향력있는 블로그로 키워나고 싶다.