모든 프로그래밍 언어에는 주석이 존재합니다. 주석은 사람을 위한 것이지만, 잘못 사용되면 오히려 사람을 방해하게 됩니다.

How가 아닌 Why

How는 코드의 역할이며, Why는 주석의 역할입니다. 프로그램이 어떻게 동작하는지 표현하기 위해 주석이 필요하다면, 주석을 달지 말고 코드를 수정해야 합니다. 연관된 다른 코드의 한계로 인하여 주석이 필요하다면, 주석을 달지 말고 연관된 코드를 수정해야 합니다. 대부분의 경우 주석은 제대로 된 코드를 작성하는 것으로 대체할 수 있습니다. 물론 데이터베이스, 패키지와의 연관성 등으로 인하여 비직관적 코드 작성이 정말로 불가피하다면 주석이 필요할 수 있습니다.

Semantic Naming

변수가 표현하는 정보를 설명하기 위하여 주석이 필요하다면, 변수 이름을 다시 지어야 합니다. 변수가 표현하는 정보가 여러 가지라서 주석이 필요하다면, 변수를 더 만들어야 합니다. 함수가 하는 일을 설명하기 위하여 주석이 필요하다면, 함수 이름을 다시 지어야 합니다. 함수가 하는 일이 복잡해서 주석이 필요하다면, 함수를 여러 개로 나누어야 합니다. 이 때 주석을 남기는 것은 편한 방법일 뿐 좋은 방법이 아닙니다.

Semantic Control Flow

Control Flow는 원하는 동작을 하는 것과 더불어 그 의미를 담을 수 있어야 합니다. while True를 쓰지 말라는 이야기가 있는 것은 ‘무한 반복’을 의미하기 위해 쓰이지 않는 경우가 많기 때문입니다. break/continue를 쓰지 말라는 이야기가 있는 것은 반복의 시작/종료 조건을 분산시키기 때문입니다. 의미를 벗어난 문법 활용은 지적 유희가 될 수 있을 뿐 좋은 코드와는 멀어지기 쉽습니다. 화려한 문법으로 작성한 코드는 지식을 보여줄 수 있지만, 간단한 문법으로 의미를 담아낸 코드는 실력을 보여줍니다.

Semantic Context

사람의 생각은 맥락을 가집니다. 맥락이 있는 코드는 특별한 주석 없이도 의미를 충분히 전달할 수 있습니다. 클래스의 함수는 해당 클래스와 연관된 것이고, 함수의 변수는 해당 함수와 연관된 것입니다. 일관성 있는 이름으로 연관성을 표현할 수 있고, 아래의 코드는 위의 코드와의 연속성을 표현할 수 있습니다. Line break를 통하여 대상의 분리를 표현할 수도 있습니다. 잘 추상화되어 맥락을 가진 코드에서는 일반적이고 짧은 단어만으로도 의미를 파악하는 데에 어려움이 없습니다. 코드의 맥락을 설명하기 위하여 주석이 필요하다는 생각이 들 때에는 현재 코드의 추상화가 제대로 되어 있는지, 이름에 충분한 일관성이 있는지 생각해봐야 합니다.