이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 10198|회답: 1

Go 프로그래밍의 장단점

[링크 복사]
게시됨 2019. 5. 27. 오전 9:57:10 | | |
바둑 언어는 얼마나 인기가 있나요? 구글, AWS, 클라우드플레어, 코어OS 등 외국 국가들과 치니우, 알리바바 같은 국내 기업들이 대규모 클라우드 컴퓨팅 제품 개발을 위해 고(Go) 언어를 사용하기 시작했습니다. 바둑 언어를 사용할 때 주의해야 할 예와 부(但)은 무엇인가요?

최근에는 2009년 구글이 출시한 오픈 소스 프로그래밍 언어인 Go 언어를 사용해 API를 작성했습니다. Go를 개발에 사용하면서 많은 경험을 쌓았고, 독자들과 나누고자 이 글을 준비했습니다.

프로젝트를 위해 프로그래밍 언어를 선택할 때는 어떤 프로그래밍 언어로 빌드할지 결정하기 전에 프로젝트가 어떤 언어로 빌드할지 미리 이해하는 것을 항상 권장합니다. 제품이 어떻게 만들어져야 하는지에 결정적인 요소가 되도록 하세요.

다음은 Go로 개발할 때 발견한 장단점들로, 다음 프로젝트에 적합한지 이해하는 데 도움이 될 것입니다.

우리가 바둑을 사랑하는 점

최근 몇 년간 바둑 언어의 사용이 폭발적으로 증가했습니다. 대부분의 스타트업이 백엔드 시스템에 사용하는 것 같습니다. 개발자들이 이 게임을 이렇게 인기가 높다고 여기는 데에는 여러 이유가 있습니다.

바둑 언어는 매우 빠릅니다

Go는 매우 빠른 프로그래밍 언어입니다. Go는 기계어로 컴파일되기 때문에, 설명형 프로그래밍이나 가상 런타임을 가진 프로그래밍 언어보다 자연스럽게 더 뛰어난 성능을 냅니다. Go 프로그램들은 컴파일도 매우 빠르고 매우 작은 바이너리를 생성합니다. 저희 API는 단 몇 초 만에 컴파일되어, 실행 파일 크기가 11.5MB에 불과합니다.

쉽게 마스터할 수 있습니다

바둑 언어의 문법은 다른 언어에 비해 단순하고 이해하기 쉽습니다. Go의 문법 대부분을 머릿속으로 외울 수 있어서 찾는 데 많은 시간을 쓸 필요가 없습니다. 바둑 언어도 매우 깔끔하고 읽기 쉽습니다. 특히 C 스타일 문법에 익숙한 비Go 프로그래머들은 Go 코드 코드를 읽고 무슨 일이 일어나는지 이해할 수 있습니다.

정적 타입 정의 언어

Go는 강력한 정적 타입 정의 언어입니다. int, byte, string 같은 기본 타입이 있습니다. 구조물의 종류도 있습니다. 강력한 타입 언어와 마찬가지로, 타입 시스템은 컴파일러가 전체 클래스의 오류를 포착하는 데 도움을 줍니다. Go 언어는 내장된 리스트 및 매핑 타입도 가지고 있으며, 사용하기도 쉽습니다.

인터페이스 유형

Go 언어는 인터페이스 타입을 가지며, 어떤 구조든 인터페이스를 구현함으로써 인터페이스를 만족시킬 수 있습니다. 이렇게 하면 코드 내 의존성을 분리할 수 있습니다. 그 후 테스트에서 의존성을 시뮬레이션할 수 있습니다. 인터페이스를 사용하면 더 모듈화되고 테스트 가능한 코드를 작성할 수 있습니다. Go 언어는 또한 일류 함수를 가지고 있어 개발자가 보다 실용적인 방식으로 코드를 작성할 수 있게 합니다.

표준 라이브러리

Go 언어에는 꽤 괜찮은 표준 라이브러리가 있습니다. 기본 타입을 처리하는 편리한 내장 기능을 제공합니다. 일부 패키지는 웹 서버 구축, I/O 처리, 암호화 사용, 원시 바이트 조작을 쉽게 할 수 있게 해줍니다. 표준 라이브러리가 제공하는 JSON 직렬화 및 역직렬화는 매우 간단합니다. "tags"를 사용하면 구조체 필드 옆에 JSON 필드 이름을 지정할 수 있습니다.

테스트 지원

테스트 지원은 표준 라이브러리에 내장되어 있으며 추가적인 의존성이 필요하지 않습니다. thing.go라는 파일이 있다면, thing_test.go라는 다른 파일에 테스트를 작성하고 "go test"를 실행하세요. Go는 이 테스트를 신속하게 수행합니다.

정적 분석 도구

Go 언어용 정적 분석 도구는 다양하고 강력합니다. 특히 gofmt라는 도구가 있는데, Go가 제안한 스타일에 따라 코드를 포맷합니다. 이로 인해 프로젝트의 많은 의견이 정상화되어, 팀 수상 관리자가 코드가 수행한 작업에 집중할 수 있습니다. 각 빌드마다 gofmt, golint, vet을 실행하고, 경고가 있으면 빌드가 실패합니다.

가비지 컬렉션

Go 언어를 설계할 때, 메모리 관리는 의도적으로 C와 C++보다 더 쉽게 설계되었습니다. 동적 할당의 대상은 가비지 컬렉션입니다. Go 언어는 포인터 연산을 허용하지 않기 때문에 포인터 사용을 더 안전하게 만듭니다. 가치 유형 사용 옵션도 제공됩니다.

더 쉬운 동시성 모델

동시 프로그래밍은 결코 쉽지 않지만, Go는 다른 언어보다 병행 프로그래밍이 쉽습니다. "goroutine"이라는 가벼운 스레드를 만들고 "channel"을 통해 통신하는 것은 거의 간단한 작업이지만, 더 복잡한 모델에서는 가능합니다.

우리가 Go에서 싫어하는 점

앞서 논의했듯이, Go는 정말 훌륭한 언어입니다. 문법이 깔끔하고 실행도 빠릅니다. 또한 많은 장점이 있습니다. 하지만 프로그래밍 언어 전체가 단순히 문법만을 참조하는 것은 아닙니다. 우리가 겪었던 몇 가지 문제점들을 소개합니다.

제네릭은 없습니다

첫째, 이 문제는 마치 방 안의 코끼리처럼 명백하고 간과되는 사실입니다. Go 언어에는 제네릭이 없습니다. 자바 같은 언어를 사용하는 개발자들에게 Go로 전환하는 것은 극복해야 할 큰 장애물입니다. 이는 코드의 재사용 수준이 줄어든다는 뜻입니다. Go 언어는 일류 함수를 가지고 있지만, "map", "reduce", "filter"와 같이 한 유형의 집합에 대해 작동하도록 설계된 함수를 작성하면, 이 함수들을 다른 종류의 집합에 재사용할 수 없습니다. 이 문제를 해결하는 방법은 여러 가지가 있지만, 모두 더 많은 코드를 작성하게 되어 생산성과 유지보수 가능성이 떨어집니다.

인터페이스는 암묵적입니다

인터페이스가 있다는 점은 좋지만, 구조는 인터페이스를 명시적으로 구현하기보다는 암묵적으로 구현합니다. 이것이 Go 언어의 강점 중 하나로 알려져 있지만, 구조만으로는 인터페이스를 구현했는지 판단하기 어려웠습니다. 프로그램을 컴파일해보지 않고만 진정으로 이해할 수 있습니다. 프로그램이 작다면 전혀 문제가 없습니다. 하지만 이 프로그램이 중대형 규모라면 문제는 큽니다.

도서관 지원 부족

Go 도서관 지원은 고르지 않습니다. 저희 API는 Contentful과 연동되지만, Contentful은 공식적으로 지원되는 Go SDK가 없습니다. 즉, 우리는 글을 써야 하고(그리고 유지 보수!) Contentful에서 데이터를 요청하고 파싱하는 코드가 많아요. 또한 서드파티 Elasticsearch 라이브러리에도 의존해야 합니다. 벤더에서 제공하는 Go SDK는 Java, Ruby, JavaScript SDK만큼 인기가 많지 않습니다.

지역사회와의 소통은 어렵습니다

바둑 커뮤니티는 제안을 받지 않을 수 있습니다. golint의 GitHub 저장소에서 이런 내용을 생각해 보세요:하이퍼링크 로그인이 보입니다., 한 사용자가 golint가 경고를 발견했을 때 빌드에 실패할 수 있도록 요청했습니다(프로젝트에서 그렇게 합니다). 수호자들은 즉시 그 생각을 일축했다. 하지만 너무 많은 사람들이 이 문제에 대해 의견을 달아주었고, 1년이 지난 후에야 유지보수자들이 요청한 기능을 추가해야 했습니다.

Go 커뮤니티도 웹 프레임워크를 좋아하지 않는 것 같습니다. Go 언어의 HTTP 라이브러리는 여러 측면을 다루지만, 경로 매개변수, 입력 검사, 검증을 지원하지 않으며, 웹 애플리케이션에서 흔히 볼 수 있는 교차 절단 문제도 지원하지 않습니다. 루비 개발자는 Rails를, Java 개발자는 Spring MVC, 파이썬 개발자는 Django를 사용합니다. 하지만 많은 Go 개발자들은 프레임워크 사용을 피합니다. 하지만 현실은 틀이 전혀 없는 것이 아니라, 오히려 많은 틀이 존재한다는 것입니다. 하지만 프로젝트에 프레임워크를 사용하기 시작하면, 포기되는 운명을 피하는 것은 거의 불가능합니다.

단편화된 의존성 관리

오랫동안 Go 언어에는 안정적이고 공식적인 패키지 관리자가 없었습니다. 수년간의 커뮤니티 간청 끝에, Go 프로젝트는 최근에야 Godep을 출시했습니다. 그 전에도 이미 이 공백을 메우기 위한 많은 도구가 있었습니다. 저희 프로젝트에는 매우 강력한 GoVendor를 사용하지만, 이로 인해 커뮤니티가 분열되어 있어 Go 언어에 익숙하지 않은 개발자들에게는 매우 혼란스러울 수 있습니다. 또한 거의 모든 패키지 관리자는 Git 저장소로 구동되며, Git 저장소의 역사는 언제든지 변경될 수 있습니다. Maven Central과 비교해 보세요. Maven은 프로젝트가 의존하는 라이브러리를 삭제하거나 변경하지 않습니다.

Go를 사용할지 말지 결정하세요

가끔은 기계에 대해 생각해야 할 때가 있습니다. 비트를 주고받을 때. 수천 개의 동시 프로세스를 관리할 때, 운영체제, 컨테이너 시스템, 블록체인 노드를 작성할 수도 있습니다. 이런 경우에는 아마도 제네릭 약에 신경 쓰지 않을 것입니다. 칩에서 나노초 단위 성능을 짜내느라 바쁘기 때문입니다.

하지만 많은 경우, 인간에 대해 생각해야 합니다. 다뤄야 할 사업 분야 데이터: 고객, 직원, 제품, 주문. 이 도메인 엔티티에서 작동하는 비즈니스 로직을 작성해야 하며, 이 비즈니스 로직을 수년간 유지해야 합니다. 그리고 변화하는 요구에 대응해야 하며, 빠를수록 좋습니다. 이런 경우에는 개발자의 경험이 중요합니다.

Go는 인간의 시간보다 기계 시간을 더 중요하게 여기는 프로그래밍 언어입니다. 때로는 당신의 분야에서 기계나 프로그램 성능이 가장 중요할 때가 있습니다. 이런 경우 Go는 좋은 C 또는 C++ 대안이 될 수 있습니다. 하지만 일반적인 n-티어 애플리케이션을 작성할 때는 데이터베이스에서 성능 병목 현상이 자주 발생하며, 더 중요한 것은 데이터를 어떻게 모델링할지에 관한 문제입니다.

바둑 언어를 사용할지 결정할 때는 다음과 같은 경험 법칙을 고려하세요:

  • 만약 bytes를 다룬다면 Go 언어가 좋은 선택일 수 있습니다.
  • 데이터를 다루는 경우라면 Go 언어가 적합하지 않을 수 있습니다.


이 상황은 언젠가 바뀔 수도 있습니다. 바둑 언어와 커뮤니티는 아직 젊습니다. 그들은 제네릭 추가로 우리를 놀라게 할 수도 있습니다; 또는 인기 있는 웹 프레임워크가 큰 승리를 거둘 수도 있습니다. 하지만 당분간은 보편적인 지원, 성숙한 의존성 관리, 비즈니스 도메인 모델링에 중점을 둔 성숙한 프로그래밍 언어를 고수할 것입니다.





이전의:Common.LoggingLog 구성
다음:c# 디스쿠즈 포스트
게시됨 2019. 5. 27. 오전 10:09:35 |
비록 Go와 많이 접하지는 않았지만, 잘 쓰여졌어요
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com