c++ 코드 품질 관리 비법
DESCRIPTION
NHN NEXT 휴먼 디자인 프로젝트 for 게임 과목의 스터디 자료입니다.TRANSCRIPT
NHN NEXT 이선협
C++관리����������� ������������������
����������� ������������������ 비법코드����������� ������������������ 품질
지피지기면 백전백승이라는데…!!
도대체 코드 품질이 뭐야?
‘코드 품질’에 대해 따로 정의된 문서는 없다
그래서 찾아봤습니다
http://stackoverflow.com/questions/405243/how-do-we-define-code-quality코드 품질에 대한 어느 외국인의 생각
어려운 영어보다는 쉬운 그림으로 봅시다
Bad code.. 나쁜 코드가 있습니다
Good code!
Bad code..
코드를 Perfect하게 만듭시다
Good code!
Bad code..
How?
Good code!
Legible TestableFlexible CompliantEconomic
Bad code..
5가지 원칙을 적용
How?Good code!
Legible TestableFlexible CompliantEconomic
Bad code..
5가지 원칙을 적용
Refactoring!Good code!
Legible TestableFlexible CompliantEconomic
Bad code..
5가지 원칙을 적용
5가지 원칙에 따라 리팩토링을 하면 좋은 코드가 됩니다.
Good code!
Legible TestableFlexible CompliantEconomic
Bad code..
5가지 원칙을 적용
Refactoring!
뭔소리야?
Step By Step
천리길도 한걸음 부터
- 모든 예제는 다음 환경에서 제작됬습니다 -!!
Visual Studio 2013!Windows 8
!!
보기 좋은 떡이 먹기도 좋다고!!
보기 좋은 코드를 만듭시다
Legible
Many
void func( int value ) { /* … */}
void func( int value ) { /* … */}
void func(int Value) { /* … */}
void func(int value){ /* … */}
void Func(int Value){ /* … */}
void func( int iValue ) { /* … */}
void Func( int iValue ) { /* … */}
void FUNC( int VALUE ) { /* … */}
class CPeopleState { public: CPeopleState(); ~CPeopleState(); ! /* … */}
class PeopleState { public: PeopleState(); ~PeopleState(); ! /* … */}
class peopleState { public: peopleState(); ~peopleState(); ! /* … */}
class people_state { public: people_state(); ~people_state(); ! /* … */}
이 세상에는 정말 많은 코딩 스타일이 있습니다그 수많은 코딩 스타일에 적응하기엔 좀…
다들 표준 표준 하는 이유가 있습니다.
Good code! Bad code..
코딩 컨벤션 정하기
정했으면 각자 코딩
코 딩 완 료 !
다같이 코드 리뷰…
리팩토링
Good code! Bad code..
코딩 컨벤션 정하기
정했으면 각자 코딩
코 딩 완 료 !
다같이 코드 리뷰…
리팩토링
좋은 방법 입니다. But…
Good code! Bad code..
코딩 컨벤션 정하기
정했으면 각자 코딩
코 딩 완 료 !
다같이 코드 리뷰…
리팩토링
좋은 방법 입니다. But…
Good code! Bad code..
코딩 컨벤션 정하기
정했으면 각자 코딩
코 딩 완 료 !
급한 상황에 무슨 코드 리뷰!!
리팩토링
좋은 방법 입니다. But…
Good code! Bad code..
코딩 컨벤션 정하기
정했으면 각자 코딩
코 딩 완 료 !
급한 상황에 무슨 코드 리뷰!!좋은 방법 입니다. But…
망함
이럴땐 툴을 사용해 봅시다.
CppCheckGoogle CppLint
잠재적 오류 검출코딩 스타일 체크
CppCheckGoogle CppLint
잠재적 오류 검출코딩
CppCheck• 공짜 • 위험한 코드를 지적해주는 도구 • 여러 IDE 지원!• Hudson, Jenkins와 같은 CI 도구에도 사용가능 • IDE와 별도로 진단 도구 지원 • http://cppcheck.sourceforge.net/
http://cppcheck.sourceforge.net/
설치 파일
CI 도구 연동 가능
Visual Studio 연동 가능
디렉토리 단위로 검사 가능
Visual Studio 2013과 연동한 모습
위험한 코드를 작성할 경우 아래과 같이 알려줍니다
위험한 코드를 제거했을 경우 사라집니다
다양한 경우를 체크해줍니다
CppCheckGoogle CppLint
잠재적코딩 스타일 체크
Google CppLint• 공짜 • 구글의 C++ 코딩 컨벤션인지 검사하는 도구 • 파이썬으로 제작됨 • 구글 컨벤션을 사용할 것이 아니라면 사용 X • http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml • http://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py
python으로 제작됨
간단한 코드가 있습니다
* 이 항목은 Mac OS 환경에서 작업했습니다
스크립트 실행
* 이 항목은 Mac OS 환경에서 작업했습니다
스크립트 실행
구글 C++ 컨벤션에 맞지 않는 항목을 전부 출력
* 이 항목은 Mac OS 환경에서 작업했습니다
컨벤션에 맞춰 수정된 코드
* 이 항목은 Mac OS 환경에서 작업했습니다
!!
어떤 상황이 오더라도 수정 가능한!!
유연성 있는 코드를 만듭시다
Flexible
양 한 마리를 그려줘!고갱님
음 금방 만들겠군
나
고객님 원하시는 양 나왔습니다~
void sheep() {!! printf(“양”); }
생각해보니 돼지도 필요해!
고갱님뭐 그 정도 쯤이야
고객님 원하시는 돼지 나왔습니다~
void pig() {!! printf(“돼지”); }
void sheep() {!! printf(“양”); }
생각해보니 소, 닭, 말, …, 개도 필요해!
고갱님;;;;;;;;;;
나
. . .
도대체 언제 만들어???접고 튈까..
이대로는 안된다!대책을 세우자
원하는 걸 전부 하드코딩 할 수는 없다요구사항은 계속 바뀌고 늘어나기 때문
Solution
유연한(Flexible)!코드를 제작하자
고객님 원하시는 건 이 상자에 있습니다. 알아서 상상해서 가져가세요~
void box(char* animal) {!! printf(“%s”, animal); }
내가 원하던게 이거야!
고갱님
나
결국 유연성있는 코드는 시간단축의 지름길!
But.. 유연성 있는 코드는 초기에 제작할 때 오래걸림
(여러 상황 분석 및 필요한 코드 패턴 조사 등… 시간이 필요한 요소가 존재하기 때문)
But.. 유연성 있는 코드는 초기에 제작할 때 오래걸림
Then자주 바뀔 가능성이 있는 코드만 유연하게 제작
(여러 상황 분석 및 필요한 코드 패턴 조사 등… 시간이 필요한 요소가 존재하기 때문)
But.. 유연성 있는 코드는 초기에 제작할 때 오래걸림
Then자주 바뀔 가능성이 있는 코드만 유연하게 제작
(여러 상황 분석 및 필요한 코드 패턴 조사 등… 시간이 필요한 요소가 존재하기 때문)
결국 자주 바뀐다는 것은 그만큼 시간을 소비하는 것이기 때문에!자주 바뀔 가능성 있는 부분은 유연하게 제작하는게 시간을 더 절약 할 수있다.
미리 간단한 설계를 하는 것이 좋습니다
손으로 그려도 좋고
UML 도구를 사용해도 좋습니다
설계하기
설계하기
코 딩
설계하기
코 딩
??????
제대로 가고있나..?
이럴땐 툴을 사용해 봅시다.
Visual Studio UML Viewer• 작성된 코드를 UML로 볼 수 있음 • 클래스가 많으면 로딩이 좀 걸린다
*쉽게* 클래스 다이어그램을 볼 수 있습니다.
설계하기
코 딩
Good code! Bad code..
확인하기
리팩토링
설계하기
코 딩
Good code! Bad code..
확인하기
리팩토링
프로젝트 진행하면서 생각날때마다 겸사겸사 확인해봅시다
!!
검증하는데 시간 많이 투자 하지 말고!!
테스트가 쉬운 코드를 만듭시다
Testable
TDD(Test-Driven Development)
TDD의 장점
TDD의 장점
하도 유명해서 검색만 해도 많이 나옴(해보세요)
단,TDD가 부정적인 효과를 불러오는 프로젝트는!
!
과감하게 생략하기!
EX) 게임 컨텐츠에서 매직 넘버 찾기?
코 딩
Good code! Bad code..
테스트
리팩토링
코 딩
Good code! Bad code..
테스트
리팩토링
이 과정이 오래걸리면 안됨!
어떻게 테스트를 하지? 어떻게 테스트를 단축하지?
이럴땐 툴을 사용해 봅시다.
Visual Studio CppUnit• 테스트 자동화 가능 • 테스트 프로젝트로 분리 가능 • Visual Studio Professional 이상 필요
Visual Studio에서 CppUnit을 사용 하는 방법은 다음 링크 참조
http://www.slideshare.net/sunhyouplee/c-tdd
!!
쓸데없는 지출은 패가망신하기 좋은 지름길 입니다!!
메모리, CPU 사용량을 절약하며 코딩합시다
Economic
Case 1
Memory Leak메모리를 사용한 후 반환하지 않는 것
프로세스 시작
메모리 누수 발생
성능 저하 / 버그
프로세스 시작
메모리 누수 발생
성능 저하 / 버그
특히나 C++은 메모리 사용에 민감!
http://msdn.microsoft.com/ko-kr/library/x98tx3cf.aspx
MSDN 짱짱맨
메모리 누수 확인 및 중단점 설정
C++의����������� ������������������ 메모리����������� ������������������ 관리����������� ������������������ 방법����������� ������������������ 1
혹은 스마트 포인터를 사용해도 됩니다
std::shared_ptr
C++의����������� ������������������ 메모리����������� ������������������ 관리����������� ������������������ 방법����������� ������������������ 2
레퍼런스 카운트 방식을 직접 코딩해도 상관 X
C++의����������� ������������������ 메모리����������� ������������������ 관리����������� ������������������ 방법����������� ������������������ 3
특수한 경우를 제외하면그냥 스마트 포인터 쓰는게 편하다
cocos2d-x와 objective-c가 그렇게 관리합니다
C++의����������� ������������������ 메모리����������� ������������������ 관리����������� ������������������ 방법����������� ������������������ 4
비싼 툴을 사용하자!
써본적이 없어서 사실 잘 몰라요..
Case 2
프로세스 시작
CPU 사용량 증가
성능 저하 / 유저 이탈
중간에 걸리는 성능 저하의 원인이 뭘까?
이럴땐 툴을 사용해 봅시다.
Visual Studio Profiler• 성능 측정 도구 • 메모리 사용량은 측정 불가능!• Visual Studio Professional 이상 필요 • 대체로 프로파일러 도구는 비싸다!• 드림스파크 덕분에 사용가능 ㅜㅜ
프로파일링 해볼 프로그램부끄러운 고등학교 습작…
메인 메뉴 시놉시스
상점
스테이지 1
스테이지 2게임오버 후 메인
이렇게 진행 해보겠습니다
게임오버 스샷을 못찍음;;
상단 메뉴 - 분석 - 성능 분석 시작(한국어 기준)
분석방법
분석방법상단 메뉴 - 분석 - 성능 분석 시작
(한국어 기준)
다양한 분석 가능
분석결과
분석결과
메인 메뉴 / 시놉시스
분석결과
메인 메뉴 / 시놉시스 스테이지 1
분석결과
메인 메뉴 / 시놉시스 스테이지 1 상점
분석결과
메인 메뉴 / 시놉시스 스테이지 1 상점스테이지 2
분석결과
메인 메뉴 / 시놉시스 스테이지 1 상점스테이지 2
게임오버 / 메인메뉴
분석결과
메인 메뉴 / 시놉시스 스테이지 1 상점스테이지 2
게임오버 / 메인메뉴
CPU 사용량이 많은 부분
분석결과
분석결과
해당 영역만 필터링 가능
분석결과
해당 영역만 필터링 가능
분석결과
해당 영역만 필터링 가능
매번 호출되는 함수를 제외하고파티클 관련된 부분이 상당히 많이 호출됨
분석결과
해당 영역만 필터링 가능
매번 호출되는 함수를 제외하고파티클 관련된 부분이 상당히 많이 호출됨
실제로 상점에서 산 무기가 파티클을 상당히 많이 사용함그리고 렌더타겟 텍스쳐를 잘못사용하여 메모리도 많이 사용함!
분석결과
해당 영역만 필터링 가능
매번 호출되는 함수를 제외하고파티클 관련된 부분이 상당히 많이 호출됨
실제로 상점에서 산 무기가 파티클을 상당히 많이 사용함
이 불꽃 부분입니다.!!
실제로 개선하는 것은 생략
그리고 렌더타겟 텍스쳐를 잘못사용하여 메모리도 많이 사용함!
!!
아무리 보기 좋고 잘만든 코드여도!!
만들고자 했던 코드가 아니면 무용지물!
Compliant
아니 만들고자 했던 코드말고 다른 코드 만드는 개발자도 있나?!ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
실제로 일어날 수 있는 가능한 얘기
여기 두 개발자가 있습니다
음 앞으로 만들어야하는 클래스에A기능을 사용한 B기능이 필요하겠군
B기능을 가지고있는 클래스를 작성해주세요
B기능을 어떻게 만들지? 음.. C기능을 사용해서 만들어야겠다.
B기능을 가지고있는 클래스를 작성해주세요
B기능을 가진 클래스를 만들었습니다
며칠 뒤
제가 원한건 이게 아닌데요??? 네???
제가 원한건 이게 아닌데요??? 네???
?
왜 이런걸까요?
커뮤니케이션의 부재!
왜 이런걸까요?
커뮤니케이션의 부재! 팀내 의견 불일치!
왜 이런걸까요?
커뮤니케이션의 부재! 팀내 의견 불일치! 의사전달 부족!
왜 이런걸까요?
커뮤니케이션의 부재! 팀내 의견 불일치! 의사전달 부족! 기획서 버전 불일치!
왜 이런걸까요?
커뮤니케이션의 부재! 팀내 의견 불일치! 의사전달 부족! 기획서 버전 불일치! 기획 의도 불이해
왜 이런걸까요?
잘못된 코드
커뮤니케이션의 부재! 팀내 의견 불일치! 의사전달 부족! 기획서 버전 불일치! 기획 의도 불이해
왜 이런걸까요?
어떻게 해결해야 할까요?
커뮤니케이션의 활성!
어떻게 해결해야 할까요?
어떻게 해결해야 할까요?
커뮤니케이션의 활성! 팀내 의견 통일!
어떻게 해결해야 할까요?
커뮤니케이션의 활성! 팀내 의견 통일! 의사전달 확실하게!
어떻게 해결해야 할까요?
커뮤니케이션의 활성! 팀내 의견 통일! 의사전달 확실하게! 기획서 버전 관리 / 일치!
커뮤니케이션의 활성! 팀내 의견 통일! 의사전달 확실하게! 기획서 버전 관리 / 일치! 기획 의도 이해
어떻게 해결해야 할까요?
커뮤니케이션의 활성! 팀내 의견 통일! 의사전달 확실하게! 기획서 버전 관리 / 일치! 기획 의도 이해
어떻게 해결해야 할까요?
정상적인 코드
커뮤니케이션의 활성! 팀내 의견 통일! 의사전달 확실하게! 기획서 버전 관리 / 일치! 기획 의도 이해
어떻게 해결해야 할까요?
정상적인 코드
결국 ‘팀 프로젝트’라는 것을 이해해야 합니다
커뮤니케이션의 활성! 팀내 의견 통일! 의사전달 확실하게! 기획서 버전 관리 / 일치! 기획 의도 이해
어떻게 해결해야 할까요?
정상적인 코드
결국 ‘팀 프로젝트’라는 것을 이해해야 합니다
근데 어떻게 해결해???
커뮤니케이션 오해
회 의 합 시 다 !
길어지는 회의…
피로 누적 & 집중력 저하
하고 싶어도 힘들다…
커뮤니케이션 오해
회 의 합 시 다 !
길어지는 회의…
피로 누적 & 집중력 저하
이제는 Web의 시대!
Web을 이용하여 커뮤니케이션을 원활하게 해봅시다
이럴땐 툴을 사용해 봅시다.
Github• git을 이용한 버전관리 시스템을 제공해주는 웹 서비스 • 소스를 오픈하면 무료로 사용 가능 • 공짜로 private을 이용하고 싶다면 bitbucket을 사용 • README.md를 통해 문서화도 가능
관리자
클라이언트 프로그래머서버 프로그래머
이슈 및 마일스톤(일정) 관리
이슈 체크 및!마일스톤에따라 개발 진행
서버 코드 혹은 문서를 보며!클라이언트 프로그래밍 진행
EX)
Google docs• 여러 사용자가 동시에 문서 편집이 가능 • 스프레드시트, 워드프로세스, 프레젠테이션 전부 제공 • 회의록을 동시에 보며 작성할 수 있다. • 코멘트 작성 가능
기획 문서 작성소요 시간, 난이도!코멘트 작성
개발자 기획자
EX)
PM검토 후!
실행 여부 결정
5가지 원칙을 지킨 결과…
덕분에 코드 품질이 좋아졌습니다!
Good code!
Legible TestableFlexible CompliantEconomic
Bad code..
But.. 아무리 좋은 코드, 개발자여도 해석에는 시간이 걸립니다
팀내 모든 개발자들과 공유하려면 시간이 오래 걸리겠죠?
Good code!
Legible TestableFlexible CompliantEconomic
Bad code..
Solution ?
Good code!
Good code!
문서화
잘 만들어진 코드에!!
‘문서’라는 조미료를 넣어봅시다
잘 만들어진 코드에!!
‘문서’라는 조미료를 넣어봅시다
설계 및 규칙 정하기
각 자 코 딩 하 기
Good code! Bad code..
툴을 이용하여 확인
리팩토링문서화
설계 및 규칙 정하기
각 자 코 딩 하 기
Good code! Bad code..
툴을 이용하여 확인
리팩토링문서화
별로 문제 없어 보인다
설계 및 규칙 정하기
각 자 코 딩 하 기
Good code! Bad code..
툴을 이용하여 확인
리팩토링문서화
별로 문제 없어 보인다
설계 및 규칙 정하기
각 자 코 딩 하 기
Good code! Bad code..
툴을 이용하여 확인
리팩토링문서화 할 시간이!어디있어;;
문제 발생
설계 및 규칙 정하기
각 자 코 딩 하 기
Good code! Bad code..
툴을 이용하여 확인
리팩토링문서화 할 시간이!어디있어;;
문제 발생
신입 개발자
양이 너무 많아;;!뭐가 뭔지 모르겠다..
Good code! Good code!Good code! Good code!Good code! Good code!Good code! Good code!Good code! Good code!Good code! Good code!Good code! Good code!Good code! Good code!
소 스 코 드 뭉 텅 이 들
신입 개발자
에라 모르겠다!래핑* 시켜버리자!
래핑*: 원 소스를 자신의 소스로 덮어버리는 것
Good code! Good code!Good code! Good code!Good code! Good code!Good code! Good code!Good code! Good code!Good code! Good code!Good code! Good code!Bad code.. Bad code..
Wrapping!
Good code! Good code!Good code! Good code!Good code! Good code!Good code! Good code!Good code! Good code!Good code! Good code!Good code! Good code!Good code! Good code!
소 스 코 드 뭉 텅 이 들
망함
역시 모든 것은 시간과 비용이 문제 ㅠㅠ
문서화 시간을 어떻게 절약할까?
이번에도 등장하는!- 이럴땐 툴을 사용해 봅시다. -
Doxygen• 주석을 통해 문서화를 만들어줌 • 특정한 문법을 지닌 주석을 달아야함 • Visual Studio에 doxygen 방식의 주석을 하이라이팅 해주는 플러그인 있음 • http://www.stack.nl/~dimitri/doxygen/index.html
http://www.stack.nl/~dimitri/doxygen/index.html
GUI 툴을 이용해 만들 수 있다
툴을 이용하여 출력한 결과예제는 일리히트 엔진을 사용
Visual Studio에서 doxygen 주석 문법을 하이라이팅 해주는 플러그인 설치 가능
다음과 같이 하이라이팅 해준다문법은 공식 홈페이지에 자세히 나와있다
Graphviz• doxygen과 함께 사용할 수 있다 • 자동으로 다이어그램을 이미지로 그려준다 • doxygen 문서에 삽입된다 • http://www.graphviz.org/
http://www.graphviz.org/
다음 설정을 선택하여 사용가능하다그 외 다른 설정을 해줘야 할 수도 있음!
다음 화면처럼 클래스 다이어그램을 볼 수 있다
요약당신이 코드 품질을 높일 수 있도록 도와주는 툴이 많다!
툴의 도움을 적극적으로 이용하자!
소스 품질을 좋게 유지하기 위해서는!많은 커뮤니케이션이 필요하고 의사전달이 제대로 이뤄져야 한다
요약2
이 PPT에 소개된 툴 외에도 정말 좋은 툴이 많습니다!다른 툴도 알아보세요 :)
* 참고 *
써본 적은 없지만 유료 툴은 엄청 좋다네요
Reference• http://stackoverflow.com/questions/405243/how-do-we-define-code-quality • http://msdn.microsoft.com/ • http://cppcheck.sourceforge.net/ • http://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py • http://www.graphviz.org/ • http://www.stack.nl/~dimitri/doxygen/manual/docblocks.html
감사합니다
C++관리����������� ������������������
����������� ������������������ 비법코드����������� ������������������ 품질