클린코드를 따르면 좋은 개발자일까? 객체지향적으로 개발하면 좋은 개발자일까?
우테코에 들어오기 전까지는 맞다고 생각했다. 객체지향적이지 않은 코드를 보면 눈쌀이 찌푸려졌다.
레벨 1 동안 느낀 것은 꼭 그렇지만도 아니라는 것이다.
지금은 스스로 생각하고 결정하며 그것을 드러내는 개발자가 좋은 개발자라고 생각한다.
유연성을 필요로 하지 않는다면 그렇게 짜면 된다. 안 읽혀도 된다면 그렇게 짜면 된다. 마음껏 수정, 확장할 수 있는 유연성과 읽기 좋은 코드를 원한다면 그렇게 짜면 된다.
정말 중요한 것은 다른 사람이 보아도 그렇게 느끼게 하는 것이다.
내 코드에 대한 결정을 드러내는 것이 중요하다. 그래야 읽는 사람도 나와 동일한 생각을 가질 수 있다.
극강의 유연성을 추구한 코드가 그렇게 읽히지 않는다면, 아무런 의미가 없다. 시간 낭비다.
그래서 레벨 1에서는 먼저 요구사항에 대해 나만의 결정을 내리고, 그것을 코드에 담는 시도를 했다.
예를 들어, 블랙잭 미션에서는 블랙잭을 서비스하는 회사라면, 다른 포커게임도 서비스할 것 같다고 생각했다. 그래서 카드와 덱이라는 개념을 좀 더 추상적으로 만들 필요가 있었다. 그래서 카드와 덱에는 정말 플레잉카드와 그것들을 묶은 덱에서 수행할 수 있는 역할만 두고, 블랙잭을 위한 기능은 그것을 합성하는 다른 객체에서 수행하도록 했다.
유저의 경우에는 의존성을 최대한 줄이고, 다른 도메인이 유저의 의존하도록 했다. 그래서 원하면 다른 게임도 할 수 있도록 확장성을 열어두었다.
이런 결정들을 내리고 난 후, 의도를 더 잘 드러내기 위해서는 어떻게 해야 할까?
여러 시도들을 하면서 느낀 것은 의도를 잘 드러내기 위해서는, 평균에서 벗어나야 한다는 것이다.
평이한 코드는 그냥 그렇게 읽힌다. 수월하게 읽힐 수는 있지만 의도가 파악되지 않는다.
의도를 드러내는 것은 마치 춤과 같아서, 킬링 포인트 같은 것이 필요하다.
'왜 이렇게 짠거지?' 라는 생각이 들도록 해야 한다. 그래야 그 부분에 집중을 모을 수 있다. 그런 부분들을 통해 읽는 사람은 내 의도를 더욱 더 잘 이해하게 된다.
또 모든 부분에서 그렇게 느낀다고 좋은 코드는 아니다. 그러면 수많은 의도가 뒤엉킨 방향성 없는 코드가 만들어질 수 있다.
그래서 힘을 빼는 과정이 필요하다. 풍물에서는 이것을 '비워낸다'라고 표현한다.
비워냄으로 읽는 사람의 체력을 보충시키고, 정말 내가 힘쓴 부분 - 가장 중요한 부분에서 멈추게 한다.
이것이 내가 느낀 의도를 잘 드러내는 방법이다.
그러면 나는 우테코에서 무엇을 공부해야 하는가?
코드를 어떻게 짜든, 의도만 잘 드러난다면 모두 정답이라는 결론에 도달했다.
그러면 의도를 드러낼 수 있는 순간 나의 공부는 끝나는가?
아니다. 레벨 1 에서 느낀 것은 나는 훈련 중이라는 것이다.
우테코에서는 무엇이든 할 수 있다. 하나의 파일에 모든 코드를 적어도 된다. 3일짜리 미션을 위해 100개의 파일을 만들어도 된다.
모든 것이 허용되고, 그것이 존중받는 환경 속에서 나는 무엇이든 해볼 수 있다. 그래서 나는 모두 경험해볼 것이다.
그렇게 경험하고 수련하여 나는 모든 상황에서 내가 내린 결정을 뒷받침할 수 있는 코드를 작성할 수 있는 능력을 길러야 한다.
객체지향이 너무 싫어도 객체지향적으로 작성할 줄 알아야 한다. 객체지향이 너무 좋아도 절차지향적으로 짜보아야 한다. TDD를 깊게 시도해보고, 도메인의 중요성에 대해서도 재고해보아야 한다.
모든 진리라는 것들을 의심해야 한다. 세계 최강의 반란군이 되는 것이다.