Python 대신 TypeScript?
Claude Code를 처음 만났을 때 "와, 이거 진짜 된다"는 신기함에 푹 빠졌다. 자연어로 뭔가 설명하면 뚝딱뚝딱 코드가 나오고, 실행도 되고. 마치 마법 같았다.
하지만 현실은 달랐다.
처음 몇 번은 정말 신기했다. "웹사이트 만들어줘", "데이터베이스 연결해줘" 하면 정말로 뭔가가 나왔다. 그런데 시간이 지날수록 빨간 글씨들이 나타나기 시작했다.
Error: Cannot read property 'undefined' of undefined TypeError: res.json is not a function ModuleNotFoundError: No module named 'something'
처음엔 "아 이런 것도 있구나" 하고 Claude에게 다시 물어봤다. "이 에러 어떻게 고쳐?" 하면 또 뭔가 대답을 해준다. 고치면 또 다른 에러가 나온다. 고치면 또 다른 에러.
결국 나의 하루 루틴은 이랬다:
구글링: "python error cannot import" 검색 → 스택오버플로우 10개 탭 열어두고 복사 붙여넣기
커뮤니티 순회: Discord 개발자 채널들, Reddit r/programming, 심지어 Facebook 코딩 그룹까지
AI 삼단콤보: Claude에게 물어보고 → ChatGPT에게도 물어보고 → Gemini에게도 한 번 더
"이 에러 뭔가요?"
"어떻게 고쳐요?"
"왜 갑자기 안 되죠?"
"아까까지 됐는데 왜 갑자기?"
마치 몸이 아픈데 의사가 없어서 온갖 약국을 전전하며 "이 약 먹으면 나을까요?" 하고 묻는 기분이었다. 문제는 내가 개발자가 아니라서, 누가 제대로 된 답을 해주는지도 모르겠다는 거였다.
가장 답답한 건 같은 에러가 다시 나와도, 며칠 전에 어떻게 고쳤는지 기억이 안 난다는 거였다. 그리고 얘도 기억을 못하지. 그래서 또 처음부터 구글링을 시작한다.
그러던 중 인터넷에서 한 글을 발견했다.
Addy Osmani라는 사람이 쓴 "Vibe Coding is not an excuse for low-quality work"라는 글이었다.
제목부터 뭔가 찔렸다. 내가 하고 있는 게 바로 그 "저질 작업"인 것 같은 느낌?
이 글을 읽어보니 충격적이었다. 내가 겪고 있는 모든 문제들이 다 설명되어 있었다.
글에 따르면 AI 보조 코딩은 분명 게임체인저가 될 수 있다고 한다. 나같은 비프로그래머도 간단히 설명만 하면 작동하는 소프트웨어를 만들 수 있으니까. 창의성을 해방시킨다는 표현도 썼다 - 더 많은 사람들이 맞춤형 소프트웨어로 자신만의 문제를 해결할 수 있게 됐다고.
하지만 문제는 그 다음이었다.
"속도는 나중에 바퀴가 빠지면 의미가 없다"
뭔가 뜨끔했다. 내가 만든 것들이 정말 제대로 된 건지 확신이 없었거든.
이 문장이 특히 충격적이었다. 그니까 2명이 대충 한일이 50명이 나중에 뜯어 고쳐야 한다.
"나중에 문제가 될 숨겨진 폭탄들"을 만들고 있는 상황이라는 건 알겠더라.
글에서는 이런 문제들을 구체적으로 설명했다:
에러 핸들링이 없음: 뭔가 잘못됐을 때 프로그램이 어떻게 대처할지 코드가 없다
성능 문제: 작동은 하지만 느리거나 메모리를 많이 먹는다
보안 구멍: SQL 인젝션 같은 해킹 취약점이 숨어있다
논리적으로 취약한 코드: 예상치 못한 입력이 들어오면 무너진다
"아, 그래서 내가 만든 것들이 자꾸 에러가 나는구나..."
글 작성자는 이런 코드를 "카드로 만든 집 코드"라고 불렀다.
"완성된 것처럼 보이지만 현실의 압박 하에서 무너지는" 코드.
첫째 돼지의 지푸라기 집같은 그런거.
완전 내 상황이었다.
처음엔 "와 된다!" 했는데, 며칠 쓰다 보면 여기저기서 문제가 터진다.
예상치 못한 입력 하나만 들어와도 전체가 무너진다.
AI는 많은 코드를 빠르게 만들어낼 수 있지만, 양 ≠ 질이다.
이 말이 정말 와닿았다.
나는 지금까지 "코드가 많이 나왔으니까 뭔가 대단한 걸 만든 것 같다"고 착각하고 있었던 거다.
그렇다면 해결책은 뭘까? 글에서는 명확한 답을 제시했다.
"AI를 매우 빠르지만 주니어 개발자인 팀원처럼 대하라. 다시 말해, 당신 – 시니어 엔지니어나 팀 리드 – 이 여전히 결과에 책임을 지는 사람이다."
AI가 코드의 첫 번째 초안을 만들어낼 수 있지만, 당신은 비판적인 눈으로 그것을 검토하고, 개선하고, 품질 기준을 충족하는지 확인해야 한다는 것이다.
성공적으로 AI를 활용하는 경험 많은 개발자들은 이런 패턴을 따른다고 했다:
AI가 쓴 것을 팀의 주니어 개발자가 쓴 것처럼 읽고 이해한다
코드를 철저히 검토하고 테스트한다
에러 케이스, 보안 함의, 성능 특성을 고려한다
필요에 따라 리팩터링하거나 개선한다
팀의 코딩 표준과 일치하는지 확인한다
"AI는 도구이지 마법이 아니다. 그것이 만든 모든 것을 검토하고, 이해하고, 검증할 책임은 여전히 당신에게 있다."
글을 다 읽고 나니 더 절망스러워졌다.
"비판적인 눈으로 검토하라"고? 내가?
나는 시니어 엔지니어는커녕 주니어 개발자도 아니다. 그냥 주니어 개발자를 메인 개발자로 앉히고 일을 하는 그런 사람이다. 내가 믿을 건 AI뿐인데, 그 AI도 믿으면 안 된다고?
"에러 케이스를 고려하라" → 뭐가 에러 케이스인지 모르겠다. 하얀건 글씨고 빨간 건 에러라.
"보안 함의를 생각하라" → SQL 인젝션이, 보안 함의가 뭔지도 모르겠다
"성능 특성을 따져라" → 빠른지 느린지 어떻게 알아?
"리팩터링하라" → 뭘 어떻게?
"코딩 표준에 맞춰라" → 표준이 뭔데?
완전 막막했다. 마치 의사한테 "환자를 잘 돌보세요"라는 조언을 받은 의학과 1학년 같은 기분이었다.
아니 사실 의대 희망하는 고3정도겠지만.
그런데 며칠 후 해커뉴스를 뒤적거리다가 또 다른 글을 발견했다. 이번엔 약간은 기쁜 소식이었다.
"Typed languages are better suited for vibecoding"
타입 언어가 바이브 코딩에 더 적합하다고? 뭔가 희망적으로 들렸다. 근대 타입 언어가 뭔대?
글을 써올린 사람은 10년 넘게 개발한 베테랑이었다.
그런데 이 사람도 Claude Code가 나온 후로 완전히 습관을 바꿨다고 했다.
"내 10년 넘은 프로그래밍 습관이 Claude Code 출시 이후 바뀌었다. 더 이상 Python이 새 프로젝트의 첫 번째 선택지가 아니다."
10년 베테랑도 AI 때문에 습관을 바꿨다는 거잖아?
그럼 나 같은 초보가 헤매는 게 당연한 거 아닌가?
더 놀라운 건 이 부분이었다:
"나는 유창하지 않은 언어들 – TypeScript, Rust, Go – 로 프로젝트들을 관리하고 있는데, 꽤 잘 하고 있는 것 같다."
잠깐, 이 사람도 잘 모르는 언어로 프로젝트를 하고 있다고? 그럼 나랑 비슷한 상황 아닌가?
아니겠지. 저 사람은 그니까, 나 프로 축구 선수고 윙백인대 갑자기 스트라이커를 보라고?
이런 느낌이면, 나는 프로 화가인데 갑자기 축구를 하라고? 이런느낌.
"타입 언어, 컴파일 언어 등이 바이브 코딩에 더 적합한 것 같다. 안전성 보장 때문이다."
안전성 보장? 뭔가 중요해 보였다. 그래 보장. 보장은 좋은거지. 안전성. 그래 안전도 좋은거고.
더 읽어보니 이런 내용이 나왔다:
"역설적으로, 어느 정도 규모의 프로젝트가 되면, 코드의 저수준성에도 불구하고 Claude Code + Python보다 Claude Code + Rust로 더 빠르고 안전하게 움직일 수 있다."
글 작성자가 실제 회사에서 겪은 일을 설명했는데, 이게 정말 인상적이었다:
"나는 TextCortex에서 TypeScript 프론트엔드 코드의 대량 청크를 리팩터링했다. Claude Code는 각 작업을 완료한 후 tsc를 실행하고, 커밋하기 전에 코드가 컴파일되는지 확인한다."
여기서 중요한 건 "컴파일되는지 확인한다"는 부분이었다.
"이로 인해 컴파일 타임 보장을 제공하지 않는 Python으로 했다면 가능했을 속도보다 훨씬 빠르게 움직일 수 있었다."
그리고 가장 놀라운 대목:
"몇 시간 만에 만든 3-5천 줄의 diff가 아무것도 망가뜨리지 않고, 오히려 안정성까지 높인다는 사실에 매번 놀란다."
3-5천 줄을 몇 시간 만에? 그것도 망가뜨리지 않고?
그런데 타입 언어가 정확히 뭔지 모르겠어서 찾아봤다.
간단히 말해서 타입 언어는 변수나 함수가 어떤 종류의 데이터를 다루는지 미리 정해놓는 언어다.
예를 들어 Python에서는 이렇게 쓴다:
def add_numbers(a, b): return a + b result = add_numbers(5, 3) # 8 result = add_numbers("hello", "world") #
"helloworld" result = add_numbers(5, "hello") # 에러... 아니 아닐 수도?
마지막 줄에서 뭔일이 일어날지 실행해봐야 안다. 에러가 날 수도, 안 날수도 있는 돌려봐야 아는 그런 상황이다. 그러니까 슈뢰딩거의 에러같은거다. 그리고 에러가 나도, 왜 에러가 났는지 알려줄수도 있고 안 알려줄수도 있는 그런 아주 호박엿같은 달콤한 상황이라는 거지.
하지만 TypeScript에서는:
function add_numbers(a: number, b: number): number { return a + b; } const result1 = add_numbers(5, 3); // OK const result2 = add_numbers("hello", "world"); // 컴파일 에러!
const result3 = add_numbers(5, "hello"); // 컴파일 에러!
실행하기도 전에 문제가 있다고 알려준다. 이게 바로 "컴파일 타임 체크"다.
내가 지금까지 겪던 문제들을 생각해보니 이해됐다:
Python: AI가 코드 짜줌 → 실행해봄 → 에러 발생 → 또 AI한테 물어봄 (근대 얘도 잘 모름) → (대충 느낌적인 느낌으로) 고침 → 또 다른 에러 (혹은 같은 에러) → 무한 반복
TypeScript: AI가 코드 짜줌 → 컴파일러가 체크 → 문제 있으면 바로 알려줌 → 실행하기 전에 대부분 문제 해결
"LLM들은 누수가 있는 추상화다, 맞다. 하지만 이제는 Python이 나에게 해결해줬던 문제(빠른 프로토타이핑)를 Python의 단점들(낮은 안전성 보장, 느림, 모호함) 없이 충분히 잘 해결할 수 있을 만큼 작동한다."
즉, 타입 언어 + AI 조합은:
Python만큼 빠른 프로토타이핑 ✓
Python보다 높은 안전성 ✓
Python보다 적은 런타임 에러 ✓
Python보다 명확한 코드 구조 ✓
이 글을 읽고 나니 뭔가 희망이 보였다.
내가 지금까지 삽질한 이유가 명확해졌다. 나는 주니어도 안 되는데 주니어 AI를 제대로 관리할 능력이 없었던 거다. 그런데 타입 언어를 쓰면 언어 자체가 나 대신 일부 관리를 해준다는 거 아닌가?
다시 생각해보니 내가 제일 짜증났던 순간들이 있었다:
"어? 아까까지 됐는데 왜 갑자기 안 돼?"
"뭔가 입력했는데 undefined 에러가 왜 나와?"
"함수가 뭘 리턴하는지 모르겠어"
타입 언어를 쓰면 이런 문제들 중 상당수는 실행하기 전에 미리 잡아준다는 거다.
특히 Claude Code는 각 작업 후에 컴파일을 돌려서 문제가 있으면 바로 알려준다고 했다. 마치 자동 검수 시스템이 있는 셈이다.
그렇다면 나 같은 초보자도:
TypeScript나 Rust 같은 타입 언어 선택
Claude Code로 바이브 코딩
컴파일러가 자동으로 1차 검수
에러 나면 Claude에게 컴파일 에러 해결 요청
실행해서 2차 테스트
이런 식으로 하면 될 것 같았다.
물론 여전히 "시니어 엔지니어처럼 검토"는 못하겠지만, 적어도 언어 차원에서 기본적인 안전장치는 있는 셈이니까.
결국 내가 필요한 건 더 똑똑한 AI가 아니라, 더 똑똑한 언어였던 것 같다.
이제 TypeScript부터 시작해볼까? Rust를 깔아볼까?
결론: 바이브 코딩 초보자라면 Python보다는 TypeScript, Rust, Go 같은 타입 언어로 시작하자. 언어 자체가 당신의 첫 번째 안전망이 되어줄 것이다.