본문으로 건너뛰기

Go 언어 어디에 써야 할까? - 컨프런스 방문

· 약 18분
arch-spatula

golang 컨프런스를 다녀왔습니다. 하루 쉰다는 생각으로 다녀왔습니다.

주의

저의 필기는 주관적이고 불친절합니다. 그리고 저만의 용어를 사용해서 부정확한 내용이 있을 것입니자. golang 기본문법과 아주 약간의 고루틴 개념만 갖고 있는 사람이 작성한 글입니다.

컨프런스 포스터

컨프런스 소개

  • 여기 컨프런스를 다녀왔습니다. 다음은 세미나 혹은 golang 전도를 듣고 필기한 내용입니다.

  • 오늘 세미나는 1시간 강의 30분 질의응답입니다.

  • 이제 이호민 카카오엔터프라이즈 개발자의 발표입니다.

이호민 선생님의 발표

  • 기술적으로 깊은 발표는 아닙니다. Golang 테크트리를 타게된 이야기입니다. 경력 20년차입니다.

  • 휴대폰, 임베디드, 백엔드 커리어 패스를 갖고 있습니다. 안드로이드에는 2개 커밋과 리눅스 1개의 커밋이 있습니다. 개인 레포 100개의 토이프로젝트가 많이 있습니다. 7년 전에 Golang과 IoT 연구도 했습니다.

  • BASIC으로 처음 프로그래밍을 경험했습니다. C, C++로 고통받았습니다.

  • 파이썬도 공부했습니다.

  • Golang은 1주일이면 문법을 다 배웁니다. 좋은 기본 패키지가 많습니다. Golang답게 사용하는 것은 자주 사용하면서 익히게 됩니다.

  • Bash 종종 사용합니다.

  • JavaScript, Dart는 테스트용 언어를 가끔했습니다.

  • Rust는 현학적인 언어였습니다. 학습할 가치가 있는 언어는 맞습니다.

  • 파이썬 초창기부터 사용했습니다.

    • 파이썬은 C언어랑 다르게 기본 라이브러리에 많은 기능이 있었습니다. 당시 이야기였습니다.
    • 써드-파티 패키지도 다양했습니다.
    • 업무 자동화가 달달했습니다.
    • 멀티 플랫폼 언어였습니다. 대부분 돌아갔습니다.
    • 취업 후 첫 업무는 휴대폰 소스 코드를 중국어 영어를 복붙하는 업무였습니다. 스크립트로 자동화하고 뽕맛을 봤습니다.
    • 당시 하드웨어는 파이썬 인터프린터를 수용하기 어려웠습니다.
    • 머신러닝 엔지니어들이 많아지면 파이썬 개발자의 몸값이 급등했습니다.
  • Go언어를 접했습니다.

    • 2009년에 첫 발표를 했습니다.
    • 사용은 2013년부터 사용하기 시작했습니다.
    • 오픈소스 라이센스에서 GPL이 하이리스크 하이리턴입니다. 부분만 사용해도 전체를 공유해야 하는 제약이 있습니다.
    • BSD는 언어 제약이 자유롭습니다.
    • 가비지 컬렉터도 있고 개선도 되었습니다.
    • 2021년에 M1 대응도 가능합니다.
    • 최근에는 제네릭을 지원하기 시작했습니다.
  • 다른 언어의 단점을 개선하는 것이 목표입니다.

    • 코드가독성, 복잡성을 줄이고자 합니다.
    • 컴파일 시간이 짧아 생산성이 높습니다.
    • 동시성을 기본적으로 제공합니다. go 루틴이 내장되어 있어서 쓰레드랑 비슷하게 동작합니다.
    • 파이썬에 비슷한 라이브러리를 갖고 있습니다.
  • 고루틴이 쓰레드보다 가볍습니다. 고루틴은 무한한 자원비슷하게 사용하면 됩니다. 또 채널로 자원공유도 가능합니다.

  • 컴파일 언어답게 시작이 빠릅니다. 메모리 사용량이 작습니다. 자바는 VM을 사용해서 은근히 소모가 있습니다.

  • MSA로 인기가 많습니다.

  • 10년전에 go언어를 선택한 이유들입니다.

    • 쉽습니다. 튜토리얼 따라하면 기본문법을 금방 학습할 수 있습니다.
    • 생산성이 높습니다.
    • Go팀은 구글에서 지원을 잘해주고 있습니다.
    • Go언어 마스코트가 간지납니다. 어그로도 실력입니다. 롭파이크의 부인이 일러스트레이터인데 그려주셨다고 합니다.
    • 업으로 하는 사람은 은근히 찾기 어렵습니다.
    • 개발하는 과정이 재미있었습니다.
  • 파이썬으로 만든 도구를 포팅해봤습니다.

  • 코딩테스트를 Go 언어로 풀기 시작했습니다.

  • golang 한글 패키지를 만들었습니다.

  • 임베디드 개발자였지만 백엔드 포지션으로 스위칭을 시도했습니다.

    • Go는 우대사항이였습니다.
    • 스프링을 할 줄 아는 사람이 Go를 배우는 속도가 더 빠릅니다.
  • Go가 어울리는 업무들을 경험해봤습니다.

    • 암호화, 저수준 네트워크, 동시성 지원이 필요했습니다. 자바를 포팅해야 했습니다.
    • 일정도 도전적이었습니다.
    • 3년 전이었습니다.
    • 성공 사례가 쌓이면서 규모가 커졌습니다.
  • 스마트 스피커 OTA클라이언트, Factory Test 서버를 Golang으로 만들었습니다. 리눅스만 있으면 go를 실행할 수 있습니다.

  • 넷플릭스의 인코딩/디코딩 비슷한 업무를 처리했습니다. 고루틴으로 처리했습니다. 여기는 음성이었습니다. 동시성 프로그래밍을 많이 하지 않으면 실수가 많아집니다. 가비지 컬랙터가 있어도 메모리 누수가 발생합니다.

    • golang은 옵저빌리티 기능이 있습니다. 누가 누수를 발생시킬 수 있는 기능이 내장되어 있습니다.
  • 클라이언트를 위한 웹 API 서버도 만들었습니다.

  • 크로스 컴파일러가 내장되어 있습니다.

  • 컨테이너이미지를 지원합니다. 바이너리 하나있는 정도로 빌드가 가능합니다.

  • SBC 하드웨어 제어도 가능합니다.

  • 현재 go 개발자 설문조사 링크입니다.

  • 중국에 golang을 많이 사용합니다. 신기하게 구글과 github을 접근할 수 없는데 사용하고 있습니다.

  • 대부분 응답자는 1 ~ 5년 커리어를 갖고 전문적인 작업에 사용하고 있습니다.

  • golang 언어는 성능이 좋은 편입니다. 자바랑 비슷합니다.

  • 예약어 수가 작습니다. 실용적인 프로그래밍 언어에서 작은 편입니다.

  • 단점도 있습니다. 패키지 의존성 문제입니다. 모든 프로그래밍 언어의 문제입니다.

  • go mod로 거의다 추상화되었습니다.

  • go 디버거도 있습니다. go를 처음부터 사용하기 보다는 다른 언어를 배우다가 넘어오는 경우가 많아서 델브를 사용해볼 일이 많지 않았습니다. 패키지 생태계 개선이 필요합니다. 중앙화된 패키지 시스템이 없습니다. 그냥 github 링크만 넣으면 끝입니다. github을 레포를 삭제하면 큰일날 수 있습니다. 자주발생하지 않습니다.

  • 대부분의 개발자는 더 사용하려고 합니다.

  • 최근에 제네릭이 포함되었습니다.

    • 언어의 창시자는 필요없었다고 생각했습니다.
    • 제네릭을 사용할 때 제네릭을 사용하고 있는지 모르게 설계를 했습니다. 그만큼 언어 설계가 잘 되었습니다.
  • 퍼징 테스트에 대한 인식이 부족합니다.

    • 퍼징테스트는 발표자인 저도 몰랐습니다.
  • 패키지에 보안관련 문제를 어떻게 파악할 수 있는가? 요즘 github에는 알려주기는 합니다.

    • try-catch가 없어서 코드가 길어지고 추적이 쉽습니다. 설문에 에러처리에 대한 요구가 많아졌습니다.
  • golang으로 모든 것을 처리하려고 하면 곤란합니다. 모바일, 게임 개발도 한 사례는 존재합니다.

  • GUI 패키지는 존재하기는 어렵습니다.

  • TinyGo로 WASM을 사용한 경우도 있지만 더 편안한 Rust로 해결하는 게 좋습니다.

  • 멀티 플랫폼, 일반 목적을 지향해야 합니다. 테크 트렌드 변화가 엄청나게 빠릅니다. 여기도 예외가 아닙니다.

    • 리눅스는 교양 필수입니다.
    • 도커, k8s도 교양 필수입니다.
    • 코파일럿 이제는 사용하도록 합니다.
    • A tour of Go로 대부분 해결됩니다.

Q & A

  • Golang vs Rust

    • go가 더 실용적입니다. Rust는 러닝커브가 높습니다. 비용도 더 적습니다. 극한의 성능과 사이즈가 필요하면 Rust가 적합합니다.
    • 하지만 어떤 언어를 배워도 전산학의 모든 개념을 배우기 때문에 Rust는 교양으로 반드시 학습하기 바랍니다. the Rust Book이 아주 잘 다룹니다.
  • go는 특정 패키지 의존하지 않고 괜찮은 웹서버를 만들 수 있습니다. 만약 필요하면 진을 권장합니다. 비용 때문에 golang으로 포팅하는 경우가 많습니다. 클라우드에 비용이 작으니까 인기가 많습다.

  • 공부 방향 팁입니다. 학습하는 시기와 환경이 달라 답변에 편향이 있을 수 있습니다. 언어 자체는 코테 문제 풀면 좋았습니다. go 언어는 코테 답이 없는 경우가 많았습니다. 언어는 기본 패키지를 잘 사용하도록 합니다.

  • 고루틴은 어떤 상황에 사용하는 것이 좋은가? 동시성?이라는 말이 나오면 바로 사용하면 됩니다.

  • go언어는 포인터 개념이 있습니다. 다행이 이중 3중 포인터가 없습니다. 이것은 C언어로 배우도록 합니다.

  • error wrapping은 코파일럿으로 처리합니다.

  • 한국에서 golang으로 취업하고 싶으면 golang 코리아 페이스북을 확인하도록 합니다.

  • 엔터프라이즈에서는 웹 서버보단 MSA로 만들기 적합합니다. 모노리스는 어떤 언어로 구현하면 힘듭니다.

  • 고루틴은 많이 사용해도 문제 없습니다. 동시성 조짐이 조금만 보이면 바로 사용합시다.

  • GUI 개발은 더 좋은 대안이 많습니다.

  • go 커뮤니티가 많이 활성화 되어 있습니다.

  • golang도 TDD도 지원합니다. 추천한 튜토리얼에 있습니다. 또 테스트할 라이브러리도 내장도 되어 있습니다.

  • 경력 개발중에 읽었던 책 중에 영향을 많이 받은 책은 디자인 패턴 익스플레인드, 리팩토링이 도움을 많이 줬습니다. 자바와 자바스크립트로 작성되어 있습니다. 리팩토링 책은 누구나 리팩토링한다는 자신감을 줬습니다. 리팩토링으로 삶이 나아지는 점이 중요합니다.

    • golang으로 서비스를 만들 때 설계는 간단하게 하고 MVP를 빠르게 뽑는 방법을 추구합니다.
  • golang의 최대 장단점입니다. 대부분 무엇이든 일로 하면 재미없어집니다. 하지만 golang의 장점은 여전히 일할 때도 재미있게 사용할 수 있습니다. 생산성이 높습니다. 단점은 한국은 스프링의 나라입니다. 스프링만의 단어를 모를 때가 많습니다. 또 그 노하우을 못 받습니다. go로 쌓여있는 노하우가 별로 없습니다. 설명해줄 구루들이 별로 없습니다.

  • 네트워크 프로그래밍에도 많이 활용합니다.

  • 대부분의 IO 컨트롤까지 go로 작성되어 있고 표준 라이브러리 코드만 봐도 학습이 잘 됩니다. 모든 패키지에는 다 테스트 코드가 붙어있습니다.

  • Rust는 사용하는 것 자체로 가치가 있습니다. c, c++같은 경험을 다시할 수 있습니다. Rust의 한계는 개발자가 비쌉니다.

  • VScode로 IDE를 사용하고 있습니다. go 기본 툴로 충분합니다. goland가 더 정적분석을 잘해줍니다.

  • golang은 코딩 컨벤션에 대한 논박이 사라졌습니다. 파이썬도 이런점이 좋았습니다.

  • go를 안쓰는 곳을 찾는 것도 은근히 어렵습니다.

  • MSA로 30개 정도 배포하고 있습니다. 이정도는 개인적으로 큰 것 같습니다.

  • 고루틴은 틀리면서 배웠습니다. 동시성 공부를 책으로 공부하려고 했는데 책은 별 도움 안 되었습니다.

  • golang은 유지보수하기 좋습니다.

후기

Go 언어를 써보고 싶지만 망설이는 당신에게, 카카오엔터프라이즈 개발자 이호민

제일 멀리온 기념품

  • 천안에서 컨프런스 참여를 위해 하루 즐겁게 보냈습니다. 감사합니다.