brunch

You can make anything
by writing

C.S.Lewis

by 한성원 Aug 17. 2023

개발자의 성장을 위한
개선점 세 가지

진짜 실력은 성과로 증명한다.

5년 전 소프트웨어 개발에 입문했을 때 나는 코딩이 개발자의 전부인 줄 알았고, 시간이 지나면 자연스럽게 실력이 늘 줄 알았다. 그런데 막상 현업에서 개발을 해 보니 연차와 실력의 관계는 정비례하지 않을뿐더러, 코딩 능력만 가지고 실력 있는 개발자라 평가받는 것 또한 아니었다.


결론부터 이야기하자면, 실력 있는 개발자는 높은 성과를 내는 개발자이다.


몇 년 전에 이 사실을 깨달은 후, 개발을 할 때 성과를 내는 것에 집중하기 시작하면서 한 단계 성장할 수 있게 되었고, 그 덕분에 고액연봉과 많은 혜택을 받으면서 일을 하게 되었다. 이번 글에서는 나의 경험을 바탕으로 좋은 성과를 내기 위해서 반드시 성장해야 할 협업, 품질 관리, 그리고 영향력 인지에 대한 내용을 다루고 구체적으로 어떻게 개선을 해야 실력이 향상되는지 나눠보려 한다.



1. 본인만 이해할 수 있는 코드는 이제 그만.

개발자가 성과를 내기 위해 첫 번째로 갖춰야 하는 것은 뛰어난 코딩 실력이다. 다른 실력이 아무리 좋다 하더라도 코딩 실력이 형편없으면 IC(Individual Contributor) 개발자로서의 성장은 불가능하다. 개발자의 코딩 실력을 평가하는 기준은 다양하겠으나, 이 글에서는 코드 가독성(Readability)을 다뤄보겠다. 


코드리뷰를 하다 보면 코드의 가독성이 첫 번째로 눈에 들어오는데, 아직 주니어 수준에 머무르는 코드들의 대표적인 특징들은 아래와 같다.

- 한 번에 이해되지 않는 논리

- 알파벳 한 두 개의 짧은 변수 이름

- 무슨 일을 하는지 알 수 없는 기능들


 가독성이 높은 코드를 작성해야 할까?

가장 큰 이유는 원활한 협업 때문이다.

스타트업에서 일한다면 혼자서 개발을 도맡아서 할 수 있겠지만, 그렇지 않은 대부분의 경우는 누군가와 함께 개발을 하게 된다. 그래서 내 코드를 다른 개발자가 이어받아 개발을 하거나 수정을 할 상황이 반드시 생기기 때문에 가독성이 높은 코드는 개발자의 효과적인 협업의 기초가 된다.


어떻게 가독성 높은 코드를 작성해야 할까?

주니어의 수준을 벗어나기 위해서는 누가 봐도 쉽게 이해할 수 있는 코드를 작성해야 하며, 좋은 코드의 대표적인 특징들은 아래와 같다.

- 명확한 네이밍 컨벤션

- 명확한 스코프의 함수선언

- 중복된 코드의 부재(DRY: Do not Repeat Yourself)

- 불가피하게 복잡한 기능들에 대한 적절한 주석

쉽게 납득할 만한 내용이지만, 실제로 코드에 적용하려면 많은 고민과 노력이 들어간다. 가독성 높은 코드를 작성하기 위해 가장 좋은 훈련은 다른 개발자로부터 코드리뷰를 받는 것인데, 질문이나 코멘트에 자신의 감정을 분리시키고 바라보면 성장에 큰 도움이 된다. 회사에 시니어 개발자들이 있다면 그들의 코드들을 읽어보고 질문을 하면서 멘토링을 받는 것 또한 효과적인 방법이다. 만약에 그런 환경이 아니라면 GitHub에서 유명한 프로젝트들의 소스들을 많이 읽고, 특징들을 잘 분석해서 내 코드에도 적용해 보는 연습을 하는 것 또한 방법이다. 


2. 코드의 품질보증.

테스트 과정을 거치지 않은 코드는 마치 '잘 돌아갈 거라는 장담은 못합니다'라고 말하는 것과 같다. 개발자가 성과를 내기 위해서는 작성한 코드의 품질을 보장할 수 있어야 한다. 다양한 테스트들이 많겠으나, 개발자가 주로 사용하게 되는 테스트는 유닛(Unit)과 인테그레이션(Integration) 테스트가 있다.

- 유닛테스트: 외부 서비스로부터 독립된 환경에서 시스템의 기능이 정상적으로 작동하는지 확인

- 인테그레이션 테스트: 외부 서비스와 연결된 환경에서 시스템의 기능이 정상적으로 되는지 확인

실제로 현업 개발 과정에서 유닛테스트의 양이 현저히 많기 때문에 지금은 유닛테스트에 대해 알아보겠다. 


왜 유닛테스트를 작성하는 것일까? 

유닛테스트를 작성하는 가장 큰 이유는 테스트코드가 사람보다 더 믿을만하기 때문이다.

코딩을 하면서 본인이 작성한 코드의 작동 여부를 확인하지 않는 개발자는 없다. 그렇지만 시스템의 규모가 커질수록 개발자가 확인해야 하는 양 또한 늘어나면서, 현실적으로 일일이 모든 것을 개발자가 확인하는 것은 불가능하다.


어떻게 유닛테스트를 작성할까

구체적인 적용방식은 언어와 프렘워크마다 다르지만, '유닛'이라는 단위를 함수의 범위로 생각하고 테스트 코드를 작성하면 된다. 테스트의 내용은 크게 두 가지로 나눌 수 있는데, 첫째는 '유닛'이 정상작동을 하는지 확인하는 내용, 둘째는 에러 발생 시 개발자의 의도대로 처리를 잘하는지 확인하는 내용이다. 따라서 개발자가 원하는 이상적인 시나리오와, 원하지 않는 최악의 시나리오를 테스트하는 것이 핵심이다. 

개발된 시스템에 테스트 코드가 존재하지 않는다면, 새로 개발되는 부분부터 테스트 코드를 작성하면서 점진적인 테스트 커버리지를 확장하는 것을 추천한다. 유닛테스트의 커버리지(시스템 안정성을 보장하는 영역)가 늘어날수록 오류에 대한 리질리언스(Resilience)가 향상된다. 요즘같이 CI/CD를 사용하여 배포 빈도가 높은 환경에서는 새로 적용된 코드로 인한 리그레션(Regression) 문제를 배포 전에 예방하기도 한다.


3. 코드의 영향력 인지

마지막으로 성과를 높이기 위해서는 이제까지 본인이 개발한 코드가 얼마 큼의 영향력을 가지는지 적극적으로 관심을 가져야 한다.


코드가 끼치는 영향력은 무엇일까?

코드가 가지는 영향력의 범주는 사람과 시스템 두 가지로 구분되는데, 처음 설명한 남들이 이해하는 코드는 사람에게 주는 영향력이고 품질보장된 코드는 시스템에게 주는 영향력이라고 이해하면 쉽다. 


영향력을 인지하고 있는 것이 왜 중요할까?

코드는 개발자의 의도와 상관없이 영향을 끼치게 되어 있기 때문이다. 

예를 들어 개발자가 코드를 작성했는데 다른 개발자들이 알아보기 어려울 뿐 아니라, 테스트 코드도 없이 배포를 했다고 가정해 보자. 이런 코드는 동료들과의 협업에 부정적인 영향력을 행사할 뿐 아니라 버그 발생 가능성을 높여서 시스템의 안정성을 낮춘다. 이에 반해 깔끔하게 작성되어 유닛테스트를 잘 통과하는 코드가 있다면, 동료들과의 협업에도 긍정적인 영향력을 행사하고, 시스템의 안정성 향상에도 기여한다.

영향력을 인지한다는 것은 개발의 목표를 확인하는 것이다. 수많은 개발 프로젝트들이 있지만 모든 프로젝트가 다 동일한 수준의 완성도와 노력을 필요로 하지 않는다. 따라서 프로젝트의 영향력을 사전에 잘 파악한다면 유의미한 성과를 가져오는 프로젝트에 집중과 노력을 효과적으로 쏟을 수 있다. 


어떻게 영향력을 인지할까?

개발의 필요성에 대한 간단한 질문을 던져보면 코드가 얼마 큼의 영향력을 가지는지 도움이 된다. 

- 몇 개의 시스템, 혹은 몇 명의 유저에게 얼마 큼의 편리/개선을 제공하는가? 

질문에 대한 답이 사전에 주어졌다면 가장 좋지만, 그렇지 않다면 작업지시를 내린 상사나 시니어 개발자에게 질문하여 답을 구해보자. 보통은 회사의 비전, 장기 목표, 단기 목표 달성에 필요한 과제와 연결된다.



성과를 낼 줄 아는 개발자

지금까지 개발자로서 성과를 낼 수 있기 위한 협업, 품질보증, 영향력 인지라는 세 가지 개선점을 들여다보았다. 수많은 개발자들이 코딩을 하고 있지만, 그들 중 극히 일부만이 성과를 낸다. 언급한 내용 외에도 개발자가 성과를 내는 방법은 많이 있겠지만, 나는 이 세 가지에 집중하면서 개발자로서 한 단계 성장할 수 있었다. 


이 글에서 제시한 개선점은 나 또한 현재도 꾸준히 노력하고 있는 부분이기도 하다. 개발에 막 입문했다면 본인의 개발 습관에 적용하여 성장할 수 있기를 바란다. 그리고 이미 개발에 적용하고 있다면 이 글이 개발 접근법에 확신을 더하기를 바란다.  


제 글을 읽어주셔서 감사합니다. 

글의 내용이 도움이 되었다면 지인들에게 공유를 부탁드리고, 이견이나 개선점이 있으시면 댓글 부탁드립니다. 

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari