본문 바로가기
개발

[개발자 팁] 좋은 소프트웨어 엔지니어란

by 민됴리 2023. 8. 3.
반응형

  일론 머스크가 SpaceX를 설립할 때 가장 중요하게 생각했던 것 중 하나는 소프트웨어 엔지니어의 영입이었다고 합니다. 왜냐하면 그들은 뛰어난 문제 해결 능력, 의사소통 능력, 끊임없이 배우고자 하는 마인드셋을 갖췄기 때문에 불가능해 보이는 업적을 달성하기에 필수적이었기 때문입니다. KUCC에도 프론트엔드 개발자, 백엔드 개발자, 앱 개발자, 게임 개발자부터 데이터 사이언티스트, 인공지능 엔지니어 등에 이르기까지 수많은 소프트웨어 엔지니어가 있습니다. 하지만, 많은 사람들이 자신이 '소프트웨어 엔지니어'라는 사실을 모른 채 하루하루를 보내고 있습니다. 심지어 '소프트웨어 엔지니어'라는 용어에 대해 들어본 적이 없는 분들도 많을 거로 생각합니다. 어떻게 하면 좋은 소프트웨어 엔지니어가 될 수 있는지를 안다면 단순 개발을 넘어서, 인생 전반에 걸쳐 큰 도움이 될 거으로 생각합니다. 그렇기 때문에 이 글에서는 좋은 소프트웨어 엔지니어가 되기 위한 요소들에 대해 다루도록 하겠습니다.

  누가 좋은 소프트웨어 엔지니어인지를 파악하기 전에, '소프트웨어 엔지니어'가 무엇인지부터 알아보겠습니다. 위키피디아는 소프트웨어 엔지니어를 '컴퓨터 소프트웨어의 설계, 개발, 유지 보수, 테스트, 평가를 하는 사람'으로 정의합니다. 아마 학교 강의에서 '소프트웨어 공학'강의를 들었다면 소프트웨어 엔지니어링이 소프트웨어의 거의 모든 것에 대해 다루는 학문이라는 것을 알고 있을 것입니다. 이를 통해서 소프트웨어 엔지니어는 소프트웨어의 거의 모든 것을 다루는 사람이라고 간단하게 생각해 볼 수 있을 것입니다. 그렇다면 어떤 소프트웨어 엔지니어가 '좋은 소프트웨어 엔지니어'일까요? '소프트웨어'에 대해 잘 알고만 있으면 될까요? 정말 많은 기준들이 있을 수 있습니다. 그중에서 제일 중요한 것들을 뽑자면, 탁월한 문제 해결 능력, 강력한 소통 능력, 기술적 지식 및 기술 활용 능력, 그리고 적응성과 끊임없이 배우려는 학습 마인드셋 등이 있습니다.

 

  문제 해결 능력은 복잡한 문제를 분석하고 효과적인 해결책을 제시하는 능력을 의미합니다. 이를 위해서는 분석적 사고를 통해 문제를 작은 단위로 나눌 수 있어야 합니다. 우선순위 설정도 중요한 부분입니다. 긴급성, 영향력, 필요한 노력의 양을 고려하여 어떤 문제를 먼저 해결할지 결정해야 합니다. 이러한 우선순위 결정에는 종종 8:2 법칙이 적용되곤 합니다. 이는 20%의 노력으로 80%의 결과를 얻고, 나머지 20%의 결과를 위해 80%의 노력을 기울이는 전략을 말합니다. 이렇게 중요한 문제에 먼저 집중하고, 우선순위를 명확히 하여 문제를 구체적으로 측정 가능하게 만드는 것이 중요합니다. 만약, 일을 잘게 쪼갠 후에 각 일을 하는 데 드는 노력을 측정(measure)할 수 있다면, 우선순위를 세우는데 매우 수월할 것입니다. 그렇기 때문에 소프트웨어 엔지니어링에서는 모든 업무를 분석적 사고로 분석한 후 측정가능하게 만들어야 합니다. 의사 결정 능력은 이 모든 과정을 통틀어 중요합니다. 장단점을 비교하고, 최선의 결정을 내리는 능력은 문제 해결 과정의 핵심입니다. 이를 위해서는 앞서 언급한 분석적 사고, 우선순위 설정 능력 등이 모두 잘 발달되어 있어야 합니다. 실제 업무에서, 특히 대기업에서 기획서를 작성할 때는 이러한 문제 해결 과정의 모든 요소가 반영된다고 합니다. 문제 해결 능력이 뛰어나다는 것은, 소프트웨어 엔지니어링에서 일을 잘한다는 것을 의미하며, 일상적인 문제 해결에서부터 새로운 기능 설계, 예측 가능한 상황 만들기까지 다양한 상황에서 필요합니다.

  소프트웨어 엔지니어로서 매일 해결해야 하는 문제들은 다양합니다. 이 중에서도 특히 흔하게 마주치는 문제는 코드 디버깅과 새 기능 설계입니다. 디버깅 과정에서는 문제가 시작된 위치를 분리하고 정확히 파악하는 것이 중요합니다. 이는 오류의 근본 원인을 찾고 효과적으로 해결하는 데 도움이 됩니다. 새 기능을 설계할 때는 사용할 제3자 API(또는 n번째 당사자 API)를 결정하고, 각각의 장단점을 비교하는 것이 필요합니다. 이러한 결정들은 제품의 성능, 확장성, 유지 관리 용이성 등에 영향을 미칠 수 있습니다. 일상의 작은 결정들도 문제 해결 능력을 키울 수 있는 기회가 될 수 있습니다. 예를 들어, 비 오는 날 점심을 무엇을 먹을지 결정하는 것은 음식 배달 서비스를 이용할지, 직접 픽업을 갈지 등 여러 옵션을 고려하고 결정해야 하는 상황입니다. 백준에서 알고리즘 문제를 푸는 것도 문제 해결 능력을 키울 수 있게 해줍니다. 하지만, 문제가 주어졌을 때 질문 없이 바로 풀기 시작하는 것은 위험할 수 있습니다. 문제 해결 과정은 단순히 답을 찾는 것이 아니라, 상황을 파악하고, 올바른 질문을 하며, 효과적인 해결책을 찾아내는 과정입니다. 이러한 능력을 발달시키는 것이 소프트웨어 엔지니어로서 성공하는 길입니다.

  강력한 커뮤니케이션 능력도 중요합니다. 아이디어와 기술적 세부 사항을 효과적으로 전달하는 것이 중요하며, 메시지가 명확하고 이해하기 쉽게 하는 것이 필요합니다.  또한, 한국에서도 최근 큰 관심을 가지는 부분 중 하나인데 커뮤니케이션에 낮은 비용(low cost)에 들도록 환경을 조성하는 것도 중요합니다. 역사가 오래된 대기업들은 계층적 조직 환경을 갖춘 경우가 대부분입니다. 이러한 환경에서 신입 사원들이 자신의 의사를 알리기 위해서는 자신의 사수를 시작으로 차곡차곡 단계를 밟아야 합니다. 이러한 절차는 수많은 경험에 의해 만들어졌기 때문에 결코 나쁘다고 볼 수 없지만, 시간이 오래 걸리며 모두가 자신의 의견을 펼치기에 쉽지 않은 환경이기에 커뮤니케이션에 높은 비용을 들게 해줍니다. 또한, 조직이 꽉 막혀있다면, 그 누구도 섣불리 위험을 감수하고 자신의 의견을 피력하지 않으려고 할 것입니다. 따라서 모두가 모든 유형의 피드백을 주저 없이 제공하고 유머의 힘을 활용하여 커뮤니케이션 비용을 낮출 수 있도록 해야 합니다. 효율적인 의사 소통 능력은 업무 효율을 높이고, 협업을 원활하게 만듭니다. 또한, 글로 의사소통하는 것은 사람들을 자신이 경험한 상황으로 데려가는 데 도움이 될 수 있습니다. 이를 위해서는 글쓰기 능력이 중요하며, 블로그 작성 같은 활동으로 이를 강화할 수 있습니다. 커뮤니케이션이 중요한 이유는 소프트웨어 엔지니어링의 거의 모든 활동이 협업으로 이루어지며, 글을 잘 쓰는 사람이 코딩도 잘한다는 말이 있듯이 코드에서도 커뮤니케이션이 나타나기 때문입니다. 

  기술적인 기술과 기술 활용 능력은 소프트웨어 엔지니어로서 성공하기 위한 핵심적인 부분입니다. 기술적인 지식을 쉽게 말하면 '전공 지식'이라고 할 수 있습니다. 자료구조, 알고리즘, 운영체제, 컴퓨터 네트워크 등 컴퓨터에 대한 깊은 이해는 필수적입니다. 이는 컴퓨터 관련 문제들을 접할 때 중요한 자원이 되며, 문제를 해결할 때마다 검색에 의존하지 않고도 문제의 근본 원인을 이해하고 해결책을 찾을 수 있게 합니다. 소프트웨어 라이프사이클에 대한 경험도 중요합니다. 이는 미래의 사건들을 예측하고 설계 단계에서 이를 고려하는 능력을 의미하며, 이는 주니어와 시니어 엔지니어를 구분하는 중요한 요소가 된다고 합니다. 많은 인사 담당자님들이 이력서에 많은 프로젝트를 했던 것보다 유지 보수를 포함한 소프트웨어 엔지니어링의 전 과정을 겪은 사람의 지식과 경험을 훨씬 높게 친다고 합니다. 마지막으로, 프로그래밍 언어에 대한 능숙함도 중요합니다. 이는 생각한 것을 빠르게 코드로 옮길 수 있게 하며, 동시에 가독성을 확보할 수 있게 합니다. 능숙해지기 위해서는 노력이 필요하며, 좋은 코드를 많이 읽는 것이 도움이 됩니다. 특히, 회사에서 진행하는 프로젝트나 오픈소스 프로젝트는 코드 품질이 좋은 경우가 많으므로, 이를 많이 읽는 것이 좋다고 합니다.

  마지막으로 하루가 멀다하고 끊임없이 변화하는 기술 환경에서 적응력과 지속적인 학습 마인드셋은 매우 중요합니다. 실수로부터 배우는 것은 실패를 학습 동기로 바라보고, 실수에서 얻은 교훈을 공유하여 긍정적인 영향을 만드는 것을 포함합니다. 누군가를 비판하기보다는 질문을 하고 배우는 태도가 중요합니다. 또한, 누군가로부터 배우는 것도 중요한 학습 방법입니다. 자신보다 한 단계 높은 역할 모델을 찾고, 정기적으로 1:1 미팅을 요청하여 지속적으로 배울 수 있습니다. 튜토리얼에서 배우는 것도 유용합니다. 가능하면 인터넷에 널린 블로그 글이나 유튜브 영상을 보는 것보다 사용하고자 하는 기술의 공식 문서의 튜토리얼 보시는 것을 추천드립니다. 그리고 문서를 단순히 읽는 것보다 코드를 작성하고 실행해보는 것이 더 깊게 배울 수 있도록 해줄 것입니다.

 

  지금까지 소프트웨어 엔지니어링이 문제 해결 능력, 협업, 기술적 지식 등 다양한 요소가 결합된 분야라는 것을 살펴봤습니다. KUCC의 슬로건은 'Code, Communicate, Challenge'로 이러한 요소들을 잘 반영합니다. 또한, 컴퓨터를 사랑하는 사람들이 모인 KUCC에서 제공하는 세션, 스터디, 프로젝트, 해커톤, 컨퍼런스 등 다양한 활동 등을 통해 이러한 요소들을 연마할 수 있습니다. 사실 좋은 소프트웨어 엔지니어를 나타내는 기준에 대한 정답은 없습니다. 각가의 경험, 가치, 목표에 따라 '좋은 소프트웨어 엔지니어'의 정의는 달라질 수 있습니다. 따라서 여러분 각자의 경험을 통해, 자신만의 경로를 찾고, 지속적으로 성장해서, 여러분만의 '좋은 소프트웨어 엔지니어'가 될 수 있기를 바랍니다.

 

* 이 글은 KUCC의 회지 '오대호 - 50주년 기념 재창간 특별호'에 기고된 글입니다.

반응형