[생각] 내가 생각하는 개발자의 기본기
February 2021
운동을 하다가 떠올린 기본기의 의미
필자가 운동을 하다가 허리가 뻐근 한 적이 몇번 있었다. 보통 초보자가 처음 중량을 들거나 스쿼트를 할 때 생기는 문제인데 고관절의 유연함이 부족하거나 해서 무게를 버티기 위해 허리를 쓰는 경우가 많다. 처음엔 그게 더 편하기때문에 허리를 이용해서 무게를 들겠지만 지속될 수록 허리에 전해지는 압력이 강해지게 되어 허리 힘만 쓰고 몸은 상하는 일이 많다. 그래서 트레이너 선생님이 옆에서 지도하면서 자세에 대한 기본기를 알려줄수록 더 안전하고 효율적으로 운동을 할 수 있게 된다. 문득 운동을 배우면서 뭔가 개발에도 일치하는 부분이 있다고 생각이 들었다. 운동에서 자세가 제대로 안잡혀 있는데 무작정 무게를 올리면 다치는 것처럼 개발에서 기본기가 제대로 안잡혀있는데 무거운 개발에 나선다면 당장은 편해도 나중에 다칠 일이 생기지 않을까
개발이 뭘까
개발자의 기본기가 뭔지 생각하기 위해 일단 개발이 뭘까라는 생각을 하게 되었다. 단편적으로 생각해보면 개발은 하나로 정의하기에는 엄청 복잡한 것들로 이뤄져있다. 하드웨어와 소프트웨어가 소통하고 또 low level과 high level 단위가 소통하는 기술적인 부분, 객체지향이니 함수형이니 하는 개발론과 같은 소프트웨어 공학적인 부분, 애자일이니 탑다운이니 하는 협업 방식 등등 정말 많은 부분들이 개발에 포함된다. 아직 주니어 개발자인 내가 생각하긴 정의내리기 어려운 문제기도 했지만 샤워를 하다가 문득 생각나는 단어가 있었다.
개발은 상호 간의 약속이 아닐까
웹을 공부 하면서 느낀 점은 정말 많은 API들과 프로토콜이 있고 이런 규칙들이 맞물려가면서 돌아가고 있다는 것이었다. 서로 미리 정해둔 규칙아래서 Low level에서 더 High level한 쪽으로 점점 범위를 넓혀가며 개발이 진행된다는 걸 느끼게 되었다. 당장 그런 규칙들을 무시한다면 브라우저부터 제대로 동작도 안할 것이고 의도하는 개발을 못하게 된다. 또 저변에 깔린 많은 소프트웨어 설계론들이 있다. 이런 설계론들로 컨벤션을 만들면서 서로 의도하지 않게 영향을 받는 부분들을 줄여가려고 하는 것도 알 수 있었다. 많은 약속들을 설계하고 만들고 피드백을 받으면서 개발 환경은 패러다임이 원하는 쪽으로 점점 변해간다.
스스로 코딩은 글쓰기에 비유된다고 생각한다. 변수선언과 변수의 값 또 그 변수가 루틴을 진행하면서 앞에 선언되고 넣어진대로 로직을 짜면 코드는 동작한다. 글쓰기도 비슷하게 미리 등장인물이나 논리를 짜고나서 그 논리대로 글을 펼쳐 나간다. 나 혼자서 짜는 코드나 글쓰기라면 스스로의 논리로 작성했기 때문에 앞뒤가 다른 경우가 많지는 않다. 여럿이서 오랜기간 작업을 한다면 어떨까? 가끔 내가 보는 미국 드라마나 게임 스토리 같은 방대한 스토리 하에서는 등장인물의 앞뒤 설정이 바뀔때가 있거나 맥락 상 놓쳐서 작성되지 않은 부분으로 개연성이 떨어지는 경우가 많았다. 글쓰기에서는 사용자들이 혼란을 느낌에도 불구하고 여러 명의 작가가 오랜시간 쓸때 일상적으로 일이라서 미국 드라마나 게임의 특징이라고 넘어갈 때가 많다. 글쓰기와 비슷하게 코드도 여럿이서 오랜기간 작성하는 경우가 많다. 하지만 글쓰기와 다르게 코딩에서는 넘어가는 사용자 없이 코드의 앞뒤 맥락이 달라진다면 어플리케이션이 바로 중단되거나 의도치 않은 동작을 하게된다. 우리의 선배님들은 이런 불행한 경우들을 막기위해 다양한 소프트웨어 설계론을 연구하고 있고 코드 리뷰 같은 협업 방법을 늘 고민하고 있다. 정해진 약속 안에서 같은 맥락의 코드를 작성하기 위한 노력이 진행 되고 있다.
내가 생각하는 개발자의 기본기
내가 생각하는 개발의 기본기는 공통된 개발 환경 아래 상호 간의 약속을 공부하는 것이다. 다같이 하나의 큰 대서사시를 써야 하는 동료를 뽑는다면 이 개발 환경에서 지켜지는 여러 약속들을 많이 알수록 서비스를 오래 안정적으로 유지하는데 도움이 될 것이다. 또 팀원이 늘어날수록 코드에 관여하는 사람이 늘어나게 되고 이에 따른 불안정성도 크다. 개발 환경 아래 약속을 공부하는 것은 이전에 작성한 팀원이 작성한 코드 저변에 깔린 어떤 철학을 이해하기 에도 유리하다고 생각한다.
솔직히 기본기는 많이 알수록 좋은 부분이 많지만 당장 몰라도 개발은 할 수 있다. 예를들어 요즘 프론트앤드 개발에서 많이 쓰는 리액트, 앵귤러, 뷰 같은 라이브러리 경우 그 라이브러리 아래에서 써야하는 코드 컨벤션들만 잘 알아두면 협업이 가능하다. 라이브러리나 프레임워크 환경은 위에서 우리가 지켜야할 약속들을 추상화 단계에서 많이 숨겨둬서 여러명이 작업해도 부수적인 부작용을 막는데 최적화 되어있다. 천재 개발자들 덕분에 편하게 개발하는 것도 가능해졌지만 새로 시작하는 개발자들의 개발 기본기에 대한 중요성은 조금 더 떨어질 수 있기 때문에 궁극적으로 좋은 일인지는 의문이기도 하다. 편한 환경아래 개발환경의 약속들을 공부해 직접 깊은 부분의 설계를 해볼 수 있는 기회도 많이 줄어드는 것도 사실이다. 편한 환경에서 개발이 가능하지만 오랜시간 개발하면서 허리를 안다치려면(?) 기본기는 많이 알아야 한다는 내 생각이다.