실용주의 프로그래머를 읽고
프로그래밍 명저 시리즈 중 첫 책으로 실용주의 프로그래머를 골랐다. 순서 없이 읽어도 되는 책을 굳이 순서대로 읽으면서, 공감한 토픽과 끝내 공감하지 못한 토픽을 나눠 기록한다.
이 책을 읽게 된 계기
프로그래밍 명저 시리즈는 워낙 유명하다. 테스트 주도 개발, 클린 코드 같은 책은 개발자라면 한 번쯤 읽어봤거나 최소한 들어는 봤을 것이다. 그런데 나는 이 시리즈 중에 한 권도 제대로 읽어본 적이 없었다.
무슨 책부터 읽을까 하다가 실용주의 프로그래머를 골랐다. 이유는 이랬다.
- 주로 회사에서 0 to 1 프로젝트를 진행을 많이 하면서 설계와 개발 문화에 대한 고민이 많아졌다.
- 특정 언어나 프레임워크에 묶인 책이 아니라서, 지금 쓰는 스택이 바뀌어도 남을 이야기일 것 같았다.
- 실제로 코딩과 협업을 하다보니 기술적인 해결방법은 정답이 있어 오히려 쉽게 찾을 수 있는데, 사람들과 어떤 제품을 만들면 여러 애로사항이나 병목이 생기고 그걸 헤쳐나가는 인사이트가 필요했다.
그리고 첫 장을 읽자마자 나는 바로 밑줄을 그을 수밖에 없었다.
문제를 더 큰 맥락에 놓고 더 큰 그림을 보려고 노력한다.
실용주의 프로그래머는 책임감이 있기 때문에 프로젝트가 방치된 채로 끝장나는 걸 가만히 옆에 앉아서 지켜보고만 있지 않는다.
이렇게 읽으라는데
보통 책은 목차 순서대로 읽기 마련이다. 그런데 이 책은 큰 틀을 장으로 나누고, 그 안의 내용을 토픽(topic) 단위로 분류한다.
토픽은 순서와 상관없이 읽어도 된다. 실제로 책도 그렇게 쓰여 있다. "이건 후반부에서 다룰 것이다"라며 말을 끊고, 앞뒤를 왔다 갔다 하면서 설명한다. 즉 내가 궁금한 토픽만 골라 읽어도 되고, 어려우면 넘어가도 된다.
나는 그냥 처음부터 순서대로 읽었다. 그리고 어렵거나 관심 없는 내용은 넘겼다.
솔직히 몇몇 부분은 이해가 잘 안 돼서 지루했다. 고지식한 내용이 많은 건 아닌데, 읽다 보면 이 책 그냥 허무맹랑한 이야기만 하는 건가? 싶을 때가 있었다. 계속 깨달음을 주려고 발버둥치는 문장들이 이어지는데, 내가 겪어보지 못한 상황에 대한 이야기가 나오면 끝끝내 공감하지 못하고 넘어갔다.
그래서 이 글은 책 요약이 아니다. 장별로 흥미로웠던 토픽을 두어 개씩 골라서, 내가 뭘 느꼈는지 기록하는 용도다. 복잡한 기술적 내용은 적지 않는다. 궁금하면 책을 사서 읽어보길 권한다.
그럼 시작한다.
1장 실용주의 철학
고양이가 내 소스 코드를 삼켰어요.
실용주의 철학의 초석 중 하나는 자신과 자신의 행동에 대해 책임을 지는 것이다.
즉, 여기서 말하는 책임은 신뢰와 비례한다. 요즘 AI slop이라고 말을하하는데, 오류나 코드에 대한 질문을 하면 'AI가 해서 잘 모른다'라는 식으로 답변을 하는 사람이 많아졌다. 나 역시도 스스로 검토하지 못한 부분이 있다면 창피한 변명을 하기도 한다. 이런 행동은 확실히 신뢰를 떨어트리고 책임감이 정말 없어보인다.
신뢰에 구멍이 뚫리면 원상복구가 어렵다. 그래서 최대한 팀원들에게 신뢰를 주기위해서 내가 작성한 코드와 머지한 코드는 내가 책임지고, 설명할 수 있게 노력한다.
AI가 작성한 방대한 양은 인간이 단기간에 검토하기 어렵기도 하고, 자꾸 스스로 인지했다고 착각하게 만든다. 결과물이 제대로 나오니 그냥 스스로 이 코드를 이해했다고 착각한다. 그래서 AI가 코드를 작성한 날은 설명을 미루고, 집가서 다시 찾아본다. 제대로 이해하며 검토한다. 정말 신기하게도 그러면 내 것이 된다. 그리고 검토하다보면 정말 이상하게 코드를 짜는 부분이 있다. 물론 10번 중 2번 정도이다. AI 너무 잘한다.
역시 이해가 병목이다. 그러기 위해서 계속 질문한다 많이 질문한다. 그렇게 하다보면 이해가 된다.
소프트웨어 엔트로피 — 깨진 창문을 내버려 두지 말라
창문이 깨진 채로 내버려두면, 금방 폐허가 된다.
맞는 말이다. 쓰레기 같은 코드를 보면 금방 고쳐야한다. 다음은 없다. 일에 치쳐서 귀찮아서 미루면, 그 다음에 고치기 더 어려워진다. 그래서 나는 생각나면 바로 고친다. 기능 개발이 끝나면 바로 리팩토링에 들어가야한다. 하지만 쉽지 않다.
그래서 기능개발하면서 조금씩 다른 부분의 영향이 끼치지 않을 정도로만 리팩토링을 한다. 이게 내 절충안이다.
그리고 왜 깨진 창문을 내버려두면 안 되는지에 대한 핵심은 다음과 같다.
쓰레기 같은 코드가 많다면, 나 역시 레거시 프로젝트를 받으면 "이거 고치고 싶다"는 생각이 들지 않는다.
이렇게 되면 쓰레기 같은 사고도 생긴다. 여기서 중요한 건 처음부터 잘 만들면 되지 않나? 라고 생각이 들 수 있는데, 코드는 음식과 같다. 그냥 처음부터 잘 만들어도 언젠간 상한다. 트렌드는 바뀌고, 사람 역시 취향도 바뀐다. 우선 돌아간다면 그 코드는 오답이 아니다.
지식 포트폴리오
지식을 자산처럼 관리하라는 이야기. 정기적으로 투자하고, 분산하고, 리스크를 감수하고, 주기적으로 재평가하라.
내가 지금 배우고 익히는 기술들은 기한 있는 자산이다. 부동산도 그렇 고, 주식도 그렇다. 기술도 마찬가지다. 언젠간 사라진다.
그러면 어떡해야 하는가?
주식도 포트폴리오를 만든다. 쥑적으로 다른 투자 상품을 찾아보고 괜찮았던 투자 전략을 다시 적용한다. 기술도 마찬가지다. 새로운 프레임워크를 사용해보고 시간이 더 있다면 아예 새로운 언어를 배워보는 것도 괜찮다.
기술 서적이 아닌 책도 읽어야한다. 소프트 스킬은 정말 중요하다. 우리는 사람과 일을 한다. 기술만 잘한다고 되는게 아니다.
나는 프론트엔드로 시작했지만, 지금은 백엔드 인프라 등등 가리지 않고 다 해본다. 내가 좋아하는 것은 문제를 정의하고 해결하는 일이지. 사용자 반응과 인정에 대한 도파민이 필요한게 아니다. 그리고 정말 재밌는 건, 백엔드를 하니까 프론트엔드가 이해가 되었다. 프론트엔드를 하니까 어떤 데이터가 필요한 지 알게되었고, 인프라를 하니까 프론트엔드와 백엔드가 어떤 데이터를 주고받는지 이해가 되었다.
이건 내 개인적인 생각이지만, 개발자들이 편식을 하지 않았으면 좋겠다. 앞으로 AI 시대는 이 간극을 좁혀준다. 그런데도 나는 이 기술만 파보겠다고 이야기하는 건 스스로가 도태되겠다고 말하는 것과 다름이 없다. 참 아쉽다.
2장 실용주의 접근법
소통하라 !
한국어든 영어든 하나의 프로그래밍 언어일 뿐이다.
소통은 정말 중요하다. 단순히 프로젝트를 만들기 위한 소통도 중요하지만, 관계를 위한 소통도 굉장히 중요하다. 일부러 노력하는 부분도 있다.
소통 중에 제일 중요한 것은 역시 경청이라고 생각한다. 자기 말만하고 자기 주장만 하는 사람을 보면, 소통하기 꺼려진다. 단순히 내 의견이 묵살당해서 싫은게 아니라. 보통 그런 사람과 이야기하다보면, 그 사람은 맥락에 집중을 못 하고 갑자기 툭 자기 이야기를 하는 경향이 많기 때문이다. 그러면 원래 하려던 대화를 하려던 본질이 흐려진다. 그래서 나는 상대방의 이야기를 끝까지 듣고, 그 사람의 맥락을 이해하려고 노력한다.
그리고 이건 팁인데, 상대방이 맥을 자꾸 끊고 이야기를 한다면, 그냥 내 이야기를 하지 않는다. 굳이 상대하기 싫기 때문이다. 하지만 중요한 이야기라면 단호하게 말을 끊지 말아달라고 정중하게 요청한다.
청중을 알라
내 제품을 비개발자에게 이야기하려면 개발자는 머리를 쥐어 싸메고 아파한다. 그 이유는 비개발자에게 알기 쉽게 말을 해야하기 때문인데, 이건 개발자에게 소통할때도 동일하게 작용해야한다. 상대방이 내가 아는 기술 스택이나 내가 하려고 하는 기술적인 이야기들을 알 것 이라고 생각하는 것은 위험하다. 굳이 쉽게 이야기하면 되는 것을 어렵게 이야기 하려는 것은 개발자의 자존심이라고 생각한다. 그냥 쉽게 이야기 하자.
그리고 무언가를 설득해야하는 상황이라면, 나쁜 이야기는 되도록이면 하지말자. 질문이 들어올 때 해야한다. 이건 숨기려고 하는게 아니고 관심이 뚝 끊긴다. 이야기가 재미없어지고, 사람의 본성은 악한 것이 있기에 나에게 단점이 되는 이야기를 시작하면 사람들은 안 좋은 것만 생각하려한다.
질문이 왔을 때 이야기해도 늦지 않다.
좋은 설계의 핵심은 ETC
ETC(Easier To Change) — 바꾸기 더 쉽게. 저자는 이게 원칙이 아니라 가치 판단의 기준이라고 말한다. 어떤 설계가 좋은지 물었을 때, "나중에 바꾸기 쉬운 쪽"을 고르라는 것.
좋은 설계는 그냥 바꾸기 쉬운 설계이다. 자신의 기술적 이기심을 통해서 어렵고 복잡하게 설계하는 사람이 있다. 이건 혼자 프로젝트 할 때만 이야기다. 팀 프로젝트에서는 이런 설계는 독이 된다.