신입 프로그래머들의 고민을 통해 생각해보는 누구나 쉽게 적응할 수 있는 프로젝트 만들기

29 May 2014

ndc14 live

요약

  • Effective (Live) Old Project
  • 적절한 과제를 통해 신입 프로그래머의 실력 향상을 돕자.
  • 추후 라이브 상황을 고려하여 신규 때 기반을 잘 닦도록 하자.

목표

  • 오래 라이브 서비스가 가능하면서 신입이 쉽게 적응할 수 있는 project를 만듭시다.

신입은 무슨 생각?

  • 라이브에 배치됨
    • 이미 만들어진 게임, 할게 적을 것 같다.
    • 하지만 이벤트 등의 신규 컨텐츠 구현할 게 꽤 많다.
  • 실력에 대한 불안감
    • 채용 후 근거없는 자신감으로 변함
    • 실력 향상을 위한 도서 등의 가이드가 필요하다.
  • 지침과 격려가 필요함

사례 연구

  • CSO2
    • 자력으로 문제 해결 능력을 키우도록 과제를 준다.
  • M1
    • 코드 분석을 통해 의도/흐름을 정리하도록 한다.
    • 기존 시나리오를 바탕으로 유사 코드를 작성하도록 한다. (2달 정도)
    • 결과에 대한 평가/피드백으로 같은 실수 방지 등의 실력 향상 도모
    • 실무와 유사한 작업이므로 실력과 자신감을 같이 키울 수 있다.
    • 모두에게 발표: 기존 프로그매러도 큰 그림을 볼 기회를 얻음
  • GE
    • 신입이 할만한 것으로 과제를 부여
    • 있으면 좋은 기능 중 복잡도가 낮고 부담이 별로 없는 것을 준다.
    • 몇 번 반복시킨다.
  • 적절한 난이도 과제를 주어서 불안을 몰입으로 만들 기회를 주자

old project에서 겪는 문제 및 해결

  • legacy
    • 문서화했다고 해도 찾는데 부담이 크다.
    • 그냥 코드를 잘 작성해서 코드만으로 유추할 수 있도록 하자. (literate programming?)
  • TODO
    • 오래되면 엄청 많아지니 convention을 통해 category하는 등 잘 찾아볼 수 있도록 한다.
  • 툴 소스 관리
    • 툴의 binary만 버전관리하지 말고 툴 source도 같이 버전 관리를 해서 추후 유지보수가 가능하도록 한다.
  • 폐기된 코드
    • 코드 파악에 방해되므로 주기적으로 정리한다.
      • 주석처리 하지 말고 삭제하거나 브랜치로 관리한다.
    • 많아질 경우, c++ 같은 언어라면 컴파일 시간도 길어질 수 있다.
  • 컴파일 시간 증가
    • 급하면 컴파일 시간을 줄이겠다고, 하단 수정이 필요함에도 상대적으로 의존성이 적은 상단에서 수정을 할 수도 있다.
    • include 정리, forward decl, pch, include 정리, unitybuild 도입, 빌드 머신 scale up, incredibuild 도입 등을 고민해본다.
  • 과도한 절약과 최적화로 인한 유지보수 어려움
    • macro, template
      • 신입들은 익숙하지 않다.
      • visual assist x나 intellisense의 성능을 저하시킨다.
      • 왠만하면 자제 부탁
    • 주요 변수를 8bit로 구현
      • 시간이 지나면 256개로는 부족하다.
      • 쉽게 고칠 수 있는 부분이 아니라면 초기부터 넉넉하게 할당해두자.
    • profiling을 통한 필요 부분 최적화를 지향하자.
    • 차후 수정이 쉬운 방향으로 리팩토링을 하자.
  • pImpl
    • build-time이 줄어드는 것이 좋기는 하지만,
    • interface와 implement 모두 수정해야 하므로 코드 수정량이 많아진다.
    • debugging할 때도 step 수가 많아져서 불편하다.
    • 과도한 사용을 하지 말자.
  • 정보 공유
    • 정보 공유를 위해 Q&A를 자주하면 작업 효율성이 저하된다.
    • 정보 저장소를 관리해서 검색할 수 있게 하자.
  • UnitTest 부재
    • 코드 수정을 쉽게 할 수가 없다.
    • 특히 Client/Server 구조에서 둘 다 구동해서 login하고 테스트하는 것은 비용도 크다.
  • external library 사용은 신중히 하자.
    • license 정책이 변경되는 경우가 있다.
    • 해당 기능이 표준으로 통합될 수 있다.
  • Tool에 VCS api를 hard-binding하지 말자.
    • specific한 VCS api를 hard-binding하면 추후 VCS 변경이 어렵다.
    • 중간에 추상화된 layer를 두고 연결할 수 있도록 하면 좋겠다.
  • 구현을 비워둔 virtual function이 있다면 assert라도 넣어주자.

그래도 좋은 점도 있다!

  • M1
    • XML 기반의 UI
      • unpack 등 보안에 취약한 점도 있지만 생산성 증대 효과가 더 크다.
    • MetaData
      • string key/value 형태로 가독성 덜 해치는 범위에서 급한 코딩을 할 때 유용하다.
    • 직군 회의
      • merge나 localize 이슈 등의 불편 사항을 공유/논의할 수 있어 좋다.
    • 운영툴
      • 잘 만들어놨다.
    • script 함수 목록 gathering이 가능하다.
  • GE
    • 기획자 처리 범위가 넓어 대부분의 컨텐츠를 기획자가 구현하는 것이 가능하다.
      • XML 구조가 간단해서 가능하다 (?)
    • 범용적 script (...)
    • 짧은 빌드 시간
    • 단일 솔루션으로 인한 빌드 관리가 용이하다.
  • 공통
    • 전 국가 trunk를 공유하고 기능별로 로직을 분기한다.
    • merge 비용이 적고 side effect를 조기에 발견 가능하다.
    • 근데 build broken 상태가 되면 stop the world.
      • 신속한 수정이 가능하다면 괜찮다고 본다.

결국 & 그러므로

  • 기간이 좀 지나면 시니어 프로그래머는 신규 프로젝트로 떠난다.
  • 안전성 문제로 리팩토링 & 신규 기술 도입을 쉽게 할 수 없다.
  • 얻을 수 있는 부분을 얻자.
    • 라이브를 해봐서 얻는 부분이 있다.
    • 프로그래머라면, 제한된 여건에서 설득을 하는 기술 등
  • 나는 계속 배우고 있구나 라는 관점을 견지하자.

정리

  • 처음부터 많이 고민해서 좋은 라이브가 될 수 있도록 노력이 필요하다.
    • 그리고 믿고 의지할 시니어가 있으면 좋겠다.

Q&A

  • 신규 프로젝튼 어떤가요?
    • 열정적이다.
  • 라이브가 뭔가요?
    • 서비스를 시작하면 라이브임
  • 프로그래머와 소통을 하려면 어떻게 하는 것이 좋을까요?
    • 프로그래밍 언어의 기초를 익혀두면 프로그래머에 대한 이해를 하기 좋다.

  • 내용이 상당히 유익하고 많다. Effective 시리즈를 연상시킬만큼 case by case에 대한 이야기가 많다.
  • 그런데 발표 시간이 25분으로 너무 짧았고, 그 발표 시간에 맞추기 위해 내용을 축약한 점이 아쉽다.
  • 많은 사람들이 볼 수 있도록 위키나 블로그에 위 내용을 정리 & 발전시키면 좋겠다.
  • 발표자 컨디션이 좀 안 좋았는지 (양이 많아서 말이 빠른 것과 별개로) 목소리에 좀 힘이 없는 것 같았다.
comments powered by Disqus