아래 글은 사내에서 제가 작성한 글을 옮겨 왔습니다. 나중에 보면 의미가 있을 거 같아서...
우리는 코더가 아니라 문제를 해결하는 사람들입니다.
클린 아키텍쳐, 클린 코드, DDD, TDD ... 용어가 너무 많고, 왜 배워야하는 지도 잘 모르겠죠? 순수 과학, 컴퓨터 관련 하드웨어 등에 비해서 소프트웨어 공학은 역사가 오래 되지도 않았는데, 왜 이렇게 알아야하는 게 많을까요?
게다가 맨날 새로운 라이브러리, 언어, 프레임워크, 방법론들이 나오고 있고, 이걸 모두 캐치업하는 게 불가능해 보일 정도로 소프트웨어 공학은 빠르게 발전하고, 변화해가고 있습니다.
개발 공부를 꾸준히 하다보면 잘 짠 코드, 유려한 아키텍쳐, 뛰어난 퍼포먼스 등 소프트웨어 공학적으로 아름다운 것들에 매몰되서 그것보다 더 중요한 것을 잊기 쉽다고 생각합니다. (뭣이 중헌디?)
질문을 몇 개 던져 볼게요.
아키텍쳐 왜 배울까?
낮은 결합도, 높은 결합도(Low Coupling, High Cohesion)에 맞게 코드를 구성해서 변경 사항에 유연하게 대처할 수 있기 때문입니다.
그냥 막 짜면 되는거 아닌가? 이걸 왜 다 지켜야해?
막 짜도 됩니다. 멋진 설계보다 빠른 실행력이 훨씬 더 중요한 순간이 있겠죠. 하지만 그 선택에 대한 트레이드 오프에 대해서 인지하고 있어야 한다고 생각합니다. 한 술 더 떠서, 코드를 유지보수 가능하게 만들 가장 좋은 방법은 코드를 안 짜는 것이라고 생각합니다
코드를 왜 유연하게 작성해야할까?
우리는 현실에서의 문제들을 해결하기 위해 코드를 작성합니다. 알고리즘 테스트나 교과서 적인 상황에서는 문제를 해결하는 방법이 한정되어져 있지만, 현실에서는 우리가 알고 있는 문제가 바뀌기도 하고, 새로운 상황에 의해 문제 해결 우선 순위가 뒤로 밀리기도, 또는 코드를 작성하지 않고도 문제를 해결할 수 있는 방법을 찾기도 합니다. 코드를 유연하게 작성하면, 이와 같은 변동 사항에 잘 적응하고, 대처할 수 있습니다. (우리의 시간은 모두 소중합니다)
결국 우리가 신경 써야하는 것은 코드를 얼마나 "아름답게" 쓰는 것 보다도 문제를 해결하는 방법이라고 생각합니다. 코드는 문제를 해결하는 많은 방법 중에 하나일 뿐이라고 생각합니다. 그럼에도 불구하고, 코드는 현대인들이 겪고 있는 많은 문제들을 해결합니다. 우리는 코드라는 도구를 통해서 그걸 다른 방법보다 쉽고, 유지 가능하고, 빠르게 해결할 수 있도록 할 수 있을 뿐이죠.
No matter what the problem is, it's always a people problem.
- Jerry Weinberg
코드에는 정답은 없지만, 오답은 있다고 생각합니다. 우리는 선배 (천상계) 개발자들이 문제를 해결했던 방법들로 부터 오답들을 찾고, 그것들을 조금 더 바른 방법으로 적용할지 아니면 동작하게 만(!) 할지, 아니면 그 사이 어딘가의 타협점을 찾던지 선택합니다.
A clever person solves a problem. A wise person avoids it.
- Einstein
우리가 배우는, 그리고 배울 아키텍쳐들은 이 문제들에 집중하고 소프트웨어 공학적으로 조금 더 올바르게 해결해줄 방법을 제안합니다. (다들 아시겠지만, 코드를 짜다보면 구현이나 기본적인 기능 구현에 몰두하다 보니 정작 중요한 것들을 놓치곤 합니다...)
결론은 아키텍쳐 재밌게 같이 배워서 남 줍시당 ㅎㅎ