이번 장에서는 소프트웨어 장인에게 실용주의가 얼마나 중요한지를 설명한다. 오버 엔지니어링을 지양하고 요구 사항들에 충실히 집중하는 핏(?) 엔지니어링을 지향해야 함을 어필한다. 나를 포함하여 많은 개발자들에게 일침을 놓는다. 개발자들은 종종 자신의 개발 실력을 뽐내고 싶거나 개인적인 뿌듯함(혹은 성취감)을 느끼기 위해 투머치하게 개발하곤 한다. 조직의 목표에 영향을 끼치지 않는다면야 이런 모습들은 큰 문제가 되지 않겠지만 현실은 문제가 되는 경우가 많다.
소프트웨어 프로젝트는 공동의 산물이다. 내 입맛대로 만들거나 수정하는 것을 지양해야 한다. 다른 시각과 다른 방식을 받아들일 줄 알아야 한다. 소프트웨어 개발 능력에 인성 능력도 포함해야 하는 이유다. 혼자 작업하는 프로젝트이더라도 말이다. 그 프로젝트의 시작부터 끝까지 나 혼자만 참여하진 않을 확률이 클 것이기 때문에, 지금은 보이지 않는 미래의 참여자도 고려해서 개발해야 한다. 신기술이라고 무턱대고 적용하면 현재나 미래의 동료들이 피를 볼 수 있다. 어렵고 복잡하게 코딩하는 것도 이기적인 행동임을 알아야 한다. 불필요한 코드를 만들지 말고 깔끔-담백하게 현재 필요한 기능에 집중하여 코드를 구현해야 한다.
그런데 사실 말이 쉽지 실천하기가 꽤 어렵다. 왜 어렵냐면, 이 문제는 `현실과 타협 vs 이상 추구`의 대결로 볼 수도 있기 때문이다. 현실과 타협하자니 고품질의 코드를 지향하는 개발자의 정체성과 충돌하게 되고, 이상을 추구하자니 이기적인 행동일 수가 있다. 중간 지점을 잘 찾는 것은 꽤 어렵다. 내 나름대로 해결책을 생각해 봤다. 시간이 크게 들지 않는 선에서만 이상을 실천한다. 그리고 나중에 요구사항이 복잡해지면 그때서야 시간이 크게 들여서 리팩토링을 진행한다. 이 과정에서 테스트 코드는 필수다. 테스트 코드가 없다면 리팩토링이 매우 힘들것이다. 기존의 케이스가 잘 돌아가는지 확인하기가 너무 어렵기 때문이다. 생각해 보니 테스트 코드만 잘 만든다면 이 딜레마를 겪을 이유도 없을 것 같다.