2011년 11월 2일 수요일

프로그래밍 데드라인에서

원본: On Programming Deadline

데드라인에 가까워졌을 때, 실행하면 좋은 규칙들이 있다.

  1. 코드를 작성하기 전에 지속적인 배포 시스템을 설정하라
  2. 테스트를 먼저 작성하라
  3. 투명성을 유지하라
  4. 일일 TODO 목록을 수행하라
  5. 옳은 일을 해라

3번의 경우, 투명성이란, 현재 진행되고 있는 상황에 대해서 솔직하게 보스와 고객에게 공개하는 것이다. 일일 보고서도 좋고 직접 만날 수 있다면, 아침에 짧은 미팅을 가지는 것도 좋다. 가장 좋은 것은 1번이 구축되어서 이들에게 현재까지 진행된 결과물을 테스트해 볼 수 있도록 하는 것이다. 투명성을 확보해서 신뢰를 얻게 되면 데드라인 변경을 설득할 때도 도움이 된다.

5번의 경우, 시간에 쫓기더라도 올바르다고 생각하는 것을 해라. 물론 지연에 대한 질책이 걱정이 될 것이다. 하지만, 억지로 이번 데드라인을 넘긴다고 해도 다음 데드라인 때는 더욱 어려운 상황이 될 것이다. 그러니, 자신의 감각을 믿고 옳다고 생각하는데로 하라

2011년 8월 15일 월요일

게임 서버 벤치마크 정리


온라인 게임 서버 프로그래밍 벤치마크( 한동훈 저 )를 나중에 참조하기 편하게 정리했다.
Socket I/O Handling
Overlapped I/O[이하 OIO] 방식과 IOCP 방식이 가장 효율적이다. IOCP의 강점은 멀티코어 머신을 사용할 경우, 성능 향상을 기대할 수 있다.
OIO방식으로 윈도우 95부터 지원이 되므로 클라이언트에서 사용하면 좋을 것 같다.

Accept 처리
MMORPG같은 대규모 사용자를 처리하기 위해서는 AcceptEx + Polling 방식이 효율적이다.
메모리 관리
메모리 풀 방식이 가장 효율적이다. 효율면에서나 구조적 장점에서나 좋은 방식이다.
데이터베이스 API
ADO가 사용하기는 편하지만, 속도면에서는 ODBC가 적합하다. 

Nagle 옵션
Nagle을 사용하면 네트워크 응답속도를 포기하는 대신 패킷 개수에 이득을 보는 것이고, Nagle을 사용하지 않으면 응답속도에서 이득을 보지만 패킷 개수를 포기하는 것이다.
패킷 처리
WorkerThread를 별도로 생성한 후에 IOCP Queue에서 직접 패킷을 읽어내서 처리하는 방식이 가장 효율이 좋다.
날 것 패킷을 읽어서 복호화 처리와 CRC 체크 등을 처리한 다면, WorkerThread에서 할일이 너무 많아져서 이런처리를 하는 쓰레드와 WorkerThread를 분리하는 것은 어떨지는 고민해볼 필요가 있을 것 같다.

2011년 8월 10일 수요일

변수 명명 규칙 요약

이 글은 Code Complete 2의 11장. 변수 이름 효과에서 내 맘에 드는 부분만 요약한 것이다.

문제 지향성
  • 기억하기 쉬운 이름은 일반적으로 해결책보다 문제에 대해서 말한다.
  • 직원의 데이터에 대한 레코드는 inputRec보다 employeeData가 좋은 이름이다.
  • 프린터의 상태 비트 필드는 bitFlag보다 printerReady가 좋은 이름이다.
최적의 이름 길이
  • 10~16 또는 8~20
  • 코드를 봤을 때, 짧은 이름을 많이 보게 된다면, 이름이 분명한지 확인해 보야야 한다는 것이다.
변수 이름에서의 계산값 한정자
  • Total, Sum, Average, Max, Min, Record, String, Pointer같은 값을 보관하는 변수는 이름 끝에 한정자를 입력한다.
    예) revenueTotal, expenseAverage
  • Num 대신에 Index나 Count를 사용한다.
    예) customerCount, customerIndex
변수 이름의 일반적인 반의어들
  • begin/end
  • first/last
  • locked/unlocked
  • min/max
  • next/previous
  • old/new
  • opened/closed
  • visible/invisible
  • source/target
  • source/destination
  • up/down
불린 변수 명명
  • done
  • error
  • found
  • success
  • ok
명명 규약 샘플
  • ClassName
  • TypeName
  • EnumeratedTypes
  • localVariable
  • routineParameter
  • RoutineName()
  • m_ClassVariable
  • g_GlobalVariable
  • CONSTANT
  • MACRO
  • Base_EnumeratedType