inlee's blog

좋은 코드란? 좋은 프로그래밍 언어란? 좋은 개발자란?

· inlee

며칠 전 모 커뮤니티에 올라온 구인 글의 내용 중 “좋은 코드란? 좋은 프로그래밍 언어란? 고급 개발자란?” 에 관련한 주제로 글을 써 주면 판단하는데 도움이 될 것 같다는 내용이 있었다. 이 문장을 보고 생각했었던 것들을 정리해 봐야겠다는 생각이 들었고 앞으로 개발자로서의 방향에 대해서도 생각할 수 있을 것 같아 적어보고자 한다. 단, 고급 개발자에 대해서는 능력이 좋은 개발자를 지칭하는 것으로 느껴져 좋은 개발자로 바꾸어 보고자 한다.

좋은 코드란

좋은 코드라고 하면 일반적으로 “다른 개발자가 알아보기 쉬운 코드” 일 것이며 그렇다고 생각한다. 다른 개발자가 알아보기 쉬운 코드라고 하면 끊임없이 듣고 있는 클린 코드(Clean code) 일 것이다. 링크에도 있듯이 클린 코드는 읽기 쉬운 코드이고 시간과 돈이라는 비용과 연관이 있으며 또한 클린 코드로 기술 부채(Technical Debt) 를 사전에 방지할 수 있다고 언급하고 있다.

그러나 비용은 연관된 일정이라는 것이 있어 클린 코드의 실현은 이상적인 것으로 보인다. 개인적인 경험으로 보자면 모 프로젝트에서 너무 짧은 일정에 쫒겨서 만드는데 집중하다가 나중에 고치려고 놔둔 부분들이 있었는데 이것들이 구렁이 담 넘어가듯이 기술부채로 자리잡아 추후 이 문제로 유지보수 하는데 많은 비용을 들인 적이 있었다. 이 경험으로 구현 과정에서 클린 코드를 실천하는 것이 나중에 고생을 덜 하게 된다는 것을 느꼈다. 하지만 현실적으로 기술부채 모두를 해결할 수 없었다. 그리고 르블랑의 법칙인 “나중은 결코 오지 않는다"처럼 프로젝트를 완료한 후 고치는 일은 없었다.

결국 클린 코드는 기술 부채를 줄이고자 하는 행동이다. 기술 부채를 줄인다는 것은 앞으로 발생할 것으로 예상되는 비용을 줄인다는 것이다. 또한 클린 코드는 초반 생산성이 클린 코드가 아닌 경우보단 낮지만 중후반으로 갈수록 생산성을 일정하게 유지시키는 것이 목적이다 (참조: 박재성 Youtube).

그리고 이를 하는데 있어 중요한 것은 커뮤니케이션 이다. 여기서 중요한 건 커뮤니케이션은 개발자간에 하는 것이 아니라는 것이다. 업무는 개발자를 포함한 여러 관계자들을 통해 만들어지기 때문이다. 물론 개발자는 소프트웨어를 만들기 때문에 개발자들간의 커뮤니케이션이 가장 우선시 되어야 한다. 혼자서 일을 할 수 없다 (혼자서 개발을 담당한다 하더라도 프로그래밍 언어와 라이브러리 등의 오픈소스는 누군가에 의해 만들어졌으니 혼자서 일을 하는 것은 아니라고 생각한다).

정리하자면 좋은 코드는 클린 코드를 염두해 두며 원활한 커뮤니케이션을 통해 만들어지는 결과물이라 생각한다.

좋은 프로그래밍 언어란

프로그래밍 언어는 각각 만들어진 목적이 있기 때문에 좋은 프로그래밍 언어를 콕 집어서 말을 할 수는 없다. 그래도 좋은 프로그래밍 언어를 선택해보라면 상황과 목적에 맞는 것이라 생각한다. 예를 들면, Android Java 로 앱을 개발하는데 이미지 처리 과정에서 Java 보다 C++로 짠 라이브러리를 NDK로 연동해 사용하는 것이 빠르고 이러한 성능이 필요하다면 후자를 써야한다.

참고로 좋은 프로그래밍 언어는 사람들이 많이 사용하는 프로그래밍 언어와 관계는 없다고 생각한다. 매년 프로그래밍 언어 순위를 매기긴 하지만 이는 많이 사용하는 언어 순위이고 상황에 맞는다고 할 수는 없다. 단, 유사한 기능을 하는 프로그래밍 언어는 서로 비교해 보았을 때 장점이 많은 것이 일반적으로 더 많이 사용되기 때문에 순위표를 참조해 볼 수 있을 것 같다. 하지만 이 역시 장단점과 현재 상황, 목적 등을 종합적으로 비교해서 판단해야 한다. 예를 들어, Javascript로 변환하는 Transpiler인 Coffeescript와 Typescript를 예로 들자면 Javascript와 유사한 문법, 향후 지원여부, Javascript와의 호환성 등의 이유로 Coffeescript 대신 Typescript를 더 많이 사용하고 있다. 이런 이유에서 Typescript를 쓰는 것을 고려해 볼 수 있다.

뱀다리로, 프레임워크와 라이브러리의 경우에도 마찬가지라고 생각한다. 단순 랜딩 페이지를 만드는데 Laravel을 사용하는 것은 닭 잡는데 소 잡는 칼을 사용하는 것과 같다. Slim이나 Lumen과 같은 Microframework 로 만드는 것이 생산성과 유지보수성에서 훨씬 낫다. 시간이 지난 예를 들자면, Java SE의 유료화로 인해 OracleJDK 대신 OpenJDK 를 이용해 개발하는 것으로 변경하는 것을 고려해야 한다

한 가지 확실한 것은 프로그래밍 언어는 도구일 뿐이다. 이 도구는 시간이 지날수록 자주 바뀌기 때문에 사용법을 습득하고 경험들을 잘 조합해 좋은 결과를 만들어 내는데 사용해야 한다. 프레임워크나 라이브러리도 마찬가지이다.

좋은 개발자란

좋은 개발자란 무엇일까. 우선 본인부터 좋은 개발자인지 생각을 해 보게 되기 때문에 매우 어려운 주제라고 생각한다. 한 가지 확실한 것은 돈을 받고 일을 하는 프로 개발자라면 문제 해결하기 위한 코드 구현 능력이 있어야 한다.

문제 해결 능력은 하루아침에 만들어 지지 않는다. 아마추어 시절부터 꾸준한 고민과 공부가 습관처럼 이루어져야 한다. 또한 순식간에 바뀌는 트렌드와 기술을 놓치지 않기 위해서라도 공부는 필수이다. 그렇기에 어떤 회사에서는 사내 스터디와 자기발전 시간을 부여하기도 하며 어떤 사람은 삶에 틈을 만들어 공부를 한다. 쉽게 말해 엉덩이가 무거워야 한다.

혼자서 개발하는 경우는 없기 때문에 커뮤니케이션 또한 중요하다. 코드는 개발자들간, 동료간 소통하기 위한 가장 기본이 되는 커뮤니케이션 수단이기 때문에 다른 사람이 알아보기 쉽도록 작성해야 한다. 즉 클린 코드를 지향해야 하지만 현실적으로 조금 덜클린 하더라도 이해할 수 있도록 만들어야 한다. 이 능력은 개발자의 성격과도 관련이 있지만 다른 사람이 만든 코드도 자주 봐야 도움이 된다.

개인적으로는 개발과 관련된 고민을 하는 것 또한 중요하다고 생각한다. 코드를 보고 왜 이렇게 만들었는지, 문제를 다른 방법으로 해결하면 어떤지, 왜 이렇게 만들었는지 고민해보고 해답을 찾기 위해 질문과 노력을 하면 자연스럽게 답을 찾을 수 있을 것이고 본인만의 결론을 내릴 수 있다. 이 과정에서 능동적으로 일을 하게 한다. 한 가지 확실한 것은 어떤 분야에서던지 수동적으로 시키는 것만 일을 하면 중요한 업무는 주어지지 않는다.

또한 여유를 가지는 것도 중요하다고 생각한다. 사실 제일 어려운 것 중 하나라고 생각한다. 대부분의 사람들이 업무 과다로 인해 여유가 없을 것이다. 즉 버퍼를 남겨야 하는데 이 버퍼를 남겨야 자기 발전과 공부도 할 수 있다. 일이 많으면, 이 버퍼가 없으면, 매니저와 상담을 해서 줄이는 방법을 택하거나 휴가를 갔다온다. 이 방법으로 해결되지 않으면 이직을 하거나 현재 본인이 하는 강제로 삶에 브레이크를 걸어 휴식을 택하기도 한다.

개인적인 경험으로 여유가 있을 때 업무와 다른 사람과의 커뮤니케이션에서 유연해지고 좀 더 좋은 결과를 낼 수 있었다. 여유가 있어야 취미나 다른 것들을 할 수 있고 생각을 다른 곳으로 돌릴 수 있어 본업에 좀 더 좋은 결과를 가져올 수 있다 (Thinking Sideway). 취미 같은 것을 강제로 가지는 것이 여유는 아닌 것 같다. 피곤한데 강제로 취미생활까지는 할 수 없을 것 같다.

생각해 보면 앞서 언급한 것들은 개발자라면 기본으로 갖추어야 할 것들이다. 그 외에 개발자들이 갖추어야 할 것들이 무엇이 있을까? 라는 것을 생각을 해 보면 결국 소프트 스킬(Soft Skills) 이라 불리는 것들이 아닐까 생각한다. 몇년 전부터 다른 업체들과 업무를 하며 개발자의 본인의 업무 뿐만 아니라 다른 업무를 하는 사람들과 커뮤니케이션 하는 것 또한 중요하다는 것을 느끼게 되었다. 물론 개발자들과도 친하게 지내야 하지만 다른 업무를 하는 사람들과 커뮤니케이션으로 간접 경험을 통해 본인의 업무 파악에 도움이 되고 향후 업무도 원활히 진행이 된다. 개발자들 대부분은 사람보다 소스코드가 더 친해 힘들겠지만 다른 업무를 하는 사람들도 마찬가지로 개발자와 대화하는 것이 힘들 것이기 때문에 사실 서로간 노력이 필요하다. 그리고 예의를 갖추는 것은 기본이다.

마지막으로 좋은 개발자를 알아볼 수 있을까? 라는 것에 대해 생각을 해 보았는데 개인적인 경험으로는 대화가 중요했던 것 같다. 물론 같이 일을 해야 하기 때문에 개발자로서의 능력은 어느정도 갖추고 있어야 함은 당연하다.

마치며

“좋은 코드란? 좋은 프로그래밍 언어란? 좋은 개발자란?” 이라는 개인 생각이 담긴 글을 쓰며 너무 부끄러웠다. 누구에게 이 주제에 대해 이야기를 할 수 있을 정도의 사람인가? 대한 생각이 머릿속을 떠나지 않았다. 좋은 코드와 프로그래밍 언어에 대해서는 개발 경력과 경험으로 어느정도 쓸 수 있지만 좋은 개발자란 이라는 주제는 글 쓰는게 매우 어려웠다. 나 자신부터 다른 사람들과의 커뮤니케이션은 잘 했는가에 대해서는 본인도 사람이라 화가 난 상황들도 있었기 때문에 정말 많은 생각을 하게 했다.

사실 이 글은 욕 먹을 각오로 쓰는 글이며 삶을 되돌아보고 기준을 세우기 위한 글이다. 또한 이 주제는 개발자 모두가 각각 다른 경험들을 하기 때문에 정해진 정답이 없다고 생각한다. 이 글을 보고 누군가에게 도움이 된다면 좋겠지만 잘못된 부분이 있으면 꾸짖어 주었으면 한다.