변하지 않는 것
<변하지 않는 것>은 2016년 고려대학교 정보대학 게임제작 소모임에 투고하였던 글입니다.
여러분들은 왜 대학 입시에서 컴퓨터학과를 선택하셨나요? 이 질문에 대해서는 사람마다 사실 여러가지 대답을 할 수 있습니다. 누군가는 성적에 맞춰서, 누군가는 컴퓨터가 재미있어 보여서 또 다른 누군가는 이미 컴퓨터 관련 지식이 있는 상태에서 더 공부하기 위하여 선택했을 수도 있죠. 그 중에서 동아리 활동을 선택한 여러분들은 아마 컴퓨터를 이용하여 멋진 것들을 해보고 싶다는 생각이 조금씩은 있으리라 생각합니다.
그런 여러분들이 처음에 마주하게 되는 현실은 보통은 이상과 매우 거리가 멉니다. <아이언맨>이나 <와치독>을 생각하고 "우와, 짱 멋있다!"고 생각했던 컴퓨터 분야를 조금이라도 공부해보게 되면, 그런 간지들이 그냥 영화나 게임의 연출에 불과하다는 것을 금방 깨닫게 됩니다. 우리가 된다고 자연스럽게 생각하는 아주 ~기본적인~ 것들도 그 내부에는 수많은 복잡한 로직과 체계들이 존재하는 것이라는것 또한 금방 깨달을 수 있습니다. 심지어는 콘솔에 Hello, world!를 띄우는 것도요!
네, 실망스러운 이야기부터 해 봅시다. 지금 우리가 살아가는 시대에서 소프트웨어를 만드는 것은 과거의 그것보다 훨씬 많이 복잡해졌습니다. 그리고 대부분의 여러분들은 그런 어마어마하게 많은 요구 소양들을 단번에 알아낼 수는 없습니다. 또 혼자서 해내기에는 버거울 것입니다. (혹시 그렇지 않다는 능력자가 있다면 저희 회사에 좀 지원을 해 주세요 ㅠㅠ) 대부분의 여러분들이 보고 느끼는 여러 멋진 소프트웨어는 여러 사람들이 힘을 합쳐 개발을 하였거나, 많은것들을 할 수 있는 능력자가 오랜 시간들 들여서 만들어 낸 것입니다.
또한 이 시대의 기술은 놀랄만한 속도로 발전합니다. 당장 게임 개발 동아리에서 유니티가 대세가 된 것은 채 3년이 되지 않았고, 웹 사이트들이 과거와는 비교할 수도 없을만큼 복잡한 기능들을 할 수 있는것도 굉장히 최근입니다. 극단적으로 말하자면, 여러분들이 지금 배우고 있는 C나 자바가 몇년안에 두루 쓰이지 않게 될 수도 있고 (사실 현재 C언어도 실용적인 소프트웨어를 만드는데 많이 사용되지는 않습니다.) 유니티나 언리얼과 같은 게임 엔진 또한 더 좋은 것들이 기존의 것을 대체해버릴 수도 있습니다.
이쯤 되면 궁금해지는 사람들이 있을 것입니다.
- 그래서 무엇을 하려고 하는 것인가요? 동아리에서 앞으로 내가 얻어갈 수 있는 것은 무엇인가요?
커버 이미지이기도 한 <시간을 달리는 소녀>의 OST인 오쿠 하나코의 <변하지 않는 것>은 제가 인상깊게 들었던 노래들 중 하나입니다. 사실 주변의 거의 모든 것들은 변해갑니다. 심지어는 사람들도 주변 사람들의 영향을 받아 변해가기도 하죠. 그 중에 변화가 적고, 심지어는 변하지 않는 것들. 제가 이 문서를 토대로 진행하게 될 과정에서는 이런 소프트웨어 개발에서 필요한 역량들 중, 시간이 지나도 필요성의 변화가 적고 중요한 역량들을 갈고 닦는 것들을 하게 될 것입니다.
소프트웨어 개발에 필요한 도구, 언어 그리고 라이브러리들에 대해 이야기한 동아리는 아주 많았습니다. 그리고 대부분의 동아리 내부 스터디에서는 그런 것들을 다뤄왔었죠. 하지만 지금까지 학교 내부의 그 어떠한 동아리에서도 소프트웨어 개발 그 자체에 대해 이야기해오지는 않았습니다. 동아리 내부에서 아무리 좋은 스터디 커리큘럼을 만들어도 그 커리큘럼의 기반이 더 좋은 기반으로 대체된다면 그 커리큘럼의 중요성은 크게 적어집니다. (그것을 아주 단편적으로 보여주는게 옆동네 웹 동아리이죠.) 하지만 조금 더 근본적이고 이론적인 것들을 이야기하게 되면, 여기서 얻게 되는 역량들은 쉽게 필요성이 적어지지는 않을 것이라 생각합니다.
이 문서와 커리큘럼은 여러분이 기획자를 생각하고 있든 개발자를 생각하고 있든 리소서를 생각하고 있든간에 공통적으로 도움이 되는 내용들로 채울 것입니다. (바꿔 말하자면 각각의 분야에 대해 깊게 다루지 않을 뿐더러, 코드나 툴 또한 거의 나오지 않을 수 있습니다) 또한, 각각의 세션(진행 방법은 아직 정해지지 않았습니다)들은 어떤 포지션 또는 포지션 지망생에게 특히 더 도움이 되는가를 명시할 예정입니다.
조금 더 구체적으로 생각해 봅시다. 그렇다면 어떠한 것들이 좋은 소프트웨어를 개발하는 데에 필요한 근본적인 역량이라고 생각하세요?
사실 이 글을 쓰고 있는 저도 정답을 낼 수는 없습니다. 개개인의 생각이 다르기 때문이죠. 하지만 많은 사람들이 공통적으로 생각하고 통용되는 부분은 분명 있습니다. (어쩌면 개발자 위주일 수도 있습니다)
- 모르는 것에 대한 연구
- 프로젝트 관리
- 다른 사람들과의 의사소통
- 동일한 기능에 대한 효율성
- 오류와 예측되지 않은 동작의 최소화
- 편리한 작동 방식
- 아름다움
또 생각나는 부분들이 있다면 채워주셔도 좋습니다. 이제 각각의 부분들에 종속되는 세부분야들을 기술해 보겠습니다. 놀랍게도 아마 대부분의 단어들을 "어디선가 들어본 것 같다"고 생각하실 것입니다.
- 모르는 것에 대한 연구
영어, 메타 지식, 구글링,
- 프로젝트 관리
시간 관리, 소프트웨어 공학, 소프트웨어 개발 방법론, Waterfall, Agile, Scrum, 기획, 비용 산정
- 다른 사람들과의 의사소통
협업 도구, 커뮤니케이션 도구, 규칙, 예쁜 코드, 리펙토링, VCS(Git)
- 동일한 기능에 대한 효율성
알고리즘, 자료구조, 시간복잡도, 공간복잡도,
- 오류와 예측되지 않은 동작의 최소화
테스트, 테스트 주도 개발(TDD), 사용자 피드백, 코드의 안정성, 예외처리
- 편리한 작동 방식과 아름다움
UI, UX