개발을 잘 하는 습관

🗓 2021-05-17

Image by Negative Space from Pexels

저는 반복적으로 하는 작업이 있다면 가장 나에게 맞는 최적화된 루틴을 만들고 그 작업을 할 때마다 생각 없이 그대로 하는 편이에요. 정해진 루틴은 고집스럽게 유지하진 않고요. 경험에 따라 혹은 관련 지식이 늘어남에 따라 루틴을 조금씩 개선합니다. 루틴은 “현재 내가 이 일을 잘 하기 위해 알고 있는 위한 가장 나은 방법”이라고 할 수 있겠네요. 그리고 실행할 때는 이 생각 저 생각 할 필요 없이 그냥 실행합니다. 각 단계에 대한 생각만 하는 것이죠.

예를 들어 제가 사는 아파트는 매주 한 번 재활용 수거를 하는데 재활용을 할 때도 버릴 것들을 정리하는 순서가 있고 다 정리된 재활용 봉투를 손에 쥐는 순서와 방법이 있습니다. 루틴이라는 게 뭐 거창한 게 아니라 이렇게 가볍고 일상적인 것입니다. 이렇게 단순한 일에도 루틴이 있으니 당연히 개발을 할 때도 루틴이 있어요. 뭐 저만 있는 것처럼 말하고 있지만 여러분들도 의식적이던 무의식적이던 많을 루틴을 가지고 있을 거예요. 무의식적이고 원초적일수록 나쁜 버릇일 가능성이 크죠.

프로그래머로 일하기 시작하면서 초반에는 거의 무의식적으로 작은 루틴들을 만들고 업무를 진행했었어요. “일에는 순서가 있다”라는 말에 동조하는 편이었죠. 그러다 언젠가 켄트 백(Kent Beck) 형님의 짧은 문장을 만나게 됩니다. “make it work, make it right, make it fast” 어떻게 보면 TDD의 철학이 그대로 드러난 문장인데요. 이런 문장은 해석하기 나름이겠지만 당시 제가 실행하던 루틴과 비슷했어요. 이런 일 처리 방식이 나쁘진 않구나라고 생각했죠. 그래서 문장에 어울리게 루틴을 더 수정했어요. 루틴에 대해서 의식적으로 고민하고 진지하게 생각하고 루틴을 루틴이라고 부르기 시작했죠. 어느덧 거의 10년 정도 흘렀네요. 켄트백 형님의 문장을 나름대로 해석한 저의 루틴은 아래와 같습니다.

“make it work, make it right, make it fast” 루틴

1. 일단 동작하게 만듭니다

지금 해야 하는 작업이 이미 익숙한 작업이라면 이 단계의 일정 부분은 금방 넘어갈 수 있을 것 같아요. 학습 단계와 프로토타입 단계라고 볼 수 있는데요. 어쨌거나 개떡같은 코드라도 필요한 동작을 수행할 수 있도록 만드는 단계입니다. 익숙한 기술이라면 학습 단계는 넘어갈 수 있을 것이고요. 그렇지 않다면 크건 작건 R&D가 필요한 상황이죠. 필요한 것들을 공부하면서 내가 지금 해결하려는 요구 사항이 아무튼 충족되도록 코드를 작성합니다. 코드는 깔끔하지 않아도 돼요. 호기심으로 여러 가지 시도도 해볼 수 있고요. 내용에 따라 다르겠지만 TDD가 적용되는 상황이라면 이 과정에서 의미 있는 TC가 만들어져야 합니다. 결국 이 단계에선 TC만 유용하게 남을 수 있어요. TC가 유용하다는 건 프로토타입이나 실험을 통해 구조 안에서 모듈이 책임과 역할을 다할 수 있도록 모듈의 인터페이스 설계는 어느 정도 완성되었다는 말이고요. 상세 구현은 엉망진창이어도 상관없습니다.

2. 옳게 만듭니다

첫 번째 단계에서는 학습하면서 이것저것 시도해보느라 배운 건 많지만 코드는 엉망일 수 있어요. 학습을 하면서 사용한 일부 코드들이 효율적이지 않아 이리저리 많이 돌아간 경우도 있을 것이고 불필요하거나 중복적인 코드가 있을 수 있어요. 그리고 동작에 필요한 코드만 구현한 나머지 굉장히 낙관적인 코드일겁니다. 실패의 가능성을 염두에 두지 않은 거죠. 예외케이스들을 점검해봐야 합니다. 지원하는 사용 환경들을 고려해야 하기도 하고요. 프런트엔드라면 크로스 브라우징 테스트가 필요할 수 있겠네요. 변경되거나 추가된 코드가 다른 영역이나 기능에 미칠 영향도 검토해봐야 할 필요도 있고요. 사이드 이펙트가 생기면 안 되니까요. 아무튼 현재 알려진(알고 있는) 가장 나은 방법을 이용해 실용 가능한 코드로 바꾸는 거죠. 두 번째 단계는 사실 리팩토링 단계라고 보면 될 것 같아요. 리팩토링은 만들어진 인터페이스와 TC를 믿고 모듈의 내부 코드에 온전히 집중하는 시간이에요. 인풋과 아웃풋은 최대한 유지한 채 코드를 개선하는 거죠. 하나의 모듈은 응집도를 높이기위해 혹은 더 나은 구조를 위해 분리될 수도 있구요. 그래서 내부에 숨겨져있던 기능도 별도의 역할과 책임을 갖는 모듈로 다시 태어날 수 있어요. 어찌 되었건 분리되면 테스트 케이스도 이동하거나 추가, 수정돼야합니다. 두 번째 단계까지오면 일단 작업은 완료되었다고 볼 수 있어요. 이제 PR을 만들고 코드리뷰를 요청할 수 있습니다.

3. 더 나은 것으로 만듭니다

옳은 것과 나은 것은 다릅니다. 옳은 것 이상의 것이 나은 것이겠죠. 사실 제일 어려운 단계이고 익숙한 작업이라면 두 번째 단계에서 이미 해결될 수도 있어요. 바로 퍼포먼스 측면에서 병목을 찾거나 리소스를 더 적게 사용하게 만드는 단계입니다. 이 과정에서 일부 코드의 클린함이 퍼포먼스를 위해 희생될 수도 있고요. 이 세 번째 단계는 한 번으로 끝나지 않고 시간이 흘러 관련된 지식을 습득할수록 계속 추가 작업이 있을 수 있는 단계입니다. 더 나은 구현을 위해 다시 첫 번째 단계에서 다시 시작할 수도 있고요. 켄트 백 형님은 세 번째 단계를 “make it fast”라고 했지만 저는 그것 이상의 의미를 두는 단계입니다. 개인 지식 데이터 베이스에 배운 것을 정리합니다. 저는 데이원 이란 저널링 도구를 사용해서 깨닫거나 배운 것을 그냥 막 넣어요. 꼭 세 번째 단계에서가 아니라 개발 도중에도 막 넣죠. 이렇게 기록한 내용들로 글을 작성해서 공유를 하거나 가볍게는 동료들과 이야기해 볼 수 있는 화두로 사용할 수 있습니다. 더 나은 코드를 만들거나 더 나은 개발자가 되는 단계인 거죠.

순서의 필요

각 단계는 작업에 따라 합쳐질 수 있고 순서도 바뀌고 다시 돌아갈 수도 있고 그래요. 하지만 매 순간 각 단계를 의식적으로 구분하려고 합니다. 루틴은 거시적으로 적용할 수도 있고 미시적으로도 적용할 수 있습니다. 개발한 모듈 자체에 루틴이 적용될 수 있고요. 그 모듈의 특정 스펙 하나 하나에도 재귀적으로 루틴이 적용될 수 있습니다. 정말 실력이 있다면 처음부터 한 번에 모든 것들을 고려해서 만들 수 있을지도 모르겠어요. 배우면서 실용 코드를 만들고 퍼포먼스까지 고려하면서 구조적으로 완벽한 코드를 만드는 것 말이에요. 하지만 보통의 개발자는 처음부터 모든 것을 고려해서 만들면 아주 기본적인 것조차 못 만들고 시간만 낭비하게 될 수 있어요. 너무 많을 것을 고민하느라 한 계단도 못 오르는 거죠. 이러면 갈수록 시간에 쫄려 뒤죽박죽 아무것도 못합니다. 마음이 급하더라도 한 계단씩 오를 수 있는 자신에게 맞는 순서를 찾아야 한다고 생각합니다.

루틴 is 습관

늘 최선만 생각할 수는 없어요. 저도 토이프로젝트는 1단계에서 멈추는 경우가 많습니다. 하지만 더 나은 코드를 만들기 위한 노력은 회사나 갑을 위해서라기보다는 개발자 본인을 위해서 필요한 것 같아요. “다른 사람은 모를지라도 내가 알잖아?” 이런 느낌이죠. 어디 드라마에서 나온 대사 같은데 갑자기 떠오르네요 :) 이런 노력이 코드에 대한 애착으로 이어지고, 직업에 대한 애착으로 이어져 자신감으로 승화된다고 생각합니다. 너무 나갔네요 :) 그러기 위해선 루틴을 만들고 따르는 것도 중요하지만 지속적으로 더 나은 루틴을 배우고 고민하고 개선해가는 것에 더 큰 의미가 있다고 생각합니다. 더 나은 코딩을 위한 방법론은 계속 생겨나니까요. TDD도 루틴이고요. 여기서 또 켄트 백 형님의 말씀이 떠오르네요. “난 뛰어난 프로그래머가 아니에요. 단지 뛰어난 습관을 지닌 괜찮은 프로그래머일 뿐이에요.” 루틴이란 것이 결국 습관이겠죠.

마무리

루틴은 제 머릿속에서 추상화되어서 어떤 작업에도 적용할 수 있어요. 예를 들어 보고서나 기술 문서 같은 글을 써야 한다면 첫 번째 쓰고 싶은 내용들을 생각나는 대로 두서 없이 막 쓰고요. 두 번째는 쓴 글을 정리하고 순서를 변경하고 살을 붙여서 목적에 맞는 수준으로 만들어요. 세 번째 단계에서는 작업물의 잘못된 점을 다시 검토하거나 논리적으로 빈약한 부분을 찾아 보강하기도 하고요 다른 분께 검수를 요청하고 리뷰를 반영해요. 일단 하고, 목적과 기대에 맞게 수정하고, 좀 더 그럴싸하게 만들어요. 굳이 수치로 따지면 대충 0.5 정도 만들고 1을 만든 다음 1.2 정도로 만드는 거죠.

저도 아직 한참 부족하지만 좋은 루틴, 좋은 습관을 만들려고 노력하다 보면 분명 조금씩 나아질 것이고 언제가 쬐끔은 잘하게 될 거라는 믿음은 갖고 있습니다. 적어도 현재의 내 수준에서 최고로 잘 할 수 있는 습관을 만들고 발전시키는 거죠. 운동하기, 일찍 자고 일찍 일어나기, 명상하기 등도 포함될 수 있을 것이고요. 일종의 가성비 처럼 내 능성비를 끌어올리는 거죠. 능력이 1이라면 매번 0.8도 0.9도 아닌 1만큼은 성능을 내고 싶습니다.

♥ Support writer ♥
with kakaopay

크리에이티브 커먼즈 라이선스이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 국제 라이선스에 따라 이용할 수 있습니다.

© Sungho Kim2023