원문: Effective Scala - Introduction
스칼라는 트위터에서 사용되는 주요 애플리케이션 프로그래밍 언어 중 하나입니다. 우리의 많은 인프라가 스칼라로 작성되었으며, 이 언어를 활용하기 위해 여러 대규모 라이브러리들(유틸성 라이브러리를 모은 util, 타입간의 상호 변환을 도와주는 bijection 등)을 운영하고 있습니다. 스칼라는 매우 효과적이지만, 동시에 큰 언어이기도 하여서, 우리는 이를 사용할 때는 세심한 주의가 필요하다는 것을 배울 수 있었습니다. 스칼라의 함정은 무엇일까요? 어떤 기능을 받아들이고, 어떤 기능을 피해야 할까요? "순수 함수형 스타일"을 언제 사용하고, 언제 피해야 할까요? 다르게 표현하자면, 어떻게 하면 이 언어를 효과적으로 사용할 수 있을까요? 이 가이드는 우리의 경험을 짧은 에세이 형태로 정리하여 최선의 관행을 제시하고자 합니다. 우리는 주로 분산 시스템을 구성하는 고용량 서비스를 만들기 위해 스칼라를 사용하므로, 우리의 조언은 이러한 분야에 편향될 수 있습니다. 하지만 여기서 제시된 대부분의 조언은 다른 분야에도 자연스럽게 적용될 수 있을 것입니다. 이 문서는 규칙이 아니지만, 이를 어기려면 충분한 근거를 제시해야 합니다.
스칼라는 간결한 표현을 가능하게 하는 많은 도구를 제공합니다. 입력이 적으면 읽어야 할 내용도 줄어들고, 읽을 내용이 줄어들면 읽는 속도도 빨라지며, 이러한 간결함은 코드를 더욱 명료하게 만들어줍니다. 하지만 간결함은 양날의 검으로, 반대의 효과를 낼 수도 있습니다. 정확성을 최우선으로 고려하고, 항상 독자를 염두에 두세요.
무엇보다도 스칼라로 프로그래밍하세요. 당신은 Java나 Haskell, Python으로 프로그램을 작성하는 것이 아닙니다. 스칼라 프로그램은 앞에 적은 어느 언어와도 다릅니다. 스칼라를 효과적으로 사용하려면 문제를 스칼라의 관점에서 표현해야 합니다. 자바 프로그램을 억지로 스칼라로 변환해봐야 대부분의 경우 원본보다 못한 결과를 낳을 것입니다.
이 문서는 스칼라 입문서가 아닙니다. 독자들은 이미 스칼라를 잘 알고 있다고 가정합니다. 스칼라를 배우기 위한 몇 가지 자료로는 다음의 문서들이 있습니다:
(이외에도 이전에 블로그에 적어두었던 글을 참고하셔도 됩니다)
이 문서는 현재의 "최선의 관행"을 반영하기 위해 계속해서 수정될 수 있지만, 그 핵심 아이디어는 변하지 않을 것입니다.
1. 항상 가독성을 우선하세요
2. 명확성을 유지하면서 제너릭 코드를 작성하세요
3. 언어가 제공해주는 간단하면서도 뛰어난 기능들을 사용할 수 있지만, 너무 난해한 기능들은 피하세요 (특히 타입시스템 관련된 기능들)
무엇보다도, 당신이 만든 trade-off에 항상 주의를 기울이세요. 정교한 언어는 복잡한 구현을 요구하며, 복잡함은 더 많은 복잡함을 낳습니다. 추론이나 의미론, 기능 간의 상호작용, 그리고 동료들과의 이해 모든 부분에서 말이죠. 이러한 복잡함은 정교함에 대한 세금이며, 그 유용성이 비용을 초과할 정도인지 항상 확인해야 합니다.
마지막으로, 즐기세요.