나는 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 존나 떡칠해놨다던가
암튼 여러가지 이유로 러스트에 능숙하다면 굳이 그렇게 할 이유가 없는 코드들이 종종 보이기 때문이다.
내가 본 어떤 전임자의 러스트 코드는 매크로가 존나 떡칠되어 있는 코드였는데, 오래 있다가 나갈 것도 아니면서 이런 식으로 유지보수하기 힘든 코드들은 왜 문서화도 제대로 안하고 쳐나갔는지 모르겠다.
뭐 그 사람들이 회사를 망치겠다는 나쁜 의도로 그런 코드를 짤 사람들은 아니라고 생각한다.
나도 힙스터들의 언어에 대한 흥미와 관심은 존중하는 편이다. 어쨌든 기술에 대한 흥미 그 자체가 나쁜 건 아니니까. 나도 러스트 언어 그 자체는 좋아한다.
그래도 같이 일하는 사람들을 존나 고통받게 하고 싶은게 아니라면, 설령 러스트를 선택하더라도 기본적인 것들은 지키면서 개발했으면 좋겠다.
구구절절 옳은말
GoGoStatementStatement(구구절절) 맞는말
급 식 쩝 쩝 충
아주 좋은 글
개고수
러스트 패러다임 익숙치 않으면 그냥 대다수의 다른 언어 쓰는게 맞는거 같긴 해
"언어를 선택하기 이전에, 기본부터 잘하고 제대로 된 시스템 디자인에 더 집중해라" 제발 씨바 이것들 잘하면 러스트 쓰든 Zig 쓰든 Ocaml 쓰든 하스켈 쓰든 뭔 상관이냐..
러스트로 밀어버리는 김에 기존 똥같은 로직들 고쳐놓고서는 러스트 덕분에 존나 빨라졌다 이지랄
러스트의 생산성이 아니었으면 그렇게 빠르게 로직 최적화가 불가능 했겠지
@ㅇㅇ(211.234) 아닌데
울면서 개추 눌렀다
해서 만드는거 = 계산기
MS가 GDI 라이브러리를 러스트로 짜고 있는데
개추
깔게 하나도 업는 명문