500 likes | 677 Views
프로그래머로써의 기본 …. 신입이 알아야 할 지식. 게임 프로그래머가 되기 위한 동기 ?. 유명 게임들을 즐기며 게임 프로그래머를 꿈꾸어 왔다 ?. 현실. 실제 자기가 생각한 수준의 게임을 개발할 확률은 1% 도 되지 않음 10 개 프로젝트 중 1 개 정도만 오픈 베타를 할까 말까 한 현실 , 그나마 오픈 베타 중 극히 일부만 성공 …. 게다가 월급 밀리는 회사가 상당함 …. 현실. 그래도 꿈이 개발자라고 ?(1).
E N D
프로그래머로써의 기본…. 신입이 알아야 할 지식
게임 프로그래머가 되기 위한 동기? • 유명 게임들을 즐기며 게임 프로그래머를 꿈꾸어 왔다?
현실 • 실제 자기가 생각한 수준의 게임을 개발할 확률은 1%도 되지 않음 • 10개 프로젝트 중 1개 정도만 오픈 베타를 할까 말까 한 현실 , • 그나마 오픈 베타 중 극히 일부만 성공…. • 게다가 월급 밀리는 회사가 상당함…..
그래도 꿈이 개발자라고?(1) • 게임 업계 , “어렵다 어렵다”하지만 , 솔직히 실력만 있으면 좋은 대우를 받는 곳 • 업계에 사람은 많지만 , 항상 제대로 된 사람이 드물기 때문에 , 사람이 부족하다며 아우성인 곳
그래도 꿈이 개발자라고?(2) • 따라서 열정 , 패기 그리고 가장 중요한 독기가 있다면 크게 성공할 가능성 있다 • 기존의 상당수 프로그래머는 이미 매너리즘에 빠져 있는 상태 , 창조성과 열정이 필요한 신입의 자리는 항상 존재한다
기본에 충실 하라 • 게임 프로그래밍을 하기 위해 DirectX를 시작???? • 과연 제대로 읽어본 C++ 책이 몇 권이나 되는가? Effective C++를 읽고 이해할 수준은 되는가? • + - 도 할줄 모르는데 미적분을 할 수 있다고? • C++ , 알고리즘 , 자료구조 , 운영체제 , 네트워크 공부는 기본이다
프로그래밍에 미쳐라 • 주위를 살펴 보자 , 솔직히미쳐서 공부하는 사람이 과연 몇이나 있는가? • 미쳐서 공부하는 사람 치고 , 미래가 보이지 않는 사람은 보지 못했다
만줄 이상의 프로그램을 작성해보아라 • 책의 지식을 실제로 적용해보지 않고서는 아는 것이라 할 수 없다 • 게임이 아니어도 좋다 , 스파케티 코드도 좋다 , 만줄 이상의 코드를 작성해 프로그램을 만들어 보아라 • 만줄 이상의 코드를 관리 하는 데서 오는 문제점과 해결하려는 노력만으로도 레벨을 높일 수 있다
알콜코더블로그에 나온 Q/A (1) • 전문대 다니는 24살 학생에 내년 졸업함 • 클라이언트 입사 희망 • 스스로 C++ 기본 개념 즉 포인터,클래스, 동적 할당 등등 확실하지 않게 익히지 않음 • 취업박람회에서 알아보니 업계 관계자가 신입은 기본 실력만 있으면 된다고 들음 • 그렇다면 기본 실력은 무엇인지 궁금
알콜코더블로그에 나온 Q/A (2) • 기술적으로 가장 크게 필요한 것들은 C++, DirectX 3D, Windows API 이 세가지 (window api는 게임돌아갈 플레폼을이해하는건 필수) • C++ 잘한다고 게임 개발자가 될 수 있는 건 아님 • 다만 C++은 기본적으로 잘해야 하는 것!!!!! .C++을 할 줄 모르면 그 다음 내용들은 전혀 이해할 수 없다! • 그것도 C++을 좀 할 줄 압니다. 수준이 아니라, C++의 포인터와 메모리 구조, 자료구조, 알고리즘, 객체지향, 디자인 패턴을 전부 활용할 수 있는 수준이 되어야 함 • 이건 선택도 아니고, 피해갈 수 있는 내용도 아님, 완벽한 필수 조건임 수학의 더하기/빼기 같은 것임 , 이것을 모르고 그 다음에 나오는 미분, 적분을 할 수 없는 것과 같음 • 물론 그 후에 DirectX와 3D 그래픽스 프로그래밍을 하면서 Windows API도 같이 공부해야함 . 이 모든 것들이 C++ 기반이기 때문에 C++을 모른다면 아무것도 할 수 없다
그런데 … 왜 기본기인가? • 박지성을 보자.박지성이 원래 발 재간이 좋아 발탁된 선수는 아니다 • 그의 광고를 보면...“두 개의 심장…” 즉 엄청난 체력을 강조한다 ….. 즉 엄청난 기본기다… • 어떤 스포츠든 체력 즉 기본 바탕으로 한 플레이에는 당해내지 못한다 예) • 2002 월드컵4강 , 히딩크 감독은 한국 대표팀에 부임 후 , 가장 첫 번째 지적 “체력이 약하다…“ • “체력” 즉 기본의 부재를 가장 치명적으로 봤다 ,그는 전술 훈련이 아니라 체력 훈련에만 매진하고도 월드컵4강 기적을 이룬다 • 그 전까지만 해도 항상 기술이 부족한 한국 축구라 했지만 , 이제는 체력이 부족한가 아닌가를 따지며 해설이 진행되는 경우가 많다 • 최고의 인기 스타 이동국, 히딩크에게게으른 사자 … 로 낙인 찍히며 ,한국 축구 최고의 전성기 시절을 모두 놓친다. • 게으르고 변명이 많은 인간에게는 누구에게도 기회를 주고 싶어 하지 않는다는 걸 명심하자
그런데 … 왜 기본기인가? • 프로그래밍도 마찬가지 • 항상 배워야 하는 프로그래머 특성상 기본이 안되어 있으면 어떤 기술이든 배우는데 한계가 따르고 , 껍데기만 배우게 된다 • 희한한 꽁수나 남이 모르는 대단한 테크닉 같은 거에 환상을 품지 말라 • 기본기가 충실하면 , 조금 지식 먼저 쌓았다고 거드름 피우는 인간들보다 앞서는 것은순식간이다 • 그래서 경력과 실력은 상관관계는 있지만 비례하진 않는다
우물 안 개구리가 되지 말아라 • 세상에 실력자는 널렸다 , 폐쇄적인 마인드로 우물 안 개구리처럼 살지 말자 • 좋은 소스를 많이 보아라 . 오픈 소스 중에 검증되고 좋은 라이브러리가 많다 .
자신의 환경을 탓하지 말아라 • 평발이어서 남보다 두 배 더 더 뛰어야 했다는박지성 …. • 자신의 나쁜 조건이나 환경이 나쁜 실력의 변명이 되지 않는다 • 회사는 자선단체가 아니다 • 나쁜 환경임에도 불구하고 공부를 많이 더 열심히 했어야 더 인정 받는다
구루에게 조언을 얻어라 • 가장 빠르게 배울 수 있는 방법이 , 뛰어난 사람에게 한 수 배우는 것이다. • 구루들은 프로그래머 사이트에서 종종 볼 수 있지만 , 초보자들 Q/A를 해주기 위해 그곳에 상주 하고 있지 않다는 것을 명심해야 한다
전형적인 어리석은 질문들과 극단적인 답변(1) • Q: X에 관한 자료나 프로그램을 어디서 찾아 볼 수 있나요? • A: 여기에다가 질문을 올리느니 그 동안 구글로 검색해보겠다. 남이 당신 대신 검색해주길 바라다니 한심하네…. • 정답이다. 질문해서 원하는 답변을 얻는 것보다, 구글로 검색해서 원하는 답변을 찾는 게 훨씬 효율적이다. 아마도 구글 검색을 이용해 영문으로 된 적절한 자료를 찾지 못한다면 , 뛰어난 프로그래머가 되긴 틀렸다고 단언 할 수 있다
전형적인 어리석은 질문들과 극단적인 답변(2) • Q : CreateThread함수가 무엇을 하나요? • A : 이런 질문을 할 정도로 똑똑하다면 MSDN를 읽고 스스로 해답을 찾을 수 있을 겁니다 • Q: Printf와 put 함수 어느 게 성능이 빠를까요? • A: 한번 시간 체크해서 테스트 해보세요. 내시간을 소비할 필요도 없을 겁니다
전형적인 어리석은 질문들과 극단적인 답변(3) • Q: 제 {프로그램, 설정, SQL문}이 동작하지 않아요. • A: 이건 질문이 아닙니다. 당신이 진짜로 하고 싶은 질문이 뭔지 알기 위해 스무고개 놀이를 하고 싶지 않습니다. 전 다른 할 일이 있습니다. 이런 질문을 보면 전 보통 다음과 같이 행동합니다. • 뭔가 더 할 말은 없나요? • 그거 안 됐네요. 잘 해결되길 빕니다. • 근데 이거 나랑 무슨 상관입니까?
전형적인 어리석은 질문들과 극단적인 답변(4) • Q: XXX를 모르겠어요 급해요! • A : 급한 건 당신 사정입니다. • 그렇다 당신이 급하다고 해서 안면도없는 사람들에게 호소해봤자다. 저런 성의 없는 질문을 던지는 사람은 제대로 된 프로그래머라고 보기 힘든 경우가 많다
좋은 질문 나쁜 질문을 비교? • 어리석은 질문 : 컴파일 에러가 떴는데 무슨 에러인지 모르겠어요 • Smart : 컴파일 에러가 떴습니다 C2065 에러고요 구글 검색해보니 , 선언되지 않은 식별자라 나옵니다. 그래서 해당되는 심볼의 식별자를 검색해봤는데 정상적으로 존재하는데도 불구하고 에러가 계속 발생합니다. 이게 발생할수 있는 경우를 다 조사해봤는데도 아무리 봐도 잘 모르겠습니다 , 혹시 비슷한 경우가 있으신 분이 계신가요? - 답변 : 해당 식별자가 Define으로 재정의 되어 있는지 확인해보십시오 ….
소스 관리자를 사용해보아라 • 비록 업계에 들어가지 않았더라도 소스 관리자를 통해 소스를 관리해 보아야 한다 • 심지어 이건 프로그래머 뿐 아니라 기획,그래픽 디자인 모두에 해당한다 • 이런 것을 통해 히스토리 추적 및 , 롤백, 충돌, 머지및분기에 대해 배울 수 있다 • 이건 코드 뿐 아니라 모든 데이터를 관리하는데 대단히 중요한 개념이다
입사 지원 전 다시 확인해 볼만한 사항 • 전산과 출신 학생이라면 먼저 학교에서 배울 수 있는 컴퓨터에 관한 이론과 지식을 마스터 해 졸업 후 지원 • C++ 기본서는 마스터는 기본 , C++ 고급 서적을 읽고 이해 할 수 있어야 한다 (적어도 C++(STL포함)에 관련된 서적 10권정도 읽었는지 확인) • DirectX 기본 서적 완독 • 네트워크 및 소켓에 대한 기본 이해 • 반드시 공부한것들로 게임을 짜 볼것 • 이렇게 명백하고 간단한 사항도 만족 시키지 못한다면 , 제발 빠르게 포기하자
입사 성공!? • 입사 성공? 하지만 여태까지 해왔던 건 시작에 불과 • 여태 고만 고만한 사람들과 경쟁 및 협력을 하여서 자신의 한계를 깨닫지 못함 • 입사 후부터 선배들과 맞부딪히며 살 떨리는 본 게임 시작
신입 프로그래머의 문제 • 판타지를 가지고 있음, 게임회사도 회사다 . 회사가 게임의 판타지 같은 곳으로 생각하면 대단히 곤란. • 게임을 즐기는 것과 만드는 것은 괴리가 크다 . • 실제로 하기 싫은 일부터 해야 하는 경우가 대부분 • 코드만 짜면 생산성이 있는 줄 안다 • 프로그램만 잘하면 되는 줄 알다 - 커뮤니티 능력이 매우 낮다 • 자신이 가진 지식이 대단한 걸로 착각하는 경우가 많다
신입들의 큰 착각 • “이런 거 하려고 들어온 거 아닌데…” – 회사가 시키려는 것과 당신이하고 싶은 것이 일치할 확률은 0.001%에 가깝다 • “전 존 카멕처럼엔진만 개발하고 싶습니다”
생산성? • 코딩은 잘은 못해도 어느 정도 프로그래밍을 할 수 있다 생각하는 신입들이 상당수 존재 . • 그들의 생산성은 ? • 한마디로 마이너스……
생산성? (삽질 코드의 폐해) • 유지보수가 되어야 할 코드라면 결국 다시 업어야 하는 경우가 대부분 … • 짜면 짤수록 설계와 코드 품질은 나빠짐… • 가장 큰 문제는 대충 결과물이 나왔다는 이유로 엎어야 할 코드임에도 경영진이 보기엔 똑같아 보이므로 … 엎는 게 삽질로 보임…. • 한마디로 코드는 나락에 빠지고 , 관련 콘텐츠는차후 확장 성이 없는 죽은 코드가 된다
생산성? (연봉) • 마이너스 생산성으로는 연봉 협상 자체가 불가능하다 • 회사입장에서는 신입에 연봉에 대해 사실 엄청나게 비싸게 지불하는 것 • 물론 능력이 있다면 다음 연봉 테이블은 100%이상 뛸수 있다. • 능력이 없어 신입 때 적은 연봉을 받는 게 아니라 , 검증이 안되었기 때문에 적게 받는다는 걸 인지 • 신입의 연봉에 너무 연연하지 말 것 • 왜 비싸더라도 신입은 안 뽑고 경력자를 뽑으려는지 상식적으로 받아들여라 (검증된 것을 쓰는 것이 몇 십 배 싸다)
커뮤니티 - 회사는 학교(학원)가 아니다 • 신입의 태도의 문제 - 여태 돈을 내고 배워왔고 , 가르쳐주는 게 의무였던 사람들과 지내옴 • 회사 선배는 친구나 선생이 아니다 • 뭔가알려주면 겸허하게 받아 들이자 • 만약알려줬는데 따르지 않으면 당신에게 다음은 없다 • 업무 시간에는 개인 공부만을 위한 목적으로 회사프로젝트를 하지 말아라 - 개인공부는 도움이 되겠지만 같이 하는 동료들은 당신의 공부한 코드로 인해 엄청난 피해를 입는다 , 정 하고 싶다면 물어보고 시작해라 , 혼자 하는 프로젝트가 아니라는 걸 명심할것
커뮤니티 - MMORPG게임 개발이라면 WOW는 해볼것 • 게임을 개발하는데 게임을 모르면 다른 사람과 협력이 불가능하다 • 어떤 훌륭한 시스템을 기획자가 기획했는데 프로그래머가 이해 할 수 없으면 구현 불가. • ‘와우’정도는 해봐야 MMORPG의 시스템의 정석을 이해 할수 있다 • MMORPG의 기본도 모르는데 기획자와 대화가 될수없다 • 명심할 것은 프로그래밍은 기획자의 생각을 컴퓨터로 번역을 하는 역할이다 • 예전 엉망인 IT 번역서를 보면 IT를 모르는 단순 영문학생들이 번역한 경우가 꽤 많았다 (삼각형프레스이던가?) • 게임 프로그래밍도 마찬가지…. 게임을 모르고 게임을 프로그래밍하겠다고??? 그런데 현실은 시궁창….
커뮤니티 - 게임을 모르는 프로그래머의 예 • 기획자 - “버프 시스템에 이것을 추가 하고 싶은데….” • 프로그래머 – 버프가 뭔가요? • 기획자 ---------
커뮤니티- 타 파트를 이해하라 • 프로그래머의 생산성도 중요하지만 다른 파트의 생산성도 대단히 중요하다 • 타 파트의 생산성도 , 프로그래머가 얼마나 자동화 해주냐에 따라 달라질 수 있다 • 따라서 타 파트의 작업을 이해해야 좋은 툴과 자동화 시스템을 만들 수 있다 • 좋은 엔진은 프로그래머에게만 좋은 게 아니라 디자인, 기획자에게도 많은 기능을 제공해준다
커뮤니티 - 협력 • 게임 개발의 협력은 필수 • 자기가 편한 대로 엉망으로 하면 다른 사람은 개 고생을 하게 된다 • 개 고생한 사람이 협력 할 리 없다 -> 프로젝트는 산으로 • 협력하지 않을 거면 1인 프로젝트를 하라 , 스마트폰게임이 붐이지 않은가?
소통하라 • 대형 게임은 혼자서 만드는 게 아니다 • 고집 불통 소통하지 않으려면 혼자 게임을 개발하라 • 프로그래머가 다른 파트의 상전은 아니다 • 프로그래머는 일반적으로 창조적인 기질과 합리적인 사고 때문에 , 일반적인 대중 취향과 다른 부분이 많다. • 어려운 사람이라는 소리는 명예로운 호칭이 아니다 • 타 분야 사람과 의식적으로 소통하려 노력하자
자신이 짠 코드가 최선? • 자신이 직접 구현한 것만 고집하는 친구들을 가끔 보인다 • 자기코드가 최선이라 생각하는 건 스스로 우물 안의 개구리라 선언하는 셈 • 검증된 코드가 최선이다 • 자신의 코드는 얼마나 검증되었는가? • 표준라이브러리 ,Boost는 전 세계적으로 검증되었다 , 당신 코드는? • 기본라이브러리를 직접 구현하는 경우는 표준에 없거나 현 프로젝트에는 딱 맞지 않아 커스터마이징 해서 쓸 때 뿐이다
프로그래머의 가장 중요한 덕목? • C++ ? • directX ? • Opengl? • 네트워크? • 무슨 지식이???????
프로그래머의 가장 중요한 덕목? • 문제 해결 능력 , 논리적 사고 ,비판적 사고 • 이건 단순히 지식을 익힌다고 늘지 않는다 • 항상 왜? 라는 물음을 가짐. • 한 줄 코딩을 하지 않고도 문제를 해결하기도 한다
비판적 사고(무지한 노가다) • 문제점을 바로 잡으려 노력하지 않는다면 열심히 일은 해도 효율적이지 않다 • 제대로 코딩 하거나 , 작업을 자동화 하면 몇 분 안 걸려 끝날 일을 무의식적으로 노가다 코딩을 하다 보면 ,몇 일을 고생해야 한다 • 고생해도 결국 , 결과는 그다지 아름답지 않다 . 열심히 했지만 망한 프로젝트는 , 비 효율적으로 코딩 및 작업한 경우가한 몫 한다
마지막으로 코딩 시 주의 할 점은? • 방어적 프로그래밍 • 객체지향 공부- 소스의존성 및 모듈화 • 문제는 기억하느냐가 중요한 것이 아니라 언제 잊어버리느냐다 • 머리로만 생각하지 말고 그려서 구체화 하라
방어적 프로그래밍 • 방어적 프로그래밍이란 모듈간의 상호 작용 시 정상적이지 않는 부분을 예외 처리 하는 것 • 흔히 Assert를 이용 • 함수 안에서는 모든 인자 값을 검사 • 함수를 호출 하는 쪽에는 리턴 값 및 에러 값 조사 • IntgetArray(unsigned int index) { return array[index] ; } -> IntgetArray(unsigned int index) { assert( index < MAX_ARRAY); return array[index] ; } • 내가 짠 함수나 클래스를 쓸 때도 , 어떤 싸이코가짠 코드라 가정하고 방어적으로 프로그래밍 한다 , 그 후 결과를 보면 , 내가 정말 싸이코가아닌지 의심할 때가 많다.
객체지향 공부 • C++ 은 절차지향, 객체지향 , 제네릭 프로그래밍 ,함수 프로그래밍등등다양한 프로그래밍 스타일을 지원 • C++ 책에는 잘 나오지 않은 객체지향 자체를 공부하자 • 객체지향을 배우면 모듈성 및 의존성, 디자인패턴 등등을 자연스럽게 이해하게 된다 • 객체지향은 사실 철학이다. 프로그래밍의 큰 획은 다른 학문으로부터 오기 때문에 (디자인 패턴은 건축) 다양한 사고 능력을 길러야 한다
문제는 기억하냐가 아니라 언제 잊어버릴 것이냐… • 코딩을 함에 있어서 new를 쓰면 delete 반드시 해야 한다. 하지만 , 이 사실을 코딩 내내 기억할수 있냐는 사실보단 , delete 하는걸 언제 까먹을까? 라는 사실이 더 현실적이다 • 한마디로 실수를 유발하는 코딩 자체를 피해야 한다 • 문자열을 쓰기 위해 new char[25]를 한 후 delete [] 를 쓰기보단 아예 delete를 할 필요 없는 string 클래스를 사용하라는 뜻이다 • C++는 어렵지만 , 알면 알수록 코드 자체로 자동화 할 수 있는 기술들이 많다 (boost 를 참고 하라)
그림을 그려 구체화 하라 • 머리로만 생각하면 희미하기 때문에 구체적으로 문제를 이미지 하기 어려운 경우가 많다 • 폴리곤을 어떻게 처리할 것인가에 대한 것은 3차원적인 공간을 머리 속에 그려야 하는데 쉽지 않다 • 머리 속으로만 생각하다가 그냥 까먹기도 일쑤 • 수학적인 문제의 경우는 모눈 종이 같은 것에 대고 , 해당 그림을 그려가며 생각해본다 • 계산도 직접 종이에 공식을 적어보고 풀어보자