나는 Rust를 쓰는 회사를 두 군데나 다녀봤다.


내가 두 군데서 러스트 힙스터들의 흔적을 보고 느낀 점은 다음과 같다. 러스트 힙스터들한테도 하고 싶은 말이다.



"언어를 선택하기 이전에, 기본부터 잘하고 제대로 된 시스템 디자인에 더 집중해라"



제발 씨바 이것들 잘하면 러스트 쓰든 Zig 쓰든 Ocaml 쓰든 하스켈 쓰든 뭔 상관이냐.. 내가 지금 다른 팀원들이랑 뒷처리 다 하고 있다.


나중에 블로그로 쓸 거지만 여기서는 욕설도 낮은 빈도로 섞어쓸 수 있으니 먼저 글 써본다.


예를 몇가지 들어보자.




1. 러스트는 그 자체로 프로그램의 버그를 제거해주지 않는다


"러스트가 빠르고 안전하다"는 대체로 맞는 말이다. 여기서 말하는 안전은 러스트로 짜면 그 자체로 프로그램이 bug-free가 된다는 것이 아니고 그저 프로그램이 러닝되는 동안 memory-safety가 보장될 뿐인거다.


그러니까 러스트 힙스터들은 러스트가 프로그램을 안정적으로 만들어준다고 하기 전에 기본적인 scenario test들부터 제발 꼼꼼하게 쳐 만들어라.


예를 들어서 러스트로 짠다고 해도 꼼꼼하게 테스트 안 만들어놓으면 로그인할 때 비밀번호 틀리는 횟수 제한을 넘어도 그거 카운트를 못하고 그냥 로그인을 허용하는 코드를 짤 수도 있는 거다.


러스트가 이런 것까지 다 잡아주냐?? 덧글도 제대로 안 써지는 웹사이트 러스트로 쳐만들다가 매출 망해서 월급 밀리고 짤려서 백수되고 싶니??


농담 같지? 러스트로 짜는 힙스터들이 이런 기본적인 테스트조차 제대로 안 해놓을리가 없을 것 같지???


농담 아니다.


이거 말고도 뭐 똑같은 함수 여러 개 짜지 말고, 막 이딴 기본적인 것들은 좀 지키면서 해라.




2. 러스트는 그 자체가 성능 만병통치약이 아니다


러스트가 너희들의 하이레벨 코드를 머신코드로 변환시켜주기 때문에 calculation-intensive한 것들에 대해서는 속도가 빠른 것이 맞다.


근데 씨바 object 몇백 몇천개 insert하는데 bulk도 안하고, transaction으로 묶는 거도 아니고, 1개씩 DB query sequential하게 쏴버리면 러스트가 뭔 소용이냐? 네트워킹 대기 속도가 더 긴데.


원래 10초에 돌아가던 프로그램 기능을 러스트로 옮겨서 그 중 10% 파트를 10분의 1로 줄였다고 해서,


코드를 개떡같이 짜다가 나머지 90% 파트가 오히려 성능저하가 2배나 되어버리면 말짱 도루묵이란다.


그리고 그렇게 러스트 성능 부스트 향상 존나 찬양하는 새끼들 치고 알고리즘적 코드는 또 가까이 하는 애들은 또 많지 않아. (아예 없는 건 아니고 비중이 좀 적음)


복잡한 프로그램의 성능은 물론 언어 선택의 영향을 받지만, 그것보다 더 큰 영향을 주는 요소는 바로 "적절한 시스템 디자인"이고, 이건 개발자의 역량이 크게 발휘되는 요소이다.


아무리 러스트라도 모든 ㅈ같은 코드를 몇 십배씩 빠르게 해주지는 못한다.


그러니까 제발 러스트로 하면 그게 뭐가 됐든 무조건 빠를거라는 망상에서 쳐 벗어나자.




3. 러스트 힙스터들은 정말로 러스트의 특이한 문법을 잘 이해하고 활용할까?


나조차도 그렇게 자신 있는 편은 아니지만, 대부분의 자칭 힙스터들은 제대로 된 문법이해조차 없이 그냥 컴파일러랑 GPT한테 질질 끌려다니다가 불필요한 함수 호출 같은 것들을 남발할 것이라 확신한다.


그냥 당장 생각나는 대충 몇개 나열해보자.


- async fn이 들어있는 trait은 dyn-compatible하지 않는다. 왜? async fn은 impl Future를 반환하니까

- 동일한 변수에 대한 mutable reference는 한번에 2개 이상을 만들 수 없다.

- orphan rule 때문에 foreign struct - foriegn trait impl을 못해서 곤란해지는 경우가 종종 생긴다.

- higher ranked trait bound는 뭐하는 놈이지?

- Rust에서는 어떤 식으로도 closure의 type을 직접 기술하는 것은 불가능하다. (C++은 decltype이라는 게 있어서 그나마 됨)


어떤 것들은 개념만 보면 쉽지만 막상 코드짜다보면 방해요소가 꽤 되는 것들이고, 어떤 것들은 다른 언어에서조차 거의 볼 수 없는 매우 생소한 것들이다.


대부분의 자칭 힙스터들은 이런 것들을 제대로 알지 못한다. 나라고 뭐 그렇게 자신 있는 건 아니지만,


그냥 컴파일러가 안돼!! 이러면 "응얽 죄송해요 코드 바꿀게요" 이러고 컴파일러랑 다시 씨름하고, 그러다 뭐가 바뀐지도 모른 채로 검토도 안하고 GPT가 새로 짜주는 코드 그냥 복붙하고 이러는 놈들 천지일거라 생각한다.


왜 그렇냐고?


- 외부 변수를 캡쳐하는 closure가 아닌데 그냥 move로 설정되어 있다거나,

- await이 있는 함수도 아닌데 다른 impl method들이랑 똑같이 그냥 async로 설정해놨다던가(trait method도 아님)

- TryFrom, From, ToString 같은 걸 impl 하지 않고 into_blabla_머시기 같은 함수를 impl block 안에 막 때려넣었다던가

- 무지성 unsafe, unwrap 존나 떡칠해놨다던가


 암튼 여러가지 이유로 러스트에 능숙하다면 굳이 그렇게 할 이유가 없는 코드들이 종종 보이기 때문이다.


내가 본 어떤 전임자의 러스트 코드는 매크로가 존나 떡칠되어 있는 코드였는데, 오래 있다가 나갈 것도 아니면서 이런 식으로 유지보수하기 힘든 코드들은 왜 문서화도 제대로 안하고 쳐나갔는지 모르겠다.





뭐 그 사람들이 회사를 망치겠다는 나쁜 의도로 그런 코드를 짤 사람들은 아니라고 생각한다.


나도 힙스터들의 언어에 대한 흥미와 관심은 존중하는 편이다. 어쨌든 기술에 대한 흥미 그 자체가 나쁜 건 아니니까. 나도 러스트 언어 그 자체는 좋아한다.


그래도 같이 일하는 사람들을 존나 고통받게 하고 싶은게 아니라면, 설령 러스트를 선택하더라도 기본적인 것들은 지키면서 개발했으면 좋겠다.