Rails의 핵심 개념은 자신 있게 이해하고 있습니다. 동작하는 코드를 작성하는 것도 문제없죠. 게다가 요즘은 코드 품질, 리팩토링, 훌륭한 테스트 작성, 객체지향 설계에 대해서도 더 깊이 배워가고 있는 중입니다.
어느새 '이제 감을 잡았다'는 느낌이 들기 시작합니다. 전문가로 가는 길 위에 서 있다는 확신이 생기죠. 뒤돌아보면 얼마나 많은 발전을 이뤘는지 보이고, 그 성장에 꽤 만족스러운 마음이 듭니다.
그런데 왜 이렇게 느리다고 느껴질까요? 테스트, 유지보수성, 설계까지 신경 쓰기 시작하면서, 무언가를 출시하는 데 예전보다 훨씬 많은 시간이 걸리는 것 같습니다!
과연 빠르게 고품질 코드를 배포하는 것이 가능할까요?
모든 것은 과정의 일부입니다
이런 느낌은 무엇을 배우든 누구나 겪는 아주 흔한 현상입니다.
이제 초보자가 아니기 때문에, 코드가 가질 수 있는 다양한 형태들이 눈에 보이기 시작합니다. 한 줄의 코드를 작성할 때마다 고민해야 할 선택지가 더 많아지고, 예전에는 인식조차 못했던 엣지 케이스들도 테스트해야 하죠.
유용한 스킬들을 많이 배웠지만, 아직은 그것들을 적용하는 데 많은 생각이 필요합니다. 배운 내용을 바탕으로 올바른 결정을 내리고 있다는 확신을 얻으려면, 매 순간 결정 하나하나를 신중하게 저울질해야 하기 때문입니다.
하지만 시간이 지나면 분명 빨라집니다. 배운 스킬들은 점점 자동화되고, 직관이 생기며, 더 나은 결정을 더 빠르게 내릴 수 있게 됩니다.
물론 좋은 소식이지만, 당장은 도움이 되지 않죠. 그렇다면 지금 당장 일을 더 빨리 끝내려면 어떻게 해야 할까요?
단계별로 진행하세요
키보드에 손을 올릴 때마다 완벽하고 고품질이며 유지보수성 높은 코드를 작성하겠다는 강박에 사로잡히면, 아무것도 완성하지 못하게 됩니다.
저는 막힐 때, 글을 쓰는 방식과 똑같이 코드를 작성합니다. 먼저 거친 초안부터 시작하는 거죠. 간단한 테스트, 코드, 주석을 스케치하거나, 종이에 아이디어를 적어볼 수도 있습니다. 이 단계에서는 구조를 걱정하지 않습니다. 그저 머릿속의 막연한 아이디어를 코드로 정리하는 것뿐입니다.
그다음, 그 아이디어들을 단순한 구현으로 옮깁니다. 흔히 말하는 '동작할 수 있는 가장 단순한 것(Simplest thing that could possibly work)'이죠. 완벽하지 않고, 완벽과는 거리가 멉니다. 하지만 걱정할 필요 없습니다. 코드가 일단 동작하기만 하면, 정리 작업을 할 차례니까요. TDD로 엣지 케이스를 추가하고, 명백히 나쁜 코드를 리팩토링하고, 이름을 더 명확하게 다듬으면 됩니다.
이렇게 다듬어진 '수정본'은 보통 배포하기에 충분한 수준입니다. 그래도 저는 보통 몇 번 더 다듬는 과정을 거칩니다. 물론 너무 많이는 아니죠. 어느 순간부터는 수확 체감이 시작되어, 코드를 정리하는 데 드는 시간이 그 가치보다 커지기 때문입니다.
그리고 정말 가장 깔끔한 코드를 만들고 싶다면, 잠시 코드를 내려놓으세요. 몇 주 또는 몇 달 후에 돌아와서 한 번 더 다듬는 겁니다. 그 시점에는 시스템에 대한 이해가 더 깊어지고, 훌륭하고 유지보수성 높은 코드를 작성하는 법도 더 많이 배웠을 겁니다. 그래서 더 좋은 결과물을 만들 수 있죠.
글쓰기와 마찬가지로, 이 과정은 다음과 같습니다:
- 거친 개요, 초안 또는 프로토타입을 스케치한다.
- 단순하고 편집되지 않은 직관적인 구현을 작성한다 (TDD를 따르거나 테스트와 함께 작성하는 경우가 많다).
- 그 구현을 조금씩 다듬고, 리팩토링하고, 정리한다.
- 잠시 내려놓는다.
- 돌아와서 한 번 더 다듬는다.
일이 훨씬 많아 보이죠. 하지만 이렇게 단계별로 진행하면, 스스로를 계속 의심하지 않고도 더 빠르게 움직일 수 있습니다. 비슷하게 좋은 몇 가지 선택지 사이에서 불필요하게 고민에 빠지는 일도 없어지죠.
이 글은 제 조언 페이지에 Topher가 남긴 질문에서 영감을 받아 작성되었습니다. Ruby와 Rails 관련해서 막히는 부분이 있거나 도움과 조언이 필요하다면, 언제든 질문해 주세요!