소프트웨어 개발 역량은 체득하는 것이다.

최초입력 2021.02.18 11:10:57
최종수정 2021.02.22 08:56:39
어느 분야나 새로운 것을 익힐 때는 기본부터 착실히 쌓아가야 한다는 말이 정설이다. 글을 읽기 위해서는 글자와 소리를 일치시킬 수 있어야 하고, 수학을 하기 위해서는 수의 개념과 사칙연산을 이해해야 한다. 대학교에서 신입생들에게 가장 먼저 가르치는 ‘전공개론’과 ‘전공원론’은 모두 그동안 쌓아온 기초 교육의 위에 전공으로 들어서기 위한 이론을 다지기 위한 과정이라고 할 수 있다.

하지만 알고 있는 것과 할 줄 아는 것은 다르다. 지식과 이론에 기반하여 기본이 잘 갖추어 져 있더라도 실제로 해보지 않는다면 경험과 실력은 늘지 않는다.
배드민턴 치기, 자전거 타기와 같이 몸으로 움직이는 것들뿐만 아니라 누군가의 말을 듣고 핵심을 파악하는 법, 상황을 이해하고 설득하는 법과 같은 것들도 다양한 실제 상황에 부딪혀가며 직접 배워 나가지 않는다면 그 실력은 늘지 않을 것이다. 그러다가 한계를 마주하게 되면 책을 읽거나, 이론을 더 공부하거나, 누군가의 조언을 구하면서 부족한 부분을 파악해보는 노력을 해볼 수 있겠지만, 실제로 적용하여 연습하고 실행해 나가야만 진정한 본인의 실력으로 탈바꿈한다.

소프트웨어 개발 역량을 키우는 것도 이와 다르지 않다. 현재 AI•SW 개발 생태계 구성 및 확장에 힘쓰고 있는 회사인 구름을 이끄는 개발자 출신의 대표이자, 소프트웨어 마에스트로 프로그램에 멘토로서 여러 해 참여하면서 급격히 성장하는 개발자들의 공통점을 확인할 수 있었다. 바로 그 공통점은 본인이 만들고 싶은 결과물에 대한 명확한 방향성과 그것을 향해 나아가고자 하는 동기 그리고 기본적인 지식을 갖추는 것에서 한 발 더 나아가 직접 부딪혀가며 조금씩 만들어 나가는 과정 속에서 작은 실패와 작은 성공을 반복하면서도 꺾이지 않는 강한 실행력이다. 그리고 그 성장은 그가 만들고자 했던 결과물 소프트웨어로 고스란히 나타나 시장에서 그 성과를 인정받는다.

그렇다면 이러한 방식의 성장 사이클은 어떻게 시작할 수 있을까? 가장 먼저 필요한 것은 본인이 만들고자 하는 것의 모습을 상상하고 구체화하는 것이다. 그리고 그것이 기술적으로 가능한 것인지, 또 어떤 기술 스택(프로그래밍 언어, 환경 등)이 적합한지 판단하는 것이다. 정말 복잡하고 높은 수준의 제품을 만들고자 하는 것이 아니라면 여기까지는 학습해온 지식에 기반하여 해결 가능할 것이다. 하지만 그다음 단계부터는 ‘본격적인 실행', 즉 실제 소프트웨어 개발 활동이 필요하다.

초심자가 스키를 배우는 가장 쉽고 빠른 방법의 하나로 우스갯소리처럼 이야기되는 것이 넘어졌을 때 일어나는 방법만 알면 된다는 것이다. 가장 기본적인 방법만 배우고 슬로프에 올라도 본인이 할 수 있는 수준에서 나름의 재미를 느끼며 내려올 수 있다. 처음에는 좀 넘어지긴 하겠지만, 일단 일어나는 방법만 깨닫게 되면 몇 번 넘어지더라도 다시 일어설 수 있고, 이와 함께 주변 사람들을 따라 하면서 익히는 과정을 반복하며 자신의 몸에 맞는 스키 타는 법을 체득하게 된다.

소프트웨어 개발을 배우는 방법도 비슷하다. 일단 개발 환경이 갖춰지고 나면, 어떤 코드든 작성하고 실행해보는 것이 중요하다. 이 때 비로소 책으로만 봤던 코드와 이론들이 실제 컴퓨터 속에서 어떻게 동작하는 지 어렴풋하게 감이 오기 시작한다. 많은 소프트웨어 개발자들이 이런 작은 성취감으로부터 시작했다. 본인이 생각한 것을 소프트웨어로 구현하고, 막혀 있었던 부분이나 고민하던 부분을 해결하며 더 큰 성취감을 느낀다. 개발자는 그 성취감을 반복해서 느끼는 재미로 어느새 몰입의 경지에 이르러 본인이 만들고 있는 소프트웨어와 함께 지속적인 성장을 이어간다.

현실 세계의 문제를 해결하기 위해 논리를 유도하는 사고의 연속인 소프트웨어 개발은 그 사고의 결과를 소스 코드로 표현하고 실제로 동작하게 만들어 그 문제를 해결하는 일까지 포함한다. 배드민턴을 배우면서 셔틀콕을 어떻게 치는 것이 좋을지에 대해 잘 알고 있다 하더라도, 원하는 곳으로 리턴하는 실력은 전혀 다른 이야기이다. 어느 방향에서 날아올지 모르는 셔틀콕과 다양한 속도, 궤적에 따라 어떻게 라켓을 휘둘러야 하는지는 많은 경험 누적을 통해 체득해야만 더 빠르게 반응하고 더 잘 원하는 곳으로 보낼 수 있다. 이처럼 실제로 부딪히면서 스스로 깨닫듯, 소프트웨어 개발 역시 수많은 반복과 시도를 통해 더욱 정교화되어야 한다. 다양한 상황을 경험하면서 쌓은 시나리오를 기반으로 소프트웨어 개발자는 좀 더 안정적인 논리 구조를 떠올리고 더욱 복잡한 행동을 유도할 수 있게 된다. 이것은 책이나 이론을 통해서는 절대 배울 수 없는 체득하는 과정이며, 문제 해결에 대한 추상화된 해결책들을 머릿속에 경험적으로 쌓는 과정이다. 축구선수가 수많은 연습과 실전 경험을 통해 다양한 상황을 영리하게 헤쳐 나갈 수 있는 것은 어떻게 문제를 해결할지 체득했기 때문이다.

기술과 서비스의 발전을 통해 소프트웨어 개발 분야는 이제는 진입 장벽이 높은 분야가 아니다. IT업계를 보면 프로그래밍과 관련된 전공 학위를 취득한 개발자도 있지만, 비전공 출신 개발자도 꾸준히 증가하고 있다. 개발자들은 매일 어떤 문제가 있는지 고민하고, 문제를 발견한 이후에는 어떻게 해결할지 궁리한다. 이제 막 소프트웨어 개발에 입문하고자 하는 단계라면 되도록 많은 시행착오를 겪어보면서 점진적인 성장을 추구해보기를 바란다. 앞서 말했던 것처럼 소프트웨어 개발은 도전과 경험을 통해 더욱 정교하고 복잡한 단계로 나아갈 수 있기 때문이다.

류성태 우버객원칼럼니스트(㈜구름 대표이사)
[ⓒ 매일경제 & mk.co.kr, 무단전재 및 재배포 금지]