3P by neo 5달전 | favorite | 댓글 1개

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로 다시 작성"이라는 답변이 다른 옵션들을 배제함
  • 컴파일러를 자체 언어로 작성하는 것에 대한 의견

    • 자체 언어로 컴파일되지 않는 언어가 컴파일러 작성에 적합하지 않은지에 대한 질문 제기
    • 컴파일러에 적합한 언어가 다른 애플리케이션에 적합하지 않을 것이라는 함축에 대한 이해 부족과 더 많은 맥락 요구