Clean Code ~Ch.5
이번 장부터 내가 기억해두고 싶은 내용이지만 생각을 적기에는 조금 애매한 문장들도 적어두려고 한다.
Chapter.5
팀으로 일한다면 팀이 합의해 규칙을 정하고 모두가 그 규칙을 따라야 한다.
몇 번의 (토이)프로젝트를 진행하고 느낀 점이다. 요즘에는 크게 틀을 벗어난 코드를 작성하는 사람이 많이 없는 것 같다. 내가 나이가 들어가며 주위에 개발에 진심인 사람들이 많이 남아서 그런 것인지, 개발 유튜브나 인강 등 관련 영상 및 부트캠프나 SNS등 정보가 많아져서 그런 것인지는 모르겠다. 하지만 확실한건 요즘은 정말 신기한 모습의 코드를 작성하는 사람이 많이 줄어든 것 같다.
하지만 자기마다의 기준은 있다. 그리고 이 기준은 생각보다 고집하게 된다. 프로젝트를 시작하기 전 사람들끼리 컨벤션을 정한 적이 몇 번 있다.
처음에는 정말 큰 틀만 정했다. 카멜케이스, 폴더 및 파일의 분류 같은 것 말이다. 하지만 그 프로젝트를 진행하면서 이는 틀렸다는 것을 확실히 알았다. 파일마다 정말 다른 모양의 코드를 보며 나는 정말 어지러움을 느꼈다. (지금은 다른 이유로 그룹을 나왔다.) 그 후에 다음부터는 꼭 컨벤션을 세세하게 정해서 진행하리라 마음을 먹었다.
코드 형식은 중요하다!
밥 아저씨도 정말 많이 느끼셨나보다. 책을 읽으며 내가 공감하는 부분이 많이 있을수록 그래도 내가 올바른 길을 가고 있구나
를 느낀다. 물론 실력은 아니겠지만…
500줄을 넘지 않고 대부분 200줄 정도인 파일로도 커다란 시스템을 구축할 수 있다는 사실이다.
가끔 키보드와 물아일체가 돼 코드를 작성할 때가 있다. 이때는 약간 무슨 Zone에 들어간 것 마냥 신들린 듯이 코딩을 이어간다. 문제는 이를 벗어났을 때 뒷수습이다. 아직 실력이 많이 부족해 클린 코드를 짜지 못 할 때가 더 많다. 결국 리팩토링을 해서 코드를 깔끔하게 다듬어야하는데… 내가 이 책을 읽기 시작한 이유?
사람만큼 생각이 유연한 동물도 없지만 사람만큼 생각이 딱딱한 동물도 없다. 리팩토링을 해야하는 경우도 한 번 코드를 작성해두면 기존에 작성해둔 해결법밖에 생각나지 않아서 더 깔끔한 로직으로 수정이나 코드 분리를 하기가 힘들다. 물론 내가 아직 리팩토링 책도 안 읽어보기도 했고 방법 및 기술도 모르고 무엇보다 리팩토링 하는 숙련도가 모자란 것도 있다.
쓰다보니 문장의 주제와 많이 벗어났다. 핵심은 긴 코드를 잘게 나누는 연습을 많이 해야겠다.
결국은 미로 같은 코드 때문에 혼란만 가중된 경험이 있는가?
정말 많이 겪은 일이다. 하늘고래를 만들면서 정말 최선의 노력을 해 클래스를 설계하고 코드를 분리했다. 하지만 여기서 또 한 번 엎어진 이유가 나온다.
클린 코드를 알기 전에 내 나름의 생각대로 코드를 나눴고 결국 규칙도 확실치 않은 채 어지러진 방이 되어버렸다. 나는 미니멀리즘을 꿈꿨는데 낫띵리즘이 되어버렸다. 결국 코드를 다시 엎었고 너무 잘게 나누지 않는 최소한의 기능 선에서 함수를 분리했고 이 편이 나는 조금 더 개발하기 좋았다.
하지만 이 챕터를 읽으며 알았다. 나는 코드를 나누지 못 했다. 이 글을 쓰면서 어떻게 더 나눌 수 있을지 생각이 날 정도로 부족했다. 이 책을 제대로 읽기 전에 앞장만 잠깐 읽고 클린 코드를 적용해본다는 것은 정말 오만한.. 아니 거만한 생각이었다. 아래에도 다시 적겠지만 나는 이 챕터를 읽으며 정말 많은 부족함을 알았고 더욱 이 책을 공부하고 싶은 마음이 들었다.
변수는 사용하는 위치에 최대한 가까이 선언한다. > 잘 알려진 위치에 인스턴스 변수를 모은다는 사실이 중요하다.
한 함수가 다른 함수를 호출한다면 두 함수는 세로에 가까이 배치한다.
미로같은 코드와 더불어 한번 더 깨달음을 얻은 문단이다. 전에 코드를 나눴을 때는 기능별로 섹션을 나누고자 했다. 조금 더 자세히 설명하자면 아래와 같이 구분을 했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def low_level_1:
...
def low_level_2:
...
def low_level_3:
...
def high_level_1():
...
def high_level_2():
...
함수의 수준으로 섹션을 나누어 관리했다. 이러다보니 코드를 위에서 아래로 읽지 못 하고 위 아래로 왔다갔다하는 미로같은 코드
가 탄생했다.
친화도가 높을수록 코드를 가까이 배치한다. > 개인적으로는 120자 정도로 행 길이를 제한한다.
파이썬 개발자로써 정말 마음에 드는 문장이다. PEP에서 제시된 파이썬 글자 제한은 너무 짧다…! 79자라니! 진짜 적어도 120자는 되어야한다고 생각한다.
여담으로 왜 79자인지도 알게 됐다. 천공카드에서 유래했다.
코드 형식을 자동으로 맞춰주는 도구는 대다수가 연산자 우선순위를 고려하지 못하므로, 수식에 똑같은 간격을 적용한다. 따라서 위와 같이 공백을 넣어줘도 나중에 도구에서 없애는 경우가 흔하다.
이 챕터를 읽으며 웬만한 컨벤션은 잘 지키고 있다고 생각했지만 연산자를 공백으로 우선순위를 구분하는 것은 좋은 방법인 것 같다. 기존에는 괄호를 이용해 구분을 했는데 괄호와 같이 사용하면 더욱 효과적으로 구분할 수 있을 것 같다.
아래 코드처럼 선언부가 길다면 클래스를 쪼개야 한다는 의미다.
한번 더더 깨달은 문단이다… 내 코드는 꽤 인스턴스 변수가 많았고 결국 이는 클래스를 분리해서 나눌 수 있음을 의미하는 것 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class FitNessExpediter implements ResponseSender
{
private Socket socket;
private InputStream input;
private OutputStream output;
private Request request;
private Response response;
private FitNessContext context;
protected long requestParsingTimeLimit;
private long requestProgress;
private long requestParsingDeadline;
private boolean hasError;
public FitNessExpediter(Socket s, FitNessContext context) throws Exception
{
this.context = context;
socket = s;
input = s.getInputStream();
output = s.getOutputStream();
requestParsingTimeLimit = 10000;
}
}
전반적으로 이 챕터를 가장 재밌게 읽었다. 사실 매 챕터가 진행될수록 더욱 몰입하게 되는 것 같다. 그리고 끝까지 완료해본 내 개인프로젝트가 몇 개 있어서 거기서 얻은 경험이 정말 이 책을 읽을 때 공감하면서 읽게 되는 것 같다.
얼른 일정이 조금 정리되고 자리잡히면 하늘고래를 더욱 손 봐주고 싶다(?)