7 min read

변하지 않는 것

<변하지 않는 것>은 2016년 고려대학교 정보대학 게임제작 소모임에 투고하였던 글입니다.

여러분들은 왜 대학 입시에서 컴퓨터학과를 선택하셨나요? 이 질문에 대해서는 사람마다 사실 여러가지 대답을 할 수 있습니다. 누군가는 성적에 맞춰서, 누군가는 컴퓨터가 재미있어 보여서 또 다른 누군가는 이미 컴퓨터 관련 지식이 있는 상태에서 더 공부하기 위하여 선택했을 수도 있죠. 그 중에서 동아리 활동을 선택한 여러분들은 아마 컴퓨터를 이용하여 멋진 것들을 해보고 싶다는 생각이 조금씩은 있으리라 생각합니다.

그런 여러분들이 처음에 마주하게 되는 현실은 보통은 이상과 매우 거리가 멉니다. <아이언맨>이나 <와치독>을 생각하고 "우와, 짱 멋있다!"고 생각했던 컴퓨터 분야를 조금이라도 공부해보게 되면, 그런 간지들이 그냥 영화나 게임의 연출에 불과하다는 것을 금방 깨닫게 됩니다. 우리가 된다고 자연스럽게 생각하는 아주 ~기본적인~ 것들도 그 내부에는 수많은 복잡한 로직과 체계들이 존재하는 것이라는것 또한 금방 깨달을 수 있습니다. 심지어는 콘솔에 Hello, world!를 띄우는 것도요!

네, 실망스러운 이야기부터 해 봅시다. 지금 우리가 살아가는 시대에서 소프트웨어를 만드는 것은 과거의 그것보다 훨씬 많이 복잡해졌습니다. 그리고 대부분의 여러분들은 그런 어마어마하게 많은 요구 소양들을 단번에 알아낼 수는 없습니다. 또 혼자서 해내기에는 버거울 것입니다. (혹시 그렇지 않다는 능력자가 있다면 저희 회사에 좀 지원을 해 주세요 ㅠㅠ) 대부분의 여러분들이 보고 느끼는 여러 멋진 소프트웨어는 여러 사람들이 힘을 합쳐 개발을 하였거나, 많은것들을 할 수 있는 능력자가 오랜 시간들 들여서 만들어 낸 것입니다.

또한 이 시대의 기술은 놀랄만한 속도로 발전합니다. 당장 게임 개발 동아리에서 유니티가 대세가 된 것은 채 3년이 되지 않았고, 웹 사이트들이 과거와는 비교할 수도 없을만큼 복잡한 기능들을 할 수 있는것도 굉장히 최근입니다. 극단적으로 말하자면, 여러분들이 지금 배우고 있는 C나 자바가 몇년안에 두루 쓰이지 않게 될 수도 있고 (사실 현재 C언어도 실용적인 소프트웨어를 만드는데 많이 사용되지는 않습니다.) 유니티나 언리얼과 같은 게임 엔진 또한 더 좋은 것들이 기존의 것을 대체해버릴 수도 있습니다.

이쯤 되면 궁금해지는 사람들이 있을 것입니다.

  • 그래서 무엇을 하려고 하는 것인가요? 동아리에서 앞으로 내가 얻어갈 수 있는 것은 무엇인가요?

커버 이미지이기도 한 <시간을 달리는 소녀>의 OST인 오쿠 하나코의 <변하지 않는 것>은 제가 인상깊게 들었던 노래들 중 하나입니다. 사실 주변의 거의 모든 것들은 변해갑니다. 심지어는 사람들도 주변 사람들의 영향을 받아 변해가기도 하죠. 그 중에 변화가 적고, 심지어는 변하지 않는 것들. 제가 이 문서를 토대로 진행하게 될 과정에서는 이런 소프트웨어 개발에서 필요한 역량들 중, 시간이 지나도 필요성의 변화가 적고 중요한 역량들을 갈고 닦는 것들을 하게 될 것입니다.

소프트웨어 개발에 필요한 도구, 언어 그리고 라이브러리들에 대해 이야기한 동아리는 아주 많았습니다. 그리고 대부분의 동아리 내부 스터디에서는 그런 것들을 다뤄왔었죠. 하지만 지금까지 학교 내부의 그 어떠한 동아리에서도 소프트웨어 개발 그 자체에 대해 이야기해오지는 않았습니다. 동아리 내부에서 아무리 좋은 스터디 커리큘럼을 만들어도 그 커리큘럼의 기반이 더 좋은 기반으로 대체된다면 그 커리큘럼의 중요성은 크게 적어집니다. (그것을 아주 단편적으로 보여주는게 옆동네 웹 동아리이죠.) 하지만 조금 더 근본적이고 이론적인 것들을 이야기하게 되면, 여기서 얻게 되는 역량들은 쉽게 필요성이 적어지지는 않을 것이라 생각합니다.

이 문서와 커리큘럼은 여러분이 기획자를 생각하고 있든 개발자를 생각하고 있든 리소서를 생각하고 있든간에 공통적으로 도움이 되는 내용들로 채울 것입니다. (바꿔 말하자면 각각의 분야에 대해 깊게 다루지 않을 뿐더러, 코드나 툴 또한 거의 나오지 않을 수 있습니다) 또한, 각각의 세션(진행 방법은 아직 정해지지 않았습니다)들은 어떤 포지션 또는 포지션 지망생에게 특히 더 도움이 되는가를 명시할 예정입니다.

조금 더 구체적으로 생각해 봅시다. 그렇다면 어떠한 것들이 좋은 소프트웨어를 개발하는 데에 필요한 근본적인 역량이라고 생각하세요?

사실 이 글을 쓰고 있는 저도 정답을 낼 수는 없습니다. 개개인의 생각이 다르기 때문이죠. 하지만 많은 사람들이 공통적으로 생각하고 통용되는 부분은 분명 있습니다. (어쩌면 개발자 위주일 수도 있습니다)

  • 모르는 것에 대한 연구
  • 프로젝트 관리
  • 다른 사람들과의 의사소통
  • 동일한 기능에 대한 효율성
  • 오류와 예측되지 않은 동작의 최소화
  • 편리한 작동 방식
  • 아름다움

또 생각나는 부분들이 있다면 채워주셔도 좋습니다. 이제 각각의 부분들에 종속되는 세부분야들을 기술해 보겠습니다. 놀랍게도 아마 대부분의 단어들을 "어디선가 들어본 것 같다"고 생각하실 것입니다.

  1. 모르는 것에 대한 연구

영어, 메타 지식, 구글링,

  1. 프로젝트 관리

시간 관리, 소프트웨어 공학, 소프트웨어 개발 방법론, Waterfall, Agile, Scrum, 기획, 비용 산정

  1. 다른 사람들과의 의사소통

협업 도구, 커뮤니케이션 도구, 규칙, 예쁜 코드, 리펙토링, VCS(Git)

  1. 동일한 기능에 대한 효율성

알고리즘, 자료구조, 시간복잡도, 공간복잡도,

  1. 오류와 예측되지 않은 동작의 최소화

테스트, 테스트 주도 개발(TDD), 사용자 피드백, 코드의 안정성, 예외처리

  1. 편리한 작동 방식과 아름다움

UI, UX