Go의 철학

Dave CheneyThe Zen of Go를 번역했습니다. 좀 더 알고 싶으신 분은 발표 영상블로그 글을 함께 참고해 주십시오.


Go의 철학

쉽고, 읽기 좋으며, 유지가능한 Go 코드 작성을 위한 10가지 엔지니어링 가치. 고퍼콘 이스라엘 2020에 발표하였음.

패키지는 하나의 목적만을 달성합니다

잘 디자인된 Go 패키지는 단 하나의 아이디어와 관련 동작을 제공합니다. 좋은 Go 패키지를 위해 좋은 이름을 먼저 정해야 합니다. 엘리베이터 피치라고 생각하며 패키지 이름을 정해보십시오.

에러는 명시적으로 처리합니다

단단한 프로그램은 문제가 생기기 전에 실패처리를 하는 요소들로 이루어져 있습니다. 실패를 발생지점에서 의도적으로 처리할 수 있다는 것은 if err != nil { return err } 의 장황함마저 대수롭지 않아 보이게 합니다. panicrecover는 예외가 아니며, 그런 식으로 사용되게 의도되지 않았습니다.

빨리 반환하고 깊은 들여쓰기를 피합니다

들여쓰기는 프로그래머에게 7 ± 2개만 있는 단기 기억력을 소비하게 강요합니다. 깊은 들여쓰기를 필요로 하는 제어흐름은 피합니다. 가드를 이용해서 성공처리를 왼쪽에 유지해주십시오.

동시성은 호출자에게 맡깁니다

라이브러리나 함수의 비동기 실행 여부를 호출자가 선택하게 하십시오. 라이브러리가 동시성을 사용할 경우 이것은 투명하게 드러나야 합니다.

고루틴 시작 전, 언제 멈출지 알아야 합니다

고루틴은 락, 변수, 메모리 등의 자원을 소유합니다. 자원을 확보하는 확실한 방법은 고루틴을 중지하는 것입니다.

패키지 레벨 상태를 사용하지 않습니다

패키지 레벨 상태를 사용하지 않고 타입의 필드로 상태를 제공하여, 명시적이고 결합이 적고 안정적인 동작을 추구하십시오.

단순함은 중요합니다

단순함은 세련되지 않은 것과 동의어가 아닙니다. 단순함은 조잡함이 아니라, 읽고 유지할 수 있다는 뜻입니다. 선택할 수 있는 가장 단순한 솔루션을 사용하십시오.

패키지 API의 동작을 고정하기 위한 테스트를 작성합니다

패키지 API를 테스트하는 것은 사용자와의 약속입니다. 테스트는 그런 약속이 유지됨을 보장합니다. 사용자가 테스트를 확인하고 그것에 의존할 수 있게 작성해주십시오.

느리다고 생각된다면, 벤치마크하여 이를 증명합니다

유지보수성에 대한 많은 범죄가 성능의 이름으로 생깁니다. 최적화는 추상화를 해제하고, 내부를 노출하며, 결합을 강하게 합니다. 비용을 부담하기로 결정했다면, 정당한 이유가 있는지 확인하십시오.

중용은 미덕입니다

고루틴, 채널, 락, 인터페이스, 임베딩을 조화롭게 사용하십시오.

유지보수성은 가치있습니다

명확성, 가독성, 단순성은 모두 유지보수성의 다른 표현입니다. 당신이 애써 만든 것이 당신이 떠난 후에도 유지될까요? 다음 사람을 위해 오늘 무엇을 하실 수 있습니까?