Skip to content
김민식 - 생각과 행동의 기록
External Links

Go를 사용하며 멍청한 코드 짜기

개발, Go, 배움7 min read

최근 한달 간, 개인 토이프로젝트에서 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를 통해 멍청한 코드를 짜면서 간결함을 배우고, 다른 언어에서도 멍청한 코드를 더 쉽게 짤수 있기를 기대하고 있습니다.

© 2024 by 김민식 - 생각과 행동의 기록. All rights reserved.
Theme by LekoArts