Rust 공부를 시작하는 이야기
2025.02.24
계속 쿠바 여행기를 올리다가 가끔씩 올리게 되었습니다. 이전까지 제가 공부하던 프로그래밍과 언어들은 IT 업계로 '취업' 을 하기 위한 수단으로 공부를 했었습니다. (C언어를 제외하고)
하지만, 나이는 있는데, IT업계 경력이 전무하니 취업이 쉽지도 않고, 막막하고, 제가 혼자서 한 것들도 물론 도움이 되기는 하겠지만, 실질적으로 경력으로 인정 받을 수는 없는 것이죠. 실망을 하지 않았다고 하면 거짓말이겠지만, 이왕 이렇게된거 IT업계로 취업을 하는 것은 때려치고, 그동안 웹 3형제인 HTML, CSS, JavaScript 같은 "노잼" 들을 뒤로 하고, 그동안 계속하고 싶었던 Rust를 공부하기로 마음을 먹고 Rust에 발을 떼기 시작했습니다.
초보자를 위해 Rust 입문서적이 거의 없다시피 할 뿐만아니라, Python과 비교하는 등의 방식으로 도서들이 나와 배우기 위해서는 Rust 공식 문서를 이용하는 방법밖에 없었습니다. 유튜브의 Rust 교육 영상이 있기도 합니다.
따라서,
1. 공식 문서로 공부한다.
2. 이해가 안되는 개념은 검색과 ChatGPT를 통해 이해한다. (주의!)
3. 배운 것을 README.md 를 작성하고 프로젝트를 Github 공개 저장소로 등록한다.
4. 프로그래밍 언어계의 보잉 : C언어 / 에어버스 : Rust
너무 많이 알면 어렵고, 잘 모르면 쉽다.
1. Rust 공식 문서
Rust 공식 문서를 지금까지 보면 느리지만 찬찬히 이해하며 공부를 하고 있는데, 프로그래밍에 처음 입문하는 사람들을 위한 것이 아니라, 어느정도 프로그래밍 경험이 있는 사람들이 볼 수 있도록 되어 있습니다. 그러다보니, C언어 또는 다른 언어와 비교하며 알려주는 것들이 많이 있습니다.
이런 부분에 대한 개념을 아주 조금이라도 알고 있으면 시작하기에 어려움이 없습니다. 저도 아직 고급 과정을 진행하는 것이 아니라서 후반부는 이야기를 못 하겠지만요. 저도 C언어를 포인터 즈음~ 해서 놔버렸는데, 겨우 그만큼 배운 것들이 Rust에 와서도 충분히 도움이 됩니다. Rust에서 이야기하는 타입, 슬라이스 등등과 같은 단어와 개념을 이해할 때 충분합니다.
많은 분들이 "Rust가 어려운 언어"라고 합니다. 하지만, 이 부분은 조금 더 생각해 볼 필요가 있다고 봅니다.
이미 프로그래밍을 할 줄 아는 분들에게는 기존과 다른 새로운 패러다임과 개념들 때문에 어려울 수 있습니다. 예를 들면, C언어에서는 되는데, Rust에서는 안된다거나, C언어에서는 없는 개념인데, Rust에는 있는 개념 등... 생명 주기, 대여 등등...
저는 반대로 생각했습니다. 어차피, 프로그래밍을 할 줄 모르는 사람에게는 "C언어도, Python도, Rust도 다 어렵다." 라는 것이죠. 그것을 시작으로 저는 그냥 원래 관심을 가지고 있었던 Rust를 밀어부치기로 했습니다.
많은 사람들이 한 가지 언어를 제대로 알면 컴퓨터 언어라는 것이 비슷하기 때문에 어느정도의 "컴퓨터 센스"가 있다면 다른 언어를 배우는 것이 어렵지 않기 때문에, 조금 더 이해하기가 쉬운 고수준 언어(Python 등)을 먼저 배우고, 개념을 익힌다음 저수준(C언어, C++, Rust 등)을 배울 것을 추천합니다.
저는 HTML, CSS, JavaScript 뿐만아니라, Python과 Java에도 도통 흥미를 붙이지 못해서 항상 흐지부지 되었는데, Rust는 나올때부터 관심이 있던 것이라 꾸준히 하고 있습니다.
"반대로 저수준 언어(Rust)를 배우고, 고수준으로 올라가겠다." 라는 계획을 세웠죠. 배우고 싶은 언어도 많기도 하구요.
취업이 아니라 취미이기 때문에 어떤 것을 하건 문제가 없기 때문에 하고 싶은 걸 하는 쪽으로 가닥을 잡았습니다.
2. 이해가 안되는 개념은 검색과 ChatGPT를 통해 이해한다. (주의!)
물론 저도 C언어를 제대로 공부한 것이 아니라 수박 겉핥기 수준으로 깔짝한 것이고, 그마저도 포인트 정도 부분에서 흐지부지 되었기 때문에 깊이 있게 알지는 못 합니다. 다만, 컴퓨터가 돌아가는 구조나 컴파일, 링커와 포인트의 개념을 아주 조금 알고 시작한 셈이죠.
그럼에도 새로운 패러다임과 현대적인 개념들이 추가된 언어이기 때문에 잘 모르는 부분이 왕왕 나옵니다. 아무리, 보아도 이해가 되지 않을 때, 디버그 포인트를 찍어서 순차 이동으로 계속 돌려보며 알아보고, 그래도 안되면 검색을 해보고, 그마저도 정보가 없다면 ChatGPT를 쓰는 식으로 이해합니다.
여기서 중요한 점은 "ChatGPT를 패러다임과 개념을 이해하는데에만 쓴다는 것"이 중요합니다. 코드를 만들어 달라거나, 정상적으로 출력할 수 있도록 만들어 달라는 것이 아니라, 예를 들면, Lifetime(수명)과 Borrow(대여)에 대한 개념이 무엇인지에 대해 물어볼 때 사용합니다. 코드를 물어보는 것은 치트키를 쓰는 것과 다름이 없다고 생각해서 물어보지 않고, 개념에 대해 이해가 안되는 부분만 물어봅니다.
공식 문서를 하나 하나 이해하면서 넘어가는 것은 '굉장히 비효율적' 이라는 이유로 많은 비판을 받았는데, 저는 배워가는 과정이 재미있고, 제가 이해를 했을때 기쁨 그 자체를 즐기는 것을 좋아하기 때문에, 비효율적이라고 해도 그대로 유지하고 있습니다. 저는 효율을 좋아하긴 하지만, '내가 이해가 안되는데, 그걸 어떻게 하냐?' 라고 생각하기 때문에 더 그래요.
Rust는 국내에 물어볼 곳이 많지 않을 수도 있기 때문에 영어로 검색해서 도움을 받고, 그게 어렵다면 ChatGPT를 통해 도움을 받으면서 공부하면 됩니다.
3. 배운 것을 README.md 로 작성하고 프로젝트를 Github 공개 저장소로 등록한다.
그냥 단순히 배우고 놔두면 잊어버리기 쉽상입니다. 이미 HTML과 CSS, JavaScript, C언어를 공부하면서 많이 경험했던 상황이죠. 하지만 그럼에도 나아지질 않았기에 비공개가 아니라 공부하는 것 자체도 공개 저장소로 만들어 쓰기로 했습니다. 그리고, README.md 도 잘 정리하고 작성해서 나중에 내가 찾아보거나 복습을 할 때에도 알아보기 쉬울 수 있게끔.
하지만, 도움이 되는 것은 그것뿐 아니라, 내가 지금 배운 것을 정확히 이해를 한 것인지 다시 한 번 생각할 수 있게 해주는 점이 있습니다. 내가 알고 있는 것이 정확한 것인지, 내가 이해한 것이 맞는지 다시 한 번 보게 되는 것이죠.
예시)
https://github.com/razorbacky/slice_type_2-1
공부하는 것 부분마다 저장소를 만드니, 저장소의 숫자가 많이 늘어나기는 합니다만 그건 나중에 정리해도 상관이 없기 때문에 큰 문제가 되지 않습니다. 지금 내가 공부를 잘하고 있는지 걱정을 해야죠.
게다가, 코드를 단순히 보고, 복붙하고 "아 이거구나" 하고 그냥 넘어가는 것이 아니라, 귀찮더라도 굳이 직접 키보드를 입력을 해가면서 배웁니다. 그렇게, 처음부터 차근차근 배우다보면, 직전에 배웠던 개념이 합쳐지면서 재미를 느끼게 되고, C언어에서 배웠던 개념이 Rust와는 어떻게 다른 것인지 이해 했을때, 굉장히 즐겁고 신이 났었습니다.
Rust의 dangling pointer와 C언어의 dangling pointer 와 같이요.
Rust의 dangling pointer :: https://github.com/razorbacky/dangling_reference
GitHub - razorbacky/dangling_reference
Contribute to razorbacky/dangling_reference development by creating an account on GitHub.
github.com
C언어의 dangling pointer :: https://github.com/razorbacky/dangling_reference_clang
GitHub - razorbacky/dangling_reference_clang
Contribute to razorbacky/dangling_reference_clang development by creating an account on GitHub.
github.com
제가 배운 것들을 정리하는 깃허브 저장소입니다. 궁금하시면 한 번 살펴보세요.
너무 초보적인 수준이라 "이런 놈이 개발자라곳!" 이라고 할 수도 있습니다.
4. 프로그래밍 언어계의 보잉 : C언어 / 에어버스 : Rust
대규모 에어라이너 비행기를 생산하는 양대 두 회사가 있습니다. 에어버스와 보잉.
이 두 회사의 철학은 비행기의 운용 조차도 크게 다르다고 합니다.
쉽게 말해 보잉은 "모든 것은 조종사를 믿는다." 라고 하고, 에어버스는 "사람은 실수를 한다. 컴퓨터에게 맡긴다." 라고 쉽게 이야기 할 수 있을 정도의 철학을 가지고 있습니다.
이것이 C언어와 Rust의 차이라고 생각하면 이해가 빠릅니다. C언어는 최대한 개발자를 믿으며, 개발자에게 모든 것을 맡깁니다. 오류까지도요. 하지만, Rust는 최대한 많은 것들을 컴파일러가 제한하고, 막으며, 보정해 줍니다. 물론 안전장치를 푸는 방법도 있지만, 기본적인 개념은 이렇다고 봅니다.
이러한 차이점을 알고, 하나씩 하나씩 공식 문서를 통해 배우다가 보면 어느 순간 다가와 있습니다.