코딩 잘하는 방법?
저는 개발자(developer)보다 프로그래머(programmer)라고 부르는 걸 더 좋아합니다. 왜냐하면 프로그래머라는 단어는 프로그램(program)을 만드는 이라고 명확하게 나타내주기 때문입니다. 개발자라는 단어는 어쩐지 프로그래머라는 직업이 단순 코더(coder)로 인식되기 시작하면서, 그보다 더 많은 일을 하고 있다고 포장하기 위해 그럴듯한 단어로 대체한 것처럼 느껴집니다.
프로그램은 코드(code)입니다. 아무리 많은 기술과 기법을 사용했어도 그 마지막 결과물은 결국 코드입니다. 그래서 저한테 프로그래밍(programming)이란 곧 코딩(coding)을 의미합니다. 또한 코딩은 머릿속 추상적인 개념이 구체화되는 과정이기도 합니다. 언제부터 소프트웨어 공학이 프로그래밍에서 설계와 구현(코딩)을 구분했는지는 모르지만, 제게는 코딩이 곧 프로그래밍의 중심입니다. 나머지는 코딩을 더 잘하기 위해 필요한 도구이며 과정일 뿐입니다. (물론 디버깅도 프로그래밍의 큰 과정 중 하나입니다. 정확하게 요구사항을 분석하는 것, 코딩을 시작하기 위한 기본 개념을 선택하고 설계하는 것 등도 당연히 프로그래머의 일입니다. 하지만, 이 글에서는 코딩이 주인공이라서 다른 부분은 과소평가 할테니 소프트웨어 공학 하시는 분은 태클 걸지 말아 주시길 :)
아무튼, 댓가를 받고 업으로 프로그래밍을 하기 시작한지 약 15년 즈음 되는 지금, 언젠가부터 현업 프로그래머 중에서는 선배보다 후배들이 많아지다 보니, 가끔 술자리에서 실력도 안되는 제게 어려운 질문을 하는 후배들에게 항상 취중에 중언부언하던 개인적인 생각을, (역시 취중에) 대략 세 가지로 감히 정리해 보았습니다.
좋은 코드를 작성하려면 다른 사람의 코드를 많이 읽어야 합니다.
글 쓰는 사람이 책 한 권을 쓰기 위해 열 배 백 배 이상의 독서를 하듯이, 프로그래머도 많은 코드를 읽어야 합니다. 좋은 코드에서는 배움을 얻고, 나쁜 코드에서는 금해야 할 게 무엇인지 알게 됩니다. 그런데, 유독 프로그래머는 다른 사람의 코드를 읽는 일에 인색합니다. 심지어 매뉴얼이나 API 문서에 나온 예제 코드도 읽지 않고, 동료가 작성한 코드도 읽지 않으며 오직 자신이 만든 코드만 읽고 또 읽습니다.
모든 프로그래밍은 모방에서 시작합니다. 우리 용어로 하면 카피 앤 페이스트(copy & paste) 쯤 되겠지요. 하지만, 보는 만큼 아는 만큼 프로그래밍하게 됩니다. 경험이 아무리 많아도 새로운 지식이 없으면 결국 아는 한도 내에서 똑같은 틀의 코드만 계속 만들 뿐, 나아지는 건 없습니다.
참고로, 저는 이런 관점에서 오픈소스 프로젝트를 지지하는 편입니다. 프로그래머를 성장시키는 가장 빠른 방법 중 하나는 오픈소스 프로젝트에 참여시키는 것이라는 말도 공감합니다.
좋은 코드를 작성하려면 많이 쓰고 자주 고쳐야 합니다.
하나의 기능을 구현하기 위해 수없이 많은 시행착오를 겪어야 결국 좋은 코드가 나옵니다. 글 쓰는 사람 예를 다시 들어보면, 한 번 쓴 글을 바로 내보내는 경우는 없습니다. 수없이 다시 쓰고 퇴고의 과정을 거쳐, 심지어 쉼표 하나 마침표 하나까지 고치고 또 고칩니다. 프로그램은 더 고약한 놈이라, 릴리스 이후에도 언제든 다시 손을 대야 합니다.
저는 프로그래밍할때 가장 중요한 부분부터 간단하게 코딩하는 습관이 있습니다. 똑똑한 편이 아니라서, 대부분의 개념은 코딩하면서 구체화되는 경우가 대부분입니다. 변수 이름부터 구조체, API 방식, 동작 알고리즘 모두 계속 코딩하고 테스트하면서 계속 바뀝니다. (보통 다른 사람의 다섯 배 정도는 코드를 다시 고쳐 쓴다고 자부합니다. 자랑은 아닌데…) 그래서 저는 처음에 만든 코드 형태가 그대로 있는 경우가 별로 없습니다.
프로그래머는 결국 코드로 자신의 생각을 표현해야 하고, 자신의 주장을 뒷받침해야 합니다. 코드의 가독성(readability)을 높이기 위해 노력해야 하는 이유이기도 합니다.
쉽게 레벨업 되려는 욕심은 버려야 하지만, 꾸준이 노력하는 습관은 욕심내야 합니다.
프로그래머는 알아야 할 게 너무 많습니다. 새 언어, 라이브러리, 디자인패턴, 기술 , 개발 도구, 플랫폼, 코딩 스타일, 디버깅 기법… 거기에다 글도 잘써야 하고, 영어도 잘해야 하고, 말도 잘해야 하고… 알면 알수록 모르는 게 더 많다는 걸 느끼고 기본 개념이 중요하다는 걸 깨닫게 됩니다. 그리고 좌절과 무기력도 동시에 느낍니다. 이럴때 대부분은 머리가 나빠서, 혹은 소질이 없는 것 같다고 핑계를 대는데… 제 경험엔 모두 핑계일 뿐, 노력하지 않고 게으르거나 또는 투자를 하지 않고 바라기만 하기 때문입니다.
제가 자주 인용하는 표현이지만, 강물에 아무리 돌을 던져도 티가 나지 않습니다. 하지만, 좌절하지 않고 계속 던지다 보면 물 밑에서 돌무더기는 계속 쌓이게 되고, 어느 순간 수면위로 올라오게 되면, 그때부터는 한 개만 던져도 바로 쌓이는 게 티가 납니다. 프로그래밍도 마찬가지라, 어느 순간 흩어져있던 여러 가지가 한 가지로 연결되면서 깨닫게 되는 순간이 있습니다. 이미 알고 있던 지식의 다른 관점, 다른 개념도 조금씩 보이기 시작합니다. 그리고 그 후부터는 조금만 노력해도 다른 사람에 비해 쉽게 이해할 수 있게 됩니다.하지만, 대부분 이 단계까지 오기 전에 포기하거나, 자기합리화를 선택합니다.
여기까지 적다보니, 역시나 대가들이 했던 말을 앵무새처럼 되풀이하고 있군요. 아, 몇 시간 동안 적은 글 버리기는 아까워 그냥 내버려 두니, 저보다 나중에 시작하시는 분들에게 조금이라도 도움이 되길 바랍니다. 그리고, 지극히 개인적인 생각이라 나중엔 바뀔 수도 있고 논리적 오류도 많을 테지만, 개인 블로그에 돈 받지 않고 적는 글이니, 이렇게 생각하는 사람도 있구나 하고 넘어가 주시길~