소프트웨어를 잘한다는 것은?
ChatGPT, Stable Diffusion과 같은 생성형 인공지능(Generative AI) 기술의 급격한 발전이 소프트웨어 개발 분야에서도 큰 변화를 만들고 있다. 인공지능 기술이 개발자가 만든 코드를 리뷰하며 더 훌륭한 코드를 제안해 주고 자동으로 코드를 생성해 주기도 한다. 10년 전 ‘소프트웨어가 세상을 먹어 치운다’1는 말이 사실임을 경험하고 있다.
현대 소프트웨어의 넓은 스펙트럼과 다양한 측면, 수없이 쏟아지는 기술로 인해 소프트웨어 역량을 특정하기 어려워졌다. 하지만, 질문은 던져 볼 수 있다. 우리는 어떤 회사가 소프트웨어를 잘한다고 생각하고 있을까? 소프트웨어를 개발하는 사람들은 어떤 사람들일까? 어떤 소프트웨어가 훌륭한 소프트웨어인가?
소프트웨어를 잘한다는 것 즉 소프트웨어 역량이 높다는 것은 첫째, 고객의 문제를 시원하게 해결해 주거나 사용자에게 새로운 경험을 제공할 수 있는 기획 역량, 둘째, 요구 사항을 만족하는 좋은 품질의 소프트웨어를 빠르게 개발할 수 있는 개발 역량, 지속적으로 소프트웨어를 업그레이드할 수 있는 관리 역량이 뛰어나다는 것을 의미2한다. 그래서, 소프트웨어 역량을 기술적인 역량으로 한정해서는 안 된다. 스티브 잡스가 인문학3을 운운했던 것도 같은 맥락이다. 기술적인 소프트웨어 개발 역량을 유지하고 발전시키기 위해서는 기본기와 빠른 학습 능력이 절대적이다. 변화 대응력에 앞서 기본기가 중요하다. 개발의 기본기4는 큰 관점에서 소프트웨어를 바라보는 아키텍처 설계(디자인) 역량, 동작하는 소프트웨어를 개발하는 프로그래밍 역량, 버그 없는 소프트웨어를 위한 테스팅 역량이다. 기본기는 곧 공통 역량이다. 매일매일 새로운 기술이 등장하고 세상을 깜짝 놀라게 하는 소식들이 홍수처럼 밀려온다. 빠르게 새로운 기술이 등장하고 업데이트되는 현대의 소프트웨어 개발 환경에서는 개발자의 학습 능력이 생산성에 높은 영향을 미친다. 새로운 기술과 도구를 습득하고 적용하는 능력은 개발자의 생산성을 크게 높일 수 있다. 그뿐만 아니라 동료와 함께 성장할 수 있는 조직 문화가 요구된다. 개인의 역량도 중요하지만, 조직의 개발 역량이 중요한 대목이다. 훌륭한 소프트웨어를 만들기 위해서는 조직의 역량이 함께 고려되어야 한다.
개발자 성장 로드맵, 함께 성장할 수 있는 문화를 만들어야
기술의 발전에 따라 소프트웨어 규모는 상상을 초월할 정도로 방대해졌다. 이는 소프트웨어 기술의 방대함을 의미한다. 기술별, 도메인별로 개발자의 성장 로드맵을 제시하고 개발자 스스로 배움의 여정을 설계할 수 있도록 제시하는 것이 필요하다. 예를 들면 Developer Roadmaps(https://roadmap.sh)과 같은 가이드가 필요하다. 일정 규모의 회사라면 소프트웨어 역량 지도 혹은 기술 역량 지도를 가지고 있다. 하지만 그 지도가 기술의 변화에 대응될 수 있도록 지속적인 업데이트가 쉬워야 한다. 회사의 인사 시스템과 자연스럽게 연결돼야 한다. 하지만 말처럼 쉽지 않고 개발자들에게 의미 있는 역량 개발 지도를 제공하지 못하고 있다.
소프트웨어 개발자는 ‘자가발전’하는 사람들이다. 개발을 즐거워하며 좀 더 나은 실력자로 성장하고 싶어 한다. 개발의 결과물이 세상을 웃게 만들고 자신을 행복하게 만드는 사람들이다. 소프트웨어 역량에 있어서 가장 중요한 것은 함께 성장할 수 있는 문화를 만들어주는 것이고 그 즐거움을 유지할 수 있도록 호기심을 자극해 주는 것이 기본이다. 능력 있는 개발자를 많이 보유하는 것이 요구된다. 개발을 잘하는 회사를 찾는 이유 중 하나는 유명한 소프트웨어 개발자의 피드백을 받고 협업할 수 있는 놀라운 경험을 할 수 있기 때문이다.
카네기 멜런 대학교를 설립한 Andrew Carnegie는 1900년에 ‘My Heart is in the Work.’라는 명언을 남겼다. 개발자는 개발 현장에서 성장한다. 자신의 산출물 혹은 멋진 프로젝트를 통해 성장한다. 개발자의 마음을 움직이고 지속적 성장을 위해서는 멋진 프로젝트, 의미 있는 일에 참여할 기회를 만드는 것이 중요하다.
인공지능 시대에 개발자로 살아남는 것이 화두가 되고 있다. 안드로이드 플랫폼이 세상에 나왔을 때를 기억한다. ‘안드로이드에 내가 했던 기능들이 포함되었으니 내 일이 없어지는 것이 아닌가?’ 하는 두려움이 있었다. 하지만, 기술의 발전은 또 다른 기술로 발전하고 그 기술을 잘 활용하는 측면으로 파이가 커지기 때문에 두려워할 필요는 없다. 변화에 맞춰 빠르게 진화하는 모습, 소위 말하는 Reskilling과 Upskilling 관점에서 성장을 도모하면 된다. 따라서 빠르게 학습하고 적응할 수 있는 훈련이 필요하다. 나심 탈레브의 저서 ‘안티프래질’은 깨지지 않으면서 더 강해지며, 진화 및 발전한다는 의미로 해석한다. 개발자는 이 개념으로 성장하는 필연적인 업의 속성을 가지고 있다.
소프트웨어 개발자 커뮤니티 활동의 중요성
모든 것을 새롭게 개발하는 경우는 거의 없다. 누군가 만들어 놓은 플랫폼과 프레임워크를 사용하는 경우도 많고 반대로 플랫폼과 프레임워크를 공개하기도 한다. 여기서 요구되는 중요한 활동이 소프트웨어 개발자 커뮤니티 활동이다. 이런 커뮤니티를 통해 플랫폼과 프레임워크를 빠르게 이해하고 적용할 수 있고 반대로 내가 만든 작품을 많은 사람이 잘 사용할 수 있도록 홍보하고 전파할 수 있다. 최근에는 이러한 활동을 Developer Relations라고 부르며 적극적으로 육성하고 있다.
소위 소프트웨어를 잘하는 회사들을 보면, 오픈 소스 프로젝트를 지원하고 개발자 커뮤니티에 적극적으로 기여함으로써 소프트웨어 개발 생태계에 큰 영향을 미치고 있다. 그뿐만 아니라 소프트웨어 개발자 컨퍼런스를 통해 밖으로는 고객의 충성도를 높이고 훌륭한 인재 확보 기회 마련한다. 안으로는 개발자 만족도 향상을 비롯한 뛰어난 개발 문화를 형성하는 종합 예술의 장으로 만들고 있다. 즉, 소프트웨어 역량 강화 플랫폼으로 활용한다. 유독 소프트웨어 개발자 행사, 컨퍼런스, 세미나, 밋업 등 다양한 개발자 중심의 이벤트가 많다고 생각해 본 적 없는가? 개발자의 심장을 건드리는 활동에 큰 의미가 있기 때문이다.
마지막으로 수요가 많은 기술에 집중하는 것도 중요하지만 떠오르는 기술에 대해 학습할 기회를 제공해야 한다. 사업적 전략에 따라 수요를 따라가는 것이 우선순위가 높겠지만 새로운 기술5을 계속 맛볼 기회를 제공하는 것이 필요하다.
<끝>
1) ‘왜 소프트웨어가 세상을 집어삼키고 있나?’는 마크 앤드리슨(Marc Andreessen)이 2011년 월스트리트 저널에서 발표한 기고문 ↩
2) ① 기획 역량: 고객의 문제를 시원하게 해결해 주거나 사용자에게 새로운 경험을 제공할 수 있는 역량 → 고객 경험, 사용자 경험, Public Relations, Developer Relations ② 개발 역량: 요구 사항을 만족하는 좋은 품질의 소프트웨어를 빠르게 개발할 수 있는 역량 → 소프트웨어 아키텍처(디자인), 구현 기술(프로그래밍 언어, 알고리즘, 자료구조), 소프트웨어 엔지니어링, 프로그램 매니지먼트 ③ 관리 역량: 지속적으로 소프트웨어를 업그레이드하는 역량: 운영, 유지보수, 업그레이드(업데이트), 프로세스, DevOps, DevSecOps, MLOps ↩
3) Steve Jobs가 했던 말, “It is in Apple’s DNA that technology alone is not enough—it’s technology married with liberal arts, married with the humanities, that yields us the results that make our heart sing.↩
4) ChatGPT가 제시해 준 소프트웨어 역량 ① 프로그래밍 언어 및 기술: 프로그래밍 언어와 라이브러리, 프레임워크, 데이터베이스 등의 기술을 이해하고 활용할 수 있는 능력 ② 알고리즘과 자료구조: 효율적인 알고리즘 및 자료구조를 이해하고 적용할 수 있는 능력 ③ 소프트웨어 아키텍처와 디자인: 소프트웨어 아키텍처 및 디자인 원칙을 이해하고, 모듈화, 결합도 및 응집성을 고려한 구조적인 설계를 할 수 있는 능력 ④ 문제 해결 능력: 복잡한 문제를 해결하기 위한 논리적 사고력과 문제 해결 능력 ⑤ 커뮤니케이션 및 협업: 소프트웨어 엔지니어링에서의 팀 협업, 코드 리뷰, 기술 문서 작성 등과 같은 협업적인 능력 ⑥ 소프트웨어 테스팅 및 디버깅: 코드 디버깅 및 단위 테스트, 통합 테스트, 시스템 테스트 등 소프트웨어 테스팅 및 디버깅 능력 ⑦ 지속적인 학습: 새로운 기술 및 트렌드를 습득하고 적용하기 위한 지속적인 학습 능력 ↩
5) 혁신 확산 이론(Diffusion of Innovation Theory)에 근거한 소프트웨어 기술 트렌드(emerging software trends and innovations) 및 Technology Radar ↩








댓글 남기기