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로 다시 작성"이라는 답변이 다른 옵션들을 배제함
-
컴파일러를 자체 언어로 작성하는 것에 대한 의견
- 자체 언어로 컴파일되지 않는 언어가 컴파일러 작성에 적합하지 않은지에 대한 질문 제기
- 컴파일러에 적합한 언어가 다른 애플리케이션에 적합하지 않을 것이라는 함축에 대한 이해 부족과 더 많은 맥락 요구