저자는 Flipkart 재직 중 대용량 CSV 파일 처리를 위해 Python을 학습했으며, 당시 Ruby의 Qt 바인딩 미유지로 Python을 선택했던 일화를 언급합니다. Ruby 커뮤니티의 주요 인물인 Zed Shaw(Mongrel), Steve Klabnik(Rails, Rust Book), DHH(Rails 창시자) 등에 대한 간접적인 만남을 회상합니다. 초기에는 Ruby의 필요성을 느끼지 못했으나, 친구의 조언과 새로운 회사에서의 요구로 학습을 시작했습니다. Python의 과도한 사용과 마이크로프레임워크(Flask)의 한계를 지적하며, Django와 같이 ‘의견이 있는(opinionated)’ 프레임워크의 장점을 인식하게 됩니다.
Ruby 학습 과정
-
LSP 및 환경 관리: Neovim용 LSP로
ruby-lsp를 선택했으며,mise-en-place를 사용하여 Ruby 버전을 관리했습니다. -
Gem 다중 버전 관리:
gem list명령어를 통해 Ruby가 여러 버전의 Gem을 전역적으로 관리하는 방식(gem-version/디렉토리)에 깊은 인상을 받았습니다. 이는 Python의virtualenv없이도 의존성 충돌을 방지하며, ‘Ruby Way’의 큰 장점으로 꼽힙니다.
Rubyisms
-
메서드 이름 규칙:
?(boolean 반환),!(위험한/수정하는 메서드),=(할당 메서드) 접미사를 통해 메서드의 의도를 명확히 하는 컨벤션을 설명합니다. 이는 강제성은 없지만 강력한 관습으로 작용한다고 언급합니다. -
블록: Python의
lambda나contextmanager와 유사하지만 다른 Ruby의 블록 개념(yield,&block)에 대한 흥미를 표현합니다. -
return선택 사항: Rust에서 경험했던 것처럼 Ruby에서도return이 선택 사항인 점을 언급하며, 코드의 우아함을 인정합니다. -
include와 Monkey Patching:include를 통해 모듈의 동작을 클래스에 주입하여 조상 체인에 추가하는 방식(예:String,Integer에Palindrome모듈 주입)에 깊은 인상을 받습니다. 이는 Monkey Patching의 한 형태로, Rust의impl과 비교하며 런타임 동작 변경 가능성에 대한 우려와 함께 Ruby의 특징으로 받아들입니다. -
모듈 해결:
require와relative_require를 설명하며,env_logger::init()와 같이 명시적인use없이도 모듈 함수를 호출하는 Rust의 방식이 Ruby에서 왔다는 사실에 놀라움을 표합니다.