GN⁺: Go 언어: 우리가 올바르게 한 점과 잘못한 점
(commandcenter.blogspot.com)Go 언어의 오픈 소스 프로젝트 출시 14주년을 맞이하여
- Go 언어의 공동 창시자 중 한 명이 2023년 11월 10일 시드니에서 열린 GopherConAU 컨퍼런스에서 마지막 강연을 진행함.
- 강연에서는 Go 언어가 오픈 소스 프로젝트로 출시된 지 14년이 된 것을 기념하며, 그동안의 성공과 반성할 점들에 대해 논의함.
- 강연자는 Go 팀이나 구글을 대표하는 것이 아니라 개인적인 견해를 밝히며, Go 언어의 성공에 기여한 커뮤니티에 감사를 표함.
Go 언어의 성공 요인과 개선점
- Go 언어의 원래 목표는 새로운 프로그래밍 언어를 만드는 것이 아니라, 소프트웨어 작성 방식을 개선하는 것이었음.
- Go 언어는 의존성 관리, 대규모 팀과의 협업, 유지 보수의 용이성, 효율적인 테스팅, 멀티코어 CPU 및 네트워킹의 효과적 사용 등 현대 서버 소프트웨어 구축의 복잡성을 해결하고자 함.
- Go 언어는 단순히 프로그래밍 언어가 아니라, 생산 소프트웨어를 더 쉽고 생산적으로 구축하는 프로젝트임.
Go 언어의 마스코트, 고퍼
- Go 언어의 마스코트인 고퍼는 Go 언어의 성공에 중요한 역할을 함.
- 고퍼는 Go 프로그래머들의 상징이자 커뮤니티의 깃발로, 프로젝트의 성장에 필수적이었음.
- 고퍼 디자인을 Creative Commons Attribution 라이선스로 공개한 것은 커뮤니티 정신을 촉진하는 데 도움이 되었지만, 저작권 문제로 인한 어려움도 있었음.
Go 언어의 기술적 성공 요인
- 공식 명세서의 작성, 다중 구현체의 존재, 이식성, 호환성 보장, 풍부한 라이브러리, 도구 개발의 용이성, 자동 코드 포맷팅 도구인
gofmt
등이 Go 언어의 성공에 기여함. -
gofmt
는 프로그래밍 커뮤니티 전반에 영향을 미쳐, 대부분의 언어가 표준 포맷터를 갖게 되는 계기를 마련함.
동시성(Concurrency)과 인터페이스
- Go 언어는 동시성을 언어의 주요 구성 요소로 삼아, 서버 소프트웨어 구조를 단순화하는 데 기여함.
- 인터페이스는 Go 언어의 특징적인 아이디어로, 객체 지향 설계에 대한 Go의 대답이며, 표준 라이브러리와 의존성 관리 등에 중요한 역할을 함.
제네릭스(Generic)과 컴파일러
- 인터페이스의 존재는 Go 언어에 제네릭스를 추가하는 데 오랜 시간이 걸린 원인 중 하나임.
- 초기 Go 컴파일러가 C로 작성된 것은 프로그래밍 언어 커뮤니티에서 논란의 대상이었으나, Go 언어의 발전에는 적합한 선택이었음.
프로젝트 관리와 패키지 관리
- Go 언어는 오픈 소스 프로젝트로서 개발 초기에는 비공개로 진행되었으나, 공개 전환 후 커뮤니티의 기여가 폭발적으로 증가함.
- 패키지 관리 개발 과정은 원활하지 않았으며, 커뮤니티와의 협업 방식에 대한 이해가 부족했음.
문서화와 예제
- 초기 Go 언어 문서화는 커뮤니티의 기대에 부응하지 못했으나, 실행 가능한 예제를 웹에서 제공하는 등 개선되었음.
GN⁺의 의견
- Go 언어의 성공은 강력한 표준 라이브러리, 동시성 지원, 인터페이스 기반의 설계, 명확한 패키지 관리, 빠른 빌드 및 테스팅 도구, 일관된 코드 포맷팅, 가독성 중시, 호환성 보장 등의 요소들에 기인함.
- Go 언어는 프로그래밍 언어로서의 기능뿐만 아니라, 소프트웨어 개발 방식에 혁신을 가져왔으며, 이는 커뮤니티의 다양성과 지원 덕분임.
- Go 언어의 개발 과정과 그에 대한 반성은 오픈 소스 프로젝트를 운영하는 데 있어 중요한 교훈을 제공함.
Hacker News 의견
-
프로젝트 회고에 시간을 할애하는 핵심 인물들에 대한 감사함
- 시스템 프로그래밍에 초점을 맞춘 언어 제한
- 언어와 원칙을 명확히 정의하여 모호함과 목적이 다른 설계 낭비 방지
- 품질을 우선시하여 문제를 배포 전에 해결하는 것이 모든 이해관계자에게 저렴함
- 커뮤니티 공유와 엄격한 언어 및 릴리스 관리의 균형 유지
- 구글의 비개입이 Go의 성공에 기여했으며, 이는 다른 프로젝트에서도 가능한지 의문 제기
- Go가 서버 측 소프트웨어를 자바에서 네이티브 컨테이너로 이동시키는 핵심 기술이었으며, 지난 10년간 웹 애플리케이션 인프라의 대부분을 지원함
-
Go 언어와 커뮤니티에 대한 애정
- 2012년 파이썬 개발자로서 Go를 접하고 비트 조작의 용이성에 놀람
- 10년 후 여전히 Go의 대부분의 기능이 잘 작동하는 것에 놀라움
- Rob, Ian, Russ 등이 Go를 위해 한 일과 커뮤니티와의 "도로의 울퉁불퉁함"에 대한 솔직함에 감사
- 패키지 관리 문제에 대한 비판적인 시각도 있지만, 현재 좋은 해결책에 도달했다고 평가
-
Go의 패키지 관리 시스템에 대한 비판적인 경험 공유
- 10년 전 go-nuts에서 Go의 패키지 관리 방식에 대해 비판적인 의견을 제시했을 때 Rob Pike로부터 무시당한 경험
-
Go 언어에 대한 비판적인 시각
- 언어의 깊은 문제에 대한 인정 부족
- 타입 시스템, 에러 처리, 안전하지 않은 동시성, 단순한 문법 등으로 인해 Go를 추천하지 않음
- Rust를 주 언어로 사용하며, Go가 가지지 못한 비전을 Rust에서 발견함
-
Ken Thompson의 C 컴파일러 사용 결정에 대한 흥미로운 점
- LLVM 대신 Ken Thompson의 C 컴파일러를 사용한 결정에 대한 불만과 초기 버전의 최적화되지 않은 코드 생성에 대한 언급
- 이 결정으로 인해 세그먼티드 스택을 빠르게 구현할 수 있었음
-
gofmt의 성공적인 도입에 대한 강조
- 프로젝트 초기부터 코드 포맷에 대한 논쟁을 완전히 제거하여 큰 가치를 제공함
- 여러 새로운 언어가 gofmt를 모방하거나 비슷한 도구를 만드는 것을 보임
-
GopherConAU 주최자로서 전체 재생 목록 공유
- 재생 목록을 공개할 수 없는 이유를 모르겠음
-
Go를 사용하여 모노레포를 쉽게 만들고 앱을 빠르게 빌드할 수 있는 장점
- Go로 CLI 도구를 만들기 쉽고 유닉스 파이프라인의 일부로 사용할 수 있음
- Go가 대용량 로그 분석 등에 유용함
-
Go의 상호 운용성과 C FFI에 대한 선택 언급 부족
- "Go로 다시 작성"이라는 답변이 다른 옵션들을 배제함
-
컴파일러를 자체 언어로 작성하는 것에 대한 의견
- 자체 언어로 컴파일되지 않는 언어가 컴파일러 작성에 적합하지 않은지에 대한 질문 제기
- 컴파일러에 적합한 언어가 다른 애플리케이션에 적합하지 않을 것이라는 함축에 대한 이해 부족과 더 많은 맥락 요구