개발자로 후회없는 삶 살기
Pokemon Project 본문
서론
이 프로젝트는 논리적인 생각과 프로젝트를 구상하는 능력을 키우기 위한 Game을 만든 프로젝트입니다. 데이터 프로젝트 외 처음으로 한 개발 프로젝트로 개발자 도입의 문을 연 프로젝트로 매우 중요합니다.
-> 전체 코드
https://github.com/SangBeom-Hahn/Pokemon
본론
- 주제
script 형식 포켓몬스터 게임 개발 프로그램으로 단순히 코드를 작성하는 것에 그치지 않고 프로젝트 구성, 기획 등 실제 현업에서 프로젝트를 진행할 때 필요한 능력을 함양하는 것을 최종 목표로 합니다.
- 프로젝트 진행 방법 고민
1. jira : 소프트웨어 공학 시간에 배운 jira 협업 프로그램을 사용해보고 장점과 추가로 필요한 기능을 생각해 보기!
2. 프로젝트 구현시 순서
1) 진짜 뭐부터 해야 할지 모르겠었습니다.
2) 주제를 잡고 큰 에픽을 잡고 일별 목표를 스토리로 잡고 최소 이틀 전에 지라에 기입해놓는 방식을 채택했습니다.
-> 지금은 기한이 있는 프로젝트도 아니고 구체적으로 어떻게 진행해 나갈지 모르기에 눈앞에 보이는 것만 헤쳐나가는 거지 현업에서는 전체 프로젝트 주제를 잡고 큰 에픽을 전부 다 계획해 놓을 수도 있습니다.(이런 것을 12월에 교육 나가면 현업자분들께 여쭤보는 것이 정답입니다.)
e.g. 예시 1
예시 2
3) 스토리에 기한 잡고 기한에 맞게 실천하자! (기한 내에 끝낸다!!라는 목표지만 여전히 눈앞에 보이는 것만 해결하는 방식입니다.)
4) 2, 3번을 반복합니다.
- 지라 연결
레포 생성 > 지라와 깃허브 연결하면 끝입니다.
-> 레포를 생성하고 내가 참조해야 할 것들 : Official 레포의 구성을 봐서 requirement나 src 파일 분산 등으로 남들도 내 소스를 사용하기 위해 꼭 필요하니 배워야 합니다.
- 깃허브 연동
1. 원격 저장소와 내 로컬 연결
2. 브랜치 만들 때 이슈명으로 만듦
3. 커밋할 때 이슈명 꼭 넣음
4. push 해야 깃허브 네트워크에 브런치가 생김
5. 매 스토리를 시작할 때마다 브랜치를 땁니다.
- 프로젝트 진행 방법 고민 강화
강화하기 전 방식으로 하니 내가 현재 무엇을 목표로 하는지 지금은 어떤 코드를 짜야하는지 내일은 뭐 할지 에픽으로 뭘 만들어야 할지 전혀 모르겠었습니다!! 그래서 강화해 보겠습니다.
=> 소프트웨어 공학적으로 계획을 짜보자
1. 프로젝트 기획서 작성
2. 프로그램 구성도 작성(map이 될 수도 있고 내가 좋아하는 방식인 구체적으로 세세하게 하나도 빠짐없이 타이핑을 치는 방법도 있습니다.)
3. 프로그램 구성도에 맞춰서 프로토타입 작성 : 그림으로 그려볼 수도 있고 tech 구성도를 다이어그램으로 그릴 수도 있겠습니다.
4. 계획서를 바탕으로 디테일하게 형상관리(지라)
- 브랜치
=> 중대한 문제 1
브랜치 17를 하던 중에 완료하지 못하고 브랜치 18를 하게 생겼습니다. 이때 어떻게 깃을 관리해야 할까요?
-> 에러가 발생했습니다. 분명 브랜치 16 머지하고 브랜치 17하다가 브랜치 18한 거로 생각했는데 16에서 18로 브랜치 생겼습니다.
+ 그리고 생각해 보니깐 브랜치 17에서 브랜치 18로 하는 게 아니고 17에서 하다가 메인으로 가서 18브랜치 만들어야 하는 거였습니다.
-> 내 생각 : 브랜치 17을 지금까지 한 거 커밋합니다. > 브랜치 18로 가서 할 일 합니다.(브랜치 17과는 다른 행에 작성해야 합니다.) > 브랜치 18 완료하면 메인에 머지합니다. > 브랜치 17로 가서 할 일 하고 메인에 머지해야 합니다.
∴ 느낀 점
1) 브랜치 16에서 브랜치 열어서 브랜치 18 만들어도 브랜치 18에서 메인으로 머지하면 메인에서 브랜치 18연 것처럼 됩니다.
2) 브랜치 17하다가 브랜치 18하면 브랜치 17에서 브랜치 18을 만드는 게 아니고 메인에서 18 생성해야 합니다.
=> 중대한 문제 2
브랜치 21을 다하고 브랜치 17로 돌아왔는데 브랜치 17은 브랜치 21을 하기 전에 이미 하고 있던 것이었습니다. 브랜치 21에서 바뀐 것을 브랜치 17에 적용을 하고 일을 해야 할까요? 아니면 그냥 브랜치 17에 하고 머지할까요??
-> 브랜치에 따라 작성해 놓은 코드가 다른데 어떻게 할 것인지 이것입니다. > 브랜치 마다 다른 작업을 했다는 고민입니다. > 검색을 해보니 브랜치 따로따로 처리하고 각각 메인에 머지하면 된다고 합니다. 근데 필자는 따로따로 처리 중에 저장이 안 되었습니다.
-> 오류 내용
Failed to save : The content of the file is newer. Please compare your version with the file contents or overwrite the content of the file with your changes.
-> 질문
1 : 저장 안 하고 꺼도 새로 추가한 내용 남던데 무시하고 진행할까요?
2 : 그냥 overwrite 할까요?
=> 중대한 문제 3
23, 24에서 할 일을 17에서 하고 있었습니다 > 그래서 지금까지 변경사항을 main으로 머지하고 23, 24를 하고 다시 17을 하려고 했는데 머지를 하니 Automatic merge failed; fix conflicts and then commit the result. 라는 오류 발생 = 'CONFLICT(충돌)' 이라는 오류가 발생했습니다.
-> 발생한 이유
저번에 메인에서 작업해서 그렇습니다.
+ 어째?? : 이럴 경우 개발자가 직접 수동으로 수정해야 합니다.
-> 느낀 점 :
1. 키보드 잡기 전에 내가 현재 dir에서 어떤 브랜치를 보고 있나를 먼저 봐야 합니다.
2. 절대로 메인을 수정하지 말자!
3. 항상 pull부터 받는 것을 습관 들이자!
- 이슈
프로젝트를 진행하면서 직면하는 다양한 애로사항을 다 이슈라고 할 수 있겠지만 여기서는 프로젝트를 계획할 때 원하는 결과물과 다를 경우를 이슈라고 했습니다.
1. 죽은 포켓몬들이 체력이 회복이 안되어 있었습니다. -> 근데 생각을 해보면 내 캐릭터가 도망가도 적 체력을 회복되기도 해야 하는 등 이슈가 많았습니다.
-> 적의 체력이 회복되어야 할 순간
1) 내가 도망감 ok
2) 내 포켓몬이 다 죽음 ok
3) 적 포켓몬을 쓰러뜨림 ok
4) 적이 도망감 ok
2. 포켓몬 개수는 유지가 된다 내 포켓몬들도 체력을 회복해야 한다 >> 완료/
3. 도망가도 공격하도록 나옴 >> 완료/
4. 체력이 50 이상이어도 몬스터볼 던지기 가능 >> 완료/
5. 포켓몬 볼 5개를 사고 0개를 사면 0개가 되어 가방이 비는 현상/
6. 6마리를 잡으면 무조건 Y를 입력하는 현상/
- 모듈화
1. 반복되는 부분
2. main 함수에는 play() 이렇게 한 줄 원형만 두고 play()의 본체는 main함수 밖에 두어 가독성을 강화할 부분
결론
- 느낀 점
1. 지라의 장점 : 내가 현재 어떠한 일을 하고 있나 한눈에 파악 가능합니다.
2. 형상관리의 중요성 :
-> 이번 프로젝트에서 못 한 형상관리들
1) 스토리 완료한 일/ 못 한 일
2) 이슈
3) 서브 루틴
: 메인 루틴을 작성하다 보면 서브 루틴을 무시하고 메인 루틴을 다 끝낸 후 서브 루틴으로 돌아와야 하는 경우가 생깁니다. 이때 메인 메서드 끝내고 돌아와야 할 것들을 모아서 형상관리하면 좋겠습니다.
+ main 루틴을 작성하다가 이 부분은 서브 루틴이 들어가야 하는 곳이라고 생각되면 형상 관리가 필요한 모든 곳(ex 코드, 프로그램 구성도 등)에 "서브루틴 이름" : "서브루틴 목적" + 메인 메서드 끝나고 돌아와야 할 것!이라고 남겨두는 것이 좋습니다.
3. 서브 루틴에 들어가는 순간과 나오는 순간을 생각하면 반은 간다!
4. 깃을 잘 알아야 하는 이유
현업에 가면 코드도 복잡하고 깃도 복잡합니다. 코드가 복잡한 것은 막을 수가 없습니다. 그러니 깃이 단련되어야 합니다. 근데 깃도 허술하면 답도 없습니다.
5. 깃은 신이다,, 와!!! 갑자기 한글이 다 깨졌는데 git reset head로 다 복구해 주었습니다!
- 궁금한 점
1. 에픽을 매일매일 만들지 아니면 타당성 분석을 할 때 미리 다 만들어 놓고 구석구석 추가 사항을 끼워 넣는 게 맞는 건지(폭포수 vs 에자일이라고 볼 수는 없습니다. 폭포수도 미리미리 요구사항을 다 미리 정의합니다.)
2. 브랜치 21을 다하고 브랜치 17로 돌아왔는데 브랜치 17은 브랜치 21을 하기 전에 이미 하고 있던 것이었습니다. 브랜치 21에서 바뀐 것을 브랜치 17에 적용을 하고 일을 해야 하나요? 아니면 그냥 브랜치 17에 하고 머지하나요??
3. 브랜치 A에서 푸시했어 근데 잘못해서 메인에서 수정했습니다. 그리고 브랜치 A에서 메인의 수정을 담아야 하면 이 상황에서 A에서 pull 해야 하나요? 메인에서 수정한 것을 리셋하는 것은 못하나요?
- 개선할 점
1. 브랜치 실무 방법 찾아보기
2. 전역변수 위치 고민해 보기
3. 함수화 하기 + 모듈화
4. 개발자의 숙명 성능 높이기
5. 포켓몬 관리 자료구조/
6. 모든 경우에서 잘 동작하도록 해야 한다!! (예외처리, 모든 유즈케이스)
=> 최종 개선하면서 느낀 점
2, 3 :
① 전역변수가 너무 많으면 이걸 헤더파일에 넣자!! java에서 Object 클래스에 모두 상속받는 것도 이러한 이유입니다.
② flag나 cnt는 게임이 진행되면서 기록이 계속 남아야 하니 위치가 전역인지 지역인지 중요하지만 단순 입력(scanf)을 위한 변수는 위치 상관없이 해당 지역 block에 쓰면 됩니다.
4, 6 : 함수화와 매개변수를 지정하여 코드 반복을 피할 수 있습니다.