프로젝트에서 배운 것

Oak_Cassia·2023년 3월 19일
0

프로젝트에서 배운 것

경험의 중요성

프로젝트를 진행하면서 경험의 중요성을 크게 체감했다. 만약 이전에 비슷한 프로젝트를 진행했다면, 경험을 바탕으로 위험을 보다 정확하게 예측하고, 문제 해결도 용이했을 것이다.
개인 프로젝트에서 IOCP를 조금 다뤄보니 팀 프로젝트에서 네트워크 부분을 빠르게 구현할 수 있었다.

다만, 경험이 부족한 프로젝트를 다시 준비하려면 어떻게 해야할까? 큰 프로젝트를 시작하기 전, 관련 기술을 활용한 작은 프로젝트를 진행해 보면서 미리 시행착오를 겪는 것이 좋다.
그러나 이것이 항상 가능하지는 않다. 그래서 개발 과정에서도 목표와 현재 상태를 비교하며 점검하면서 시행착오를 줄여 나가는 것이 중요하다.


기본적인 규칙

의사 결정: 의사결정 과정에서 1시간이 넘게 지연된 경우도 있었다.

장소: 장소 이용에 제약이 생겨, 작업 후 팀원의 도움이 필요한 상황에서도 원활하게 이어질 수 없었다.

시간: 코어 타임으로는 오후 2시부터 6시까지 4시간을 정하였고, 이 시간 동안 스터디카페에서 모여 작업했다. 이 시간 제약이 프로젝트 진행에 어려움을 주었다.

다음 프로젝트에서는 개발 환경을 고려하여 위험 요소를 사전에 예측하겠다.

휴식: 새벽까지 8시간 동안 고민하던 작업이 다음날 식사 중에 갑자기 해결되었다.
단지 스레드 멤버 변수 하나를 지우고 detach를 사용하는 것으로 문제가 해결되었다.
스트레스가 많이 쌓이면 합리적인 판단이 어려워진다. 이 때 휴식이 꼭 필요하다.
해결될 것 같은데 계속해서 작업을 하다 보니 새벽 4시가 되어버리고, 그로 인해 다음날 피곤함을 겪었다.

휴식과 몰입 사이에도 규칙이 필요하다는 것을 알게 되었다. 몰입과 매몰, 이 둘은 한 자의 차이일 뿐이다.


무엇을 만들지에 대한 이해 그리고 설계

어떠한 기능이 필요하고 그것을 어떻게 구현할지에 대한 충분한 고민은 필수적이다. 실제로, 설계 없이 구현에 돌입하다보니 여러 번 중단하고 다시 설계하는 경우가 잦았다. 반대로, 충분히 고민하고 설계한 후에 구현에 들어갔을 때는, 구현 단계가 단순 노동으로 느껴졌다.

프로젝트 기한이 1주 남은 시점에서 내가 만들고 있는 것이 잘못되었다는 사실을 깨닫게 되었다. 서버가 하는 일은 방을 생성하고 사용자를 관리하는 것뿐이었으며, 발전된 패킷 중계기에 불과했다.
뒤늦게 게임 루프, 데드 레커닝, 충돌 판정 등을 추가하려다 보니 단기간에 처리해야 할 작업량이 증가했다.

이를 통해 우리가 만들고자 하는 것에 대한 정확한 분석이 얼마나 중요한지 깨달았다. 어떤 기능이 필요한지, 어떻게 그것을 구현할 것인지에 대한 명확한 생각을 가진 후에 구현 단계로 넘어가야 한다는 것을 이해하였다.


기술에 관한 이야기

기술을 사용하면서 해당 지식을 내 것으로 소화할 수 있었다. 메모리, 락, 멀티 스레드, 스마트 포인터, 컨테이너 등에 대해 어떤 것을 알고 어떤 것을 모르는지 확실히 판단할 수 있었다.

프로젝트를 진행하며 발전하고 싶은 부분을 포함시키는 것은 좋지만, 만약 금전적인 목표가 있다면, 완벽하게 이해하고 있지 않은 부분은 제외하는 것이 좋을 것이다.

특히, 사용하려는 기술이 버전마다 다른 경우가 있었기에, 공부를 할 때 어떤 버전인지 지난 버전이면 현재와 달라진 점은 없는지 파악해야겠다.


커밋

컨벤션을 확립해 커밋 메시지를 통해 어떤 작업을 수행했는지 쉽게 파악할 수 있었다. 그러나 커밋의 라인 수, 주기, 그리고 커밋하는 것을 잊어버렸을 때의 대책 등 구체적인 계획이 필요했다.
때때로 커밋을 잊어버리거나 한 번에 너무 많은 양을 커밋해 세부적인 내용을 파악하는 데 어려움을 겪었다.

더욱 구체적인 커밋 규칙의 필요성을 느꼈다


협업

업무 분담과 책임 분산은 적절하게 이루어졌으나, 프로젝트 진행을 관리할 프로젝트 매니저(PM)의 역할이 필요했다. 장소와 시간의 제약 때문에 팀원의 문제를 이해하고 도와주는 체계적인 방법이 필요했다.

서로 다른 언어를 사용해서 코드 리뷰가 필요없다고 생각했지만, 코드 리뷰 시간을 설정하는 것이 우리 팀에게 필요했다. 팀원 간의 협업이나 도움을 주는 것이 원활하게 진행되도록 코드 리뷰 시간을 통해 해결할 수 있었을 것이다


일정

우리는 일정을 잘 예측하지 못했다. 많은 이슈들이 생기며 일정이 연기되는 상황이 있었다.

다음 프로젝트에서는 구현 전에 기능 분석, 작업 정리, 임계 경로 등을 살펴볼 필요가 있다는 것을 깨달았다.


테스트

통신과 패킷 처리 테스트를 위해 코드를 작성하고 삭제하는 과정을 반복하며 많은 시간을 소비했다.

테스트 전략의 필요성을 느꼈다. 프로젝트의 특성을 분석해 어떤 테스트가 필요한지 정리하고, 테스트를 위한 작업을 미리 예측하면 불필요한 반복 작업을 줄일 수 있다


마치며

이번 프로젝트는 바닥부터 직접 개발하고, 개발에 몰입하는 경험을 통해 프로젝트를 시작하거나 중간에 포기하지 않고 진행하는 데 큰 도움이 될 것이다.

정신없이 달리다 집에 돌아오니 개강이다...

앞으로

  • 게임 서버에 락이 많아서 성능이 좋지 않다. 커맨드 패턴을 공부해서 적용할 것이다.

  • 메모리의 안전한 관리에 시간을 많이 보내다 보니 러스트에도 관심이 생겼다. 러스트를 사용한 게임 서버를 만들고 싶다.

profile
어떻게 살아야 하나

0개의 댓글