TIOBE Index는 Go 언어를 다음과 같이 소개했습니다. “Go is not revolutionary, but its strength is in combining the right features(다른 언어에 없는 특별한 기능이 있는 건 아니지만, 바른 선택들이 모여있는 게 장점인 프로그래밍 언어다).”
Go 언어는 심플함과 강력한 성능으로 해외뿐 아니라 국내에서도 인기가 늘고 있습니다. 넷플릭스(Netflix), 드롭박스(Dropbox) 등 많은 IT 기업이 선택한 언어이기도 하고, 쿠버네티스(Kubernetes)와 도커(Docker) 등 Go 언어를 활용하는 시스템도 많죠.
Go 언어의 매력은 무엇일까요? Go 언어를 사용하고 싶어 임베디드 개발자에서 백엔드 개발자로 전직한 20년 차 개발자, 이호민 님을 만났습니다. 4월 COMMIT에서 Go 언어에 대한 이야기를 들려주실 예정이에요. 그전에 Go 언어의 어떤 매력이 호민 님을 사로잡았는지 궁금해 이야기를 나눠봤습니다.
Q. 자기소개 부탁드립니다.
안녕하세요, 20년 차 개발자 이호민입니다. 작은 회사에서 임베디드 개발자로 시작해 5년 전쯤 카카오에 합류했어요. 지금은 카카오엔터프라이즈에서 백엔드 개발을 주로 하고 있습니다.
개발 언어는 C와 C++를 주로 사용했고 Go 언어에 정착한 지는 10년이 좀 넘었어요. 업무에 사용하기 시작한 건 4년 정도 됐고요.
Q. Go 언어를 만나게 된 계기가 궁금한데요, 어떤 점이 매력적이었나요?
Go 언어는 2010년 Google I/O에서 롭 파이크(Rob Pike)와 러스 콕스(Russ Cox)가 소개하는 영상으로 처음 접했어요. 당시에 C/C++를 사용하는 게 고통스럽던 상황이라 한 줄기 빛처럼 느껴졌습니다. 파이썬도 배워봤는데 임베디드에 사용하기에는 느리고 덩치가 커 부담스러웠거든요.
가장 마음에 들었던 첫인상은 코딩 컨벤션(Coding Conventions)이 통일되어있다는 점이었어요. C나 자바는 코딩 컨벤션을 맞추는 게 굉장히 소모적이라 고민이 많았습니다. Go는 코딩 컨벤션 도구가 기본 툴에 내장되어 있어 알아서 해결해주더라고요. 누가 써도 한 사람이 쓴 것 같은 코드로 유지되니 유지보수 비용이 상대적으로 낮습니다.
Go 언어는 네이티브 바이너리(Native Binary)를 만드는 컴파일 언어라 임베디드 시스템에서 사용하기에도 적합해 보였고, 파이썬처럼 풍부하고 견고한 기본 패키지를 갖추고 있다는 점도 매력적이었습니다. 언급하고 싶은 장점이 많네요.
Go에 대한 기대가 커서 2012년 첫 릴리즈 때부터 사용했습니다. 이걸 경력으로 삼고 싶어서 노력했고 지금은 주업으로 쓰고 있고요. 지금도 매우 만족스럽게 사용하고 있습니다.
Q. Go 언어를 잘 모르는 분들을 위해 소개해주세요.
2023년 3월 기준 Go 공식 홈페이지에 소개된 캐치프레이즈는 “Build simple, secure, scalable systems with Go”입니다. Go로 단순하고, 안전하며, 확장 가능한 시스템을 만들라는 의미죠. 요약하면 ‘simple’, ‘secure’, ‘scalable’인데요.
Go 언어는 다른 프로그래밍 언어에 비해 상대적으로 단순해 배우기 쉽습니다. 코드 가독성도 높아요(simple). 코드를 작성할 때 자주 하는 실수를 예방할 수 있는 장치도 많습니다(secure). 바이너리 용량이 작아 쿠버네티스를 통한 스케일 인/아웃도 유리해요(scalable). 워낙 잘 설계되어 있어 코드베이스가 커져도 전체 프로젝트가 복잡해지지 않습니다.
Go는 예약어(Keyword)가 25개로 매우 적은 편이에요. 15년 정도 된 언어인데 여전히 이 정도 예약어를 갖고 있다는 건 처음부터 언어가 잘 설계되었고, 관리도 잘 되고 있다는 걸 방증합니다.
Q. 조직에 Go 언어를 도입할 때 어떻게 설득하셨는지 궁금합니다. 반대나 우려는 없었나요?
제가 도입하던 시점은 이미 Go가 릴리즈된 지 10여 년이 지난 시점이었어요. 사내에 이미 Go를 사용하고 있는 몇몇 프로젝트가 있었고요. 덕분에 제가 Go로 컴포넌트(Component)를 만들고 싶다고 제안했을 때 흔쾌히 받아들여주셨습니다. 아마 사내에 성공 사례가 있어 Go 언어에 대한 평판이 나쁘지 않았기 때문인 것 같아요.
매번 강제로 설득하지는 않았고 제가 잘 쓰는 모습을 자주 보여주려고 노력했습니다. 프로젝트에 Go를 직접 쓰지는 않고, 도움이 되는 도구들을 Go로 만들어 공유했어요. 언어에 대한 거부감을 희석하려고요. 전체 시스템을 Go로 바꾸려고 하지 말고 Go가 어울리는 작은 부분부터 바꿔보면 좋습니다.
Q. 프로젝트에 Go를 써보려고 한다면 어떤 점을 고민하고 주의하면 좋을까요?
Go는 범용 프로그래밍 언어에 가깝지만 어울리지 않는 부분이나 레퍼런스가 부족할 때가 있습니다.
예를 들어 마이컴(Micro Controller)이나 리눅스 커널(Linux kernel)에는 어울리지 않아요. Go 컴파일러는 최적화가 잘 되어 있어 매우 작은 바이너리를 만들지만, 가비지 컬렉터(Garbage Collector)가 포함된 런타임을 제외할 수는 없습니다. C나 러스트에서는 표준 라이브러리조차 제외해 더 작고 납작한 바이너리를 만들 수도 있죠. 이런 곳에서는 C나 러스트를 써야 합니다.
인공지능이 막 뜨고 있죠. 텐서플로(TensorFlow)를 사용해 인공지능을 학습시키는 분야에서는 파이썬 레퍼런스가 지배적입니다. 이 거대한 유산을 Go로 다시 구현하는 건 특별한 장점이 없어요. 풍부한 유산을 활용할 수 있다면 알차게 써먹어야죠.
Q. Go로 진행했던 프로젝트 하나만 소개 부탁드립니다.
제 깃허브 Go 패키지 중 가장 별이 많은 건 한글의 자모 분해를 조합할 수 있는 패키지이고, 라즈베리파이 같은 SBC(Single Board Computer)에서 파이썬 대신 고를 사용한 메이킹 프로젝트들도 있어요.
업무로는 동시성 기능을 지원하는 미디어 서비스를 만들었고, 이 서비스는 현재 카카오엔터프라이즈 B2B 제품 중 하나의 컴포넌트로 쓰이고 있습니다.
Q. 프로젝트에서 Go를 써보니 어떠셨어요? 기대한 성과를 얻을 수 있었나요?
업무적으로는 PoC(Proof of Concept: 개념 증명)에서 끝나지 않고 제품까지 무사히 안착시킨 게 큰 성과였죠. 코드베이스가 커져도 복잡해지지 않는 Go의 장점도 확인할 수 있었고요.
Q. 아쉬웠던 점은 없었나요?
Go의 기본 라이선스가 BSD(Berkeley Software Distribution: 소프트웨어의 무료 사용, 수정 및 배포를 허용하는 오픈 소스 라이선스)라 비슷한 제품이 분명히 있을 텐데 개발하면서 참조할 만한 비교군이 없다는 게 어려웠습니다.
반대로 회사 입장에서는 오픈 소스를 사용한 자사 제품 코드를 공개해야 한다는 부담을 덜 수 있어 장점이기도 해요. 넷플릭스, 우버 등 Go를 사용하는 기업은 많은데 어디에 쓰는지 공개가 되지 않은 이유이기도 합니다. 패키지도 있고, 사용하는 사람들도 있는데 완성된 레퍼런스가 없다는 점이 아쉬웠습니다.
Q. 국내에서는 비교적 빨리 Go를 사용하신 편이죠. 주위에서 호민 님께 많이 물어볼 것 같은데요.
이 기능은 자바나 파이썬에서 이렇게 만드는데 Go에서는 어떻게 만드는지 여쭤보는 분들이 많았습니다. Go에서는 표준 패키지로 되는 경우가 많아요. 굳이 서드 파티(3rd Party) 패키지가 필요 없어서 대답하기 곤란한 경우도 종종 있었어요.
Q. Go로 경력을 쌓기 시작한 걸 후회한 적은 없나요?
저는 굉장히 만족하고 있어요. 돌아보면 위험한 선택이기도 했습니다. Go 언어를 쓰고 싶어서 Go 개발자를 채용하는 회사에 들어가려고 회사를 그만뒀으니까요. 번아웃도 겹쳤고요. 무작정 그만뒀지만 잘 됐으니 다행이지요. 운도 따라줬고요.
처음 Go를 선택할 때 그런 기대가 있었습니다. 지금 시작해서 10년쯤 지나면 아무리 못해도 경험을 무시할 수는 없을 거라고요. 오히려 많은 분이 사용하지 않는 게 저한테 기회가 될 수 있다고 생각했던 거죠. 잘하는 분이 많은 언어로는 당장 취업할 수는 있지만 두각을 나타내기는 힘들잖아요.
Q. 처음 프로그래밍을 배우는 분들에게도 Go 언어를 추천하시나요?
아니요. 파이썬처럼 더 쉽게 시작할 수 있는 언어가 있습니다. 저도 베이직(BASIC)으로 프로그래밍 언어를 처음 접했고요. 처음 배우시는 분들은 접근성이 좋고 흥미를 유발할 수 있는 언어를 선택하는 걸 추천합니다.
Q. 평생 단 하나의 프로그래밍 언어만 써야 한다면?
러스트(Rust)를 선택하겠습니다. 제대로 다루시는 분이 드물고, 잘한다면 하는 만큼 대우 받을 수 있을 것 같아서요. 하지만, 개발자로 생계를 이어가려면 평생 한가지 언어만 다루면 안 됩니다.
Q. 실력 있는 백엔드 개발자로 성장하려면 어떤 역량과 자질이 필요할까요?
저도 아직 대단한 성과를 만들지는 못했어요. 우선 리눅스와 컨테이너 기술은 교양 필수고요. 자바와 스프링 프레임워크를 오랫동안 써오다 보니 쌓인 유산들이 많아요. 필요에 따라 유연하게 활용하되 안주하지는 마세요. 프레임워크의 한계에 자신을 가두게 되거든요. 범용적인 기술은 수용하되 극단적으로 한쪽을 선택하기보다 트레이드오프(Trade-off)를 고려해 스위트 스폿(Sweet Spot)을 찾는 게 좋을 것 같습니다.
추가로 프론트엔드와 인프라 사이의 중간 다리 역할을 잘하면 좋습니다.
Q. Go 생태계는 앞으로 어떻게 발전할 거라고 생각하세요?
앞으로도 안정적으로 유지될 거라 믿고 있습니다. 10년 동안 그랬고요. Go는 이 언어를 사용하라고 광고하지 않아도 진가를 알아본 분들과 기업들이 잘 사용하고 있습니다. 2023년 3월 기준 TIOBE 10위에 랭크될 정도로 안정적인 사용층을 확보했고요.
Q. Go에 관심 있는 분들에게
모든 기술은 사용하기 전까지는 진가를 알 수 없습니다. 제가 아무리 말씀드려도 써보실 분들만 써보실 텐데요. Go는 앞으로 잘 될 언어가 아니라 이미 잘 되고 있는 언어입니다. 꼭 작은 프로그램이라도 만들어 보셨으면 좋겠어요.
최근에 Go 사용자 오프라인 모임에 갔는데 곧 한국에서 고퍼콘(GopherCon)이 열린다고 해요. 관심 있는 분들은 눈여겨보시면 좋을 것 같습니다. 저도 기대하고 있는 행사거든요.
Edit Sunny Design Lil