5년 차에 새 언어 배우기
TypeScript만 쓰다가 Go를 시작한 이야기, 생각보다 어렵고 생각보다 재밌었다
5년 동안 TypeScript만 썼다
프론트엔드를 시작으로 Node.js 백엔드까지, 5년 내내 JavaScript/TypeScript 세계에서 살았다. 편했다. 생태계를 잘 알고, 문제가 생겨도 해결법을 금방 찾을 수 있었다. 새 프레임워크가 나와도 언어 자체는 같으니까 학습 비용이 낮았다.
근데 어느 순간 성장이 정체된 느낌이 들었다. 새로운 걸 배우는 게 아니라, 아는 것의 변형을 반복하는 느낌. 그래서 완전히 다른 언어를 배워보기로 했다.
왜 Go였나
Rust도 고민했는데, 러닝 커브가 너무 가파르다는 주변 평이 많았다. Go는 문법이 단순하고, 회사에서 일부 마이크로서비스에 쓰고 있어서 실무 적용도 가능했다. "간단하니까 2주면 기본은 하겠지"라고 생각했다.
2주가 아니라 2개월이 걸렸다. 기본 문법은 3일이면 되는데, Go스러운 코드를 짜는 건 완전히 다른 문제였다.
첫 번째 충격: 에러 처리
TypeScript에서 try-catch에 익숙한 나한테 Go의 에러 처리는 충격이었다. if err != nil을 함수마다 쓴다. 처음엔 "이게 뭐야, 이렇게 원시적이야?"라고 생각했다. 근데 한 달 쓰다 보니 에러 흐름이 명시적으로 보여서 디버깅이 편하다는 걸 깨달았다.
TypeScript에서는 try-catch 블록 안에 뭐가 에러를 던질지 추적하기 어려운 경우가 많은데, Go는 모든 에러가 반환값으로 나오니까 흐름이 투명하다.
(근데 처음 3주간 if err != nil을 빼먹어서 panic이 터진 횟수가 23번이다.)
두 번째 충격: 고루틴
JavaScript의 async/await에 익숙한 상태에서 고루틴과 채널을 만나니까 머리가 아팠다. 개념은 이해가 됐는데, 실제로 동시성 버그를 만들지 않으면서 코드를 짜는 게 어려웠다. 데드락을 3번 만들었다.
근데 이 과정에서 동시성 프로그래밍에 대한 이해가 깊어졌다. JavaScript의 이벤트 루프가 왜 싱글 스레드인지, 그게 어떤 장단점이 있는지를 Go와 비교하면서 비로소 체감했다.
새 언어가 기존 언어 실력도 올려줬다
이게 예상 밖이었다. Go를 배우면서 TypeScript를 보는 눈이 달라졌다. Go에는 제네릭이 제한적이라서, TypeScript의 제네릭 시스템이 얼마나 강력한지 새삼 느꼈다. Go의 인터페이스 개념을 이해하고 나니 TypeScript의 인터페이스와 추상 클래스 선택 기준이 명확해졌다.
한 언어만 알면 "원래 이렇게 하는 거다"라고 받아들이는 게 많은데, 다른 언어를 보면 "이것도 선택이었구나"를 깨달게 된다.
실수: 너무 늦게 실무에 적용했다
처음 2달 동안 튜토리얼만 따라했다. 문법 공부, 예제 코드 작성, 강의 수강. 근데 돌이켜보면 2주쯤에 실무 프로젝트에 적용했으면 훨씬 빨리 배웠을 거다. 실제 문제를 풀어야 진짜 학습이 일어난다.
3개월째에 회사 내부 도구 하나를 Go로 짰다. CLI 기반의 로그 분석 도구. 간단한 거였는데, 이때 배운 게 튜토리얼 2달치보다 많았다. 실전이 답이었다.
5년 차에 새 언어를 배우면
장점: 시야가 넓어진다. 프로그래밍이라는 걸 다른 각도에서 보게 된다. 경력이 있으니까 "이 언어가 이 문제를 이렇게 해결하는구나"를 패턴으로 인식할 수 있다. 주니어 때보다 학습 효율이 높다.
단점: 시간이 부족하다. 업무 외 시간에 배워야 하니까 진도가 느리다. 퇴근 후 Go 공부하다가 졸아서 키보드에 머리 박은 적이 한두 번이 아니다.
아직 Go를 실무에서 본격적으로 쓰지는 못하고 있다. 내부 도구 수준이다. 근데 배우는 과정 자체가 가치가 있었다. 다음에는 Rust를 해볼까 싶은데, 그건 좀 더 용기가 필요할 것 같다.