Uploaded avatar of kytrinyx

Meade Kincke 인터뷰

@kytrinyx
7년 초과 전

Exercism에서 가장 활발하게 활동하는 멘토 중 한 명인 Meade Kincke와의 인터뷰예요. 그와 Katrina Owen이 Rust 컴파일러, 과학적인 색 공간으로 맥주 색을 결정하는 GUI, 그리고 그의 책 'A Practical Guide To Rust'에 대해 이야기를 나눠요.

안녕하세요 Meade. 이야기 나눠 주셔서 고마워요. 저희가 Meade와 이야기하고 싶었던 건, Meade가 Rust 트랙에서 가장 활발하게 활동하는 멘토이기 때문이에요. 지금까지 400명이 넘는 학생을 도와주셨잖아요. Exercism은 어떻게 알게 되셨어요?

레딧의 Rust 서브레딧에 누군가 Exercism의 Rust 트랙에 멘토가 필요하다고 글을 올렸고, 그래서 찾아봤어요. 그러길 정말 잘했다고 생각해요. 보람이 엄청 크고, 모두 정말 친절하고 고마워해 주거든요. Exercism에서 만난 학생들과 멋진 인연을 맺었고, 그들을 돕는 게 정말 좋아요.

특히 기억에 남는 이야기가 있으세요?

네, 아주 인기 있는 Rust 연습 문제가 하나 있어요. 바로 Pythagorean Triplet이에요.

이 문제에서 가장 흔히 겪는 어려움은 성능이에요. 대부분 처음에는 중첩된 for문으로 풀어요. 그건 적어도 O(n²)이고 아주 비효율적이죠. 제 목표는 학생들을 선형 해법, 즉 O(n)으로 이끄는 거예요.

제 방식은 질문을 던지는 거예요. 먼저 Rust의 이터레이터 메서드를 배우고 싶은지 물어봐요. 이터레이터에는 정말 많은 장점이 있고, 그중 하나는 Rayon 라이브러리로 작업을 병렬화할 수 있다는 점이거든요.

어느 학생은 "네, 좋아요"라고 답한 뒤, 임베디드 제어에 Rust를 쓰고 그 엄청난 데이터 출력을 처리하려고 Rust를 배우는 중이라고 했어요. 그래서 그 학생에게 병렬성은 중요한 문제였죠. 단순해 보이는 연습 문제로 더 복잡하고 관용적인 Rust 문법을 가르쳐 준 게 좋았나 봐요.

이제는 Exercism 덕분에 그 학생이 저를 일대일 과외로 고용했고, 우리는 몇 가지 실험적인 프로젝트를 함께 진행할 예정이에요. 그가 회사를 완전히 Rust로 전환하면, 그의 팀 전체도 가르칠 거예요.

멘토링한 학생들과 함께한 시간이 정말 즐거웠고, 이 일이 계속 커졌으면 좋겠어요. 너무 좋아서 이제는 자원해서 Rust 트랙의 메인테이너가 되어 뒤에서 더 많이 돕고 있어요.

그런 사람 사이의 연결이 정말 중요하죠! Meade는 A Practical Guide to Rust의 저자이기도 하잖아요. 이 책은 어떤 내용이고, 어떤 동기로 쓰셨나요?

이 책은 다른 사람들이 Rust의 특정 부분을 더 잘 이해하도록 돕기 위해 썼어요. 이 언어에 대한 문서가 그리 많지 않았고, 유머도 있고 언어의 개념을 구체적으로 설명해 주는 글이 필요하다고 느꼈어요. 기초적인 영역과 고급 영역을 아우르는 안내를 담고 있어요. 사람들이 이 언어를 실제로 어떻게 쓰는지 확실히 감을 잡았으면 해요. 가상의 예제가 아니라 실제 예제를 담고 있죠.

저는 항상 책을 쓸 거라고 생각했어요. 동료에게 원격으로 Rust 프로그래밍을 가르치게 되었을 때, 책의 틀이 자연스럽게 잡혔어요. 그 동료는 코드를 한 번도 다뤄 본 적이 없어서, 우리 같은 덕후들이 당연하게 여기는 용어와 방법을 새롭게 와닿는 방식으로 설명해야 했어요. Rust의 소유권 개념을 이야기할 때는 도서관에서 책을 빌리는 것과 책을 소유하는 것을 비교하는 비유를 썼어요.

제 프로젝트인 BrewStillery의 예제도 넣었어요. 구조체나 열거형 같은 것이 실제 프로그램에서 어떻게 동작하는지 보기에 아주 좋은 방법이에요. 병렬성을 실제로 어떻게 쓰는지도 보여주죠.

책을 쓸 때, 단순한 참고서가 아니라 이야기처럼 읽히길 바랐어요. 앞 내용 위에 쌓여 가지만, 각 요소는 따로 봐도 이해할 수 있어요. 화학 교재를 보며 요리하는 것과 Julia Child의 'The French Chef' 한 편을 보는 것의 차이예요.

오, 흥미롭네요. 누구를 위해 쓰신 책이고, 독자는 이 책에서 무엇을 얻을 수 있나요?

Rust를 배우고 싶은 사람이라면 누구나를 위한 책이에요. 제가 개념을 풀어내는 방식의 공통점은 독자에게 근본적인 이해를 준다는 거예요. 반면 다른 많은 책은 통째로 외우는 쪽에 기울어 있죠.

좋은 평가를 많이 받으셨더라고요. 2권도 낼 계획인가요?

네! 앞으로도 계속 쓰면서 더 많은 권을 출간할 계획이에요.

멘토링과 집필을 통한 가르침 외에도, Rust 컴파일러 작업도 하셨다고 들었어요. 어떤 일인지 말씀해 주실 수 있나요?

물론이죠!

제 작업을 간단히 소개하자면, 프로그램이 동작하는 시점은 크게 두 가지예요. 컴파일 타임과 런타임이죠. 함수가 런타임에 실행되면, 그 안의 모든 것이 다시 생성되고 다시 계산돼요. 이는 곧 메모리를 다시 할당한다는 뜻이고, 우리는 항상 그걸 피하고 싶어 하죠. 함수가 상수이면, 프로그램이 시작될 때 메모리에 로드돼요. 컴파일 타임에 더 많이 처리할수록 프로그램 성능이 더 좋아져요.

얼마 전에 컴파일 타임 함수 실행(const fn)이 Rust에 구현되고 있다는 이야기를 듣고 정말 신이 났어요. 저는 무언가를 효율적이고 정확하게 만드는 데 정말 열정이 있어요. const fn에서 정말 마음에 드는 점은, 이것이 완성되면 수학 상수 같은 멋진 것들을 우아하게 정할 수 있다는 거예요. 현재 파이(π)는 하드코딩된 값이에요. 많은 사람이 이 정도면 충분히 정확하다고 말하겠지만, 저는 사용할 수 있는 수치 공간을 전부 활용해야 한다고 생각해요. const fn을 쓰면 라이프니츠의 공식을 사용할 수 있고, 그러면 실수 공간을 완전히 채울 수 있어요.

조금 더 찾아보다가, MIRI가 const fn을 안정화하는 일을 훨씬 쉽게 만들어 줄 거라는 블로그 글을 발견했어요. 시간이 흘렀지만 새 버전이 나올 때마다 별다른 진전이 보이지 않았어요. 그래서 Rust 팀에 연락했고, 컴파일러를 직접 손보기 시작했어요.

멋진 점은 컴파일러 자체가 Rust로 작성되어 있다는 거예요. 처음에는 OCaml로 작성되었다가 Rust로 다시 작성되었는데, 이를 부트스트래핑이라고 해요. 기본적으로 컴파일러는 모든 입력을 AST로 파싱하고, 그다음 상위 수준 중간 표현(HIR), 중간 수준(MIR), 하위 수준(LIR)으로 넘겨요. LIR은 LLVM이 처리하죠. 이 모든 단계를 거치면서 점점 기계어에 가까워져요.

한 가지 이해해야 할 점은, 컴파일러도 그저 프로그램일 뿐이라는 거예요. 다만 아주 정교한 프로그램이죠. Rust는 컴파일하는 데도 꽤 오래 걸리고, 특히 모든 테스트를 실행하는 데는 더 오래 걸려요. 그래서 코드를 몇 줄 넣고 바로 "끝났다"라고 말할 수 있는 게 아니에요.

제가 컴파일러에서 처음 작업한 부분은 HIR이었어요. 안정 버전과 나이틀리 버전의 표준 라이브러리를 엄청나게 많이 읽고, 이곳저곳 파고들어야 했어요. 컴파일러에 있는 모든 중첩 타입을 끝까지 따라 내려가면서, 더 살펴볼 것이 없을 때까지 재귀적으로 파고들어야 했죠. 나이틀리/컴파일러 라이브러리에는 중첩 타입이 정말 많아요. 어떤 흐름을 따라가고 있는지 계속 붙잡고 있으려면 집중력이 많이 필요해요.

게다가 컴파일러는 분산된 팀이 함께 작업하기 때문에, 병합 충돌이 자주 생겨요.

정말 재미있었어요. 아직 할 일이 정말 많고, 조만간 그것들도 해볼 거예요.

이런 오픈 소스 기여 외에도, Meade가 블록체인 회사의 CTO라는 걸 알고 있어요. 저는 블록체인이라고 하면 Etherium에서 돈을 많이 잃은 기억이 떠오르는데요. Meade에게 블록체인이란 어떤 의미인가요?

안타깝게도 블록체인은 역대 가장 유행어다운 유행어가 되어 버렸어요.

블록체인은 시티나 월스트리트가 디지털 화폐라는 새로운 유행으로 돈을 버는 것 이상이에요. 저희는 사실 "블록체인 회사"가 아니에요. Chainetix에서 저희는 기업의 데이터를 안전하게 지키기 위한 프라이빗 원장을 제공해요. 사실 저희는 암호화폐를 다루지도 않아요. Chainetix의 목표는 프로그래밍을 기본적으로 이해하는 누구나 우리의 전문성을 활용할 수 있게 하는 거예요.

저는 우리 시스템과 인프라를 처음부터 설계해서 아주 견고한 무언가를 만드는 일을 했어요. 저는 Habitat by Chef라는 프로젝트를 골랐어요. 이 프로젝트를 알게 된 건 Rust로 작성되어 있었기 때문인데, Chef처럼 거대한 회사에서 나온 게 흥미로웠어요. 일반적인 Docker와 달리 Habitat은 스스로 자동 업데이트할 수 있는 이미지를 만들고, 서비스 바인딩 같은 놀라운 일도 해내요. Habitat의 core-plans 저장소에도 꽤 많이 기여했어요.

아까 BrewStillery 프로젝트를 언급하셨는데, Meade에게 중요한 프로젝트인 것 같아요. 조금 더 이야기해 주실 수 있나요?

네, 정말 그렇죠!

BrewStillery는 제가 Rust와 GTK3로 작성한 올인원 맥주, 와인, 증류주 도구예요. 아름답고 독특한 CSS 테마도 넣었어요. 한마디로, 술을 만드는 사람을 위한 고급 계산기예요.

맥주와 샴페인에 특화된 계산기는 각각 다른 탭으로 나누고, 양조업자, 포도주 양조자, 증류업자 모두에게 적용되는 일반 탭도 만들었어요. 대부분의 맥주와 와인 병을 보면 그 병에 담긴 알코올의 비율, 즉 알코올 도수(ABV)가 적혀 있어요. 짐작하시겠지만, BrewStillery가 하는 일 중 하나가 바로 그 알코올 도수를 계산하는 거예요. 여기에는 덕후스러운 멋진 요소가 잔뜩 들어 있어요. 제가 가장 뿌듯하게 생각하는 부분은 맥주 색을 계산하는 거예요.

BrewStillery 맥주 탭 빈 잔

BrewStillery 맥주 탭 채워진 잔

이 전후 이미지는 양을 입력한 뒤 어떤 일이 일어나는지 보여줘요. 제가 구현한 방식은 이전에는 아무도 해본 적 없는 방식이에요. 또 하나의 멋진 기능은 입력하는 즉시 실시간으로 계산된다는 거예요. 색 공간에 대한 자세한 이야기가 궁금하면, 콘퍼런스에서 저를 찾아 주세요. 맥주 한 잔 하면서 이야기해요!

2019년 02월 09일 · 유용했나요?