코드가 길어져서 화면을 넘어간다면 순차적 논리에 잠식되고 있는건 아닌지 스스로 의심해봐야 합니다. 들여쓰기가 너무 많은 것도, 함수 파라미터가 너무 많은 것도, 판단문이 너무 많은 것도, 역시 순차적 논리 전개의 결과일 가망성이 높습니다.
코드는 세 가지 기능이 있다고 하는데요, 첫째는 구현한 목적에 맞게 실행 가능해야 하고, 둘째는 유지보수가 가능해야 하고, 셋째는 코드를 읽는 사람이 코드를 작성한 사람이 뭘 하려고 했는지 이해하도록 해줘야 합니다. 그래서 코드가 사용자 요구사항이라는 지식을 전달하는 문서의 역할을 해야 하거든요.
하지만, L-모드로 코딩을 하면 첫 번째 목적만 어렵게 맞추는 겁니다. 그건 사실 코드가 아니죠. 물론 그 코드는 결국 몇 번 복사해서 쓰다가 버려야 하는 코드이고요. 진정한 코드의 목적을 달성하려면 L-모드를 제어하고 R-모드가 직관력을 발휘하도록 해야겠죠.
2014년 11월 저커버거는 온라인을 통해 일반인과 문답하는 시간을 가졌습니다.
이때 한 사람이 "왜 매일 똑같은 티셔츠를 입는 건가요?"라는 질문을 했죠. 웃어보자는 생각으로 한 질문일 수도 있는데, 저커버거의 답이 참 진지합니다. "이 커뮤니티(페이스북 사용자들)를 어떻게 하면 가장 잘 섬길 것인가 하는 것을 제외하면, 뭐든지 결정을 내려야 할 사항을 줄일 수 있도록 내 생활을 단순화하고 싶습니다."
다시 말해 옷 고르는 에너지도 아껴서 일하겠다는 말인데요. 저커버거의 성격이 유별나다고 치부하기엔, 똑같은 이야기를 한 사람이 더 있습니다. "나는 내가 내려야 하는 결정사항을 될 수 있으면 줄이려고 노력합니다. 먹고 입는 것에 대해서까지 어떤 결정을 내리고 싶지는 않거든요." 누굴까요? 바로 오바마입니다. 스스로의 단점을 "너무 머리가 좋다"라고 말할 정도로 머리가 좋은 오바마도 정장을 두세벌로 돌려가며 입었습니다. 정신 에너지를 아끼려고요.
머리 좋기로는 세계적인 두 사람의 반응은 중요한 사실을 깨닫게 해 줍니다. 그들은 전문적인 지식 노동자로서 발언한 것이고 전문적인 지식 노동자라면 자기 두뇌의 정신 에너지를 아껴 쓰는 방법을 알고 있어야 한다는 겁니다. 심지어 옷도 고르지 않을 정도로요.
프로그램은 지적인 행위로 긴 시간 정신을 모아 집중해야 한다. 집중력은 소중한 자원으로 마나와 비슷하다. 집중력 마나를 다 쓰고 나면 몇 시간 정도 집중이 필요 없는 행동으로 마나를 충전해야 한다. 또한 집중력 마나는 차츰 사라지는 자원이다. 있을 때 사용하지 않으면 사라진다. 이게 바로 회의가 사람을 황폐하게 만드는 이유다. 회의에서 집중력 마나를 다 써버리면 코딩에 쓸 마나가 남아나지 않는다. 근심이나 주의 산만 또한 집중력 마나를 소비한다. 지난밤 배우자와 했던 싸움, 아침에 자동차에 생긴 흠집, 지난주에 깜빡하고 처리하지 않은 고지서 같은 일들이 집중력 마나를 순식간에 빨아들인다.
(중략)
수면은 아무리 강조해도 지나치지 않다. 하룻밤 잘 자고 나면 집중력 마나가 가득 찬다. 7시간 자면 8시간 분량의 집중력 마나가 찬다.
로버트 C 마틴, <클린 코더>, 186쪽
하지만 프로그램을 제대로 만드는 일은 전혀 다르다. 소프트웨어를 올바르게 만드는 일은 어렵다. 소프트웨어를 제대로 만들려면 적정 수준의 지식과 기술을 겸비해야 하지만 대다수의 젊은 프로그래머는 이 수준에 도달하지 못했다. 또한 사고력과 통찰력을 갖춰야 하지만 대다수의 프로그래머는 시간을 들여 이러한 능력을 개발하지 않는다. 그리고 어느 정도의 훈련과 헌신이 필요하지만, 대다수의 프로그래머는 훈련과 헌신이 필요하리라는 생각조차 하지 않는다. 소프트웨어를 올바르게 만들려면 무엇보다도 기술을 향한 열정과 전문가가 되려는 열망이 필수다.
반면 소프트웨어를 제대로 만들게 되면 마법과도 같은 일이 벌어진다. 소수의 프로그래머만으로 프로그램이 지속적으로 동작하도록 만들 수 있다. 거대한 요구사항 문서와 이슈가 수 없이 등록된 이슈 추적 시스템도 필요가 없다. 전 세계의 칸막이로 나뉜 작은 사무실에서 휴일도 없이 일해야 하는 프로그래머가 없어도 된다.
제대로 된 소프트웨어를 만들면 아주 적은 인력으로만으로도 새로운 기능을 추가하거나 유지보수할 수 있다. 변경은 단순해지고 빠르게 반영할 수 있다. 결함은 적어지고 잦아든다. 최소한의 노력으로 기능과 유연성을 최대화할 수 있다.
나를 포함해서 우리 대대수는 대체로 이러한 경험을 했다. 훌륭한 소프트웨어 설계를 바탕으로 작업하면서 즐거움을 느끼기보다는, 형편없는 소프트웨어 설계와 맞서 싸우는 일을 월씬 더 자주 맞닥뜨린다.
로버트 C 마틴, <클린 아키텍처>, 29쪽