Go를 사용하며 멍청한 코드 짜기
최근 한달 간, 개인 토이프로젝트에서 Go를 사용하여 API 서버를 만들고 있습니다. 새로운 언어를 배우고 싶기도 했고, 마침 Go가 웹 개발 분야에서 뚜렷한 성공세를 보이고 있다는 점이 저의 흥미를 자극했습니다. 제 주변에 Go를 신봉하는 개발자 한 분 계시는데 어쩌면 그 분의 영향인지도 모르겠습니다.
새로운 언어를 배운다는 것은 그 언어가 가지고 있는 어떤 철학이나 문제해결 방법, 혹은 접근법을 습득하는 것이라고 생각합니다. 그런 철학이나 방법, 접근법은 단지 그 언어에서만 유효한 것은 아니고, 다른 언어에서도 충분히 활용될 수 있을 것입니다. 인간의 언어도 각 언어마다 문법은 다르지만 의사소통의 방법은 서로 공유될 수 있다는 점을 연상해볼 수 있겠습니다.
Go는 제가 사용해본 언어 중에서 가장 완고한(opinionated)언어였습니다. 즉 굉장히 강한 의견(opinion)을 가지고 있었고, 언어를 학습하면서 그 의견을 찾고 이해하는데에 많은 시간을 보냈습니다. 재미있는 점은 의견의 복잡함, 난해함에 비해 (언어의 구사에 필요한)문법은 굉장히 단순하다는 것입니다. 아무튼 Go의 의견을 이해하면서 Go의 철학에 크게 매료되었습니다.
그 중에서 멍청한 코드를 짜라는 가장 큰 배움에 대한 이야기를 하고자합니다.
"멍청한 코드를 짜라"는 것은 사실 꽤 널리 알려진 격언입니다. 아마도 대부분의 개발자들은 프로젝트에서 알 수 없는 코드를 발견하고, 아무리 생각해봐도 이해할 수 없어서 작성자에게 물어보기 위해 git blame을 걸어봤다가, commit: You, 3 months ago
같은 상황을 한번쯤은 겪어봤을 거라고 생각합니다. 물론 저도 그렇습니다. 스스로를 위해서라도 이해하기 쉬운 코드를 짜는 것은 중요한 일입니다.
하지만 멍청한 코드를 짜는 것은 쉽지 않은 일인데, 왜냐하면 더 높은 수준으로 추상된 코드가 더 높은 수준의 코드이고 그러한 코드를 잘 짜는 것이 높은 수준의 개발자인 것만 같은 생각이 들기 때문입니다. 이럴땐 어니스트 헤밍웨이를 떠올리면 됩니다. 헤밍웨이의 소설은 초등학교 6학년 수준의 영어(물론 미국의 초등학교 6학년)로 이루어져있다고 합니다.
하지만 항상 헤밍웨이를 염두에 두고 코딩을 할 수는 없는 일입니다. Go의 해결법은 애초에 멍청한 코드를 짤 수밖에 없도록 만드는 것입니다.
Go에는 클래스가 없고, 상속도 없고, 제네릭도 없습니다. Go에서 추상을 할 수 있는 사실상의 유일한 방법은 함수입니다. 다른 언어를 사용하다 Go로 넘어오면 이런 제한된 문법때문에 불편함을 겪을 수 있습니다. 많은 코드들이 불필요한 중복인 것 처럼 느껴집니다. 그러나 저는 곧 이것이 바로 그 멍청한 코드를 짜는 굉장히 쉬운 방법이라는 것을 깨달았습니다. 추상이 제한되기 때문에 코드를 어쩔 수 없이 간결하게 짜게되기 때문입니다. 또한 유일한 추상의 도구인 함수는 클래스보다 더 관리하기 쉽습니다. 좋은 클래스를 설계하는 것 보다 좋은 함수를 설계하는 것이 훨씬 쉬운 일이기 때문입니다.
내장 메소드와 키워드가 아주 적은 것도 멍청한 코드를 짜도록 만듭니다. 예컨대 자바스크립트에서는 어떤 행위를 반복하기 위해 여러가지 접근법을 취할 수 있습니다. 예를들어 Array
객체에는 .map()
, .forEach
, .reduce()
, .filter()
, .ervery()
, ... 같은 메소드들이 정의되어있습니다. 다양한 메소드들이 존재한다는 것을 알고 있는 이상, 각 메소드를 적절한 맥락과 의미에서 사용하는 것이 중요합니다. 이렇게 '편리한' 메소드들의 존재는 궁극적으로 코드를 더 추상적이고, 따라서 더 어렵게 만듭니다. 반면에 Go는 어떤 행위를 반복하기 위해 단 하나의 방법을 제공합니다. 바로 for
루프입니다. 아마도 이보다 더 단순하고 멍청한 방법은 없을것입니다.
달리 말하자면, Go는 개발자가 헤밍웨이를 따라할 수 있게 도와주는 언어입니다. 그리고 헤밍웨이가 영어를 사용했기 때문에 간결한 문체를 구사할 수 있었던 것이 아니듯이, 간결한 코드를 짜는데에 익숙해지면 다른 언어로도 간결한 코드를 짤 수 있게 될 것입니다. 저도 Go를 통해 멍청한 코드를 짜면서 간결함을 배우고, 다른 언어에서도 멍청한 코드를 더 쉽게 짤수 있기를 기대하고 있습니다.