C++ 코드 품질 관리 비법

선협 이
선협 이Developer um 트러스트어스
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!
뭔소리야?
StepByStep
천리길도한걸음부터
- 모든 예제는 다음 환경에서 제작됬습니다 -!
!
Visual Studio 2013!
Windows 8
!
!
보기 좋은 떡이 먹기도 좋다고!
!
보기 좋은 코드를 만듭시다
Legible
C++ 코드 품질 관리 비법
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…
망함
이럴땐 툴을 사용해 봅시다.
CppCheck
Google CppLint
잠재적 오류 검출
코딩 스타일 체크
CppCheck
Google CppLint
잠재적 오류 검출
코딩
CppCheck
• 공짜
• 위험한 코드를 지적해주는 도구
• 여러 IDE 지원!
• Hudson, Jenkins와 같은 CI 도구에도 사용가능
• IDE와 별도로 진단 도구 지원
• http://cppcheck.sourceforge.net/
http://cppcheck.sourceforge.net/
설치 파일
CI 도구 연동 가능
Visual Studio 연동 가능
디렉토리 단위로 검사 가능
Visual Studio 2013과 연동한 모습
위험한 코드를 작성할 경우 아래과 같이 알려줍니다
위험한 코드를 제거했을 경우 사라집니다
다양한 경우를 체크해줍니다
http://cppcheck.sourceforge.net/manual.pdf
자세한 것은
CppCheck
Google 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로 볼 수 있음
• 클래스가 많으면 로딩이 좀 걸린다
C++ 코드 품질 관리 비법
C++ 코드 품질 관리 비법
C++ 코드 품질 관리 비법
*쉽게*
클래스 다이어그램을 볼 수 있습니다.
설계하기
코 딩
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!
소 스 코 드 뭉 텅 이 들
1 von 187

Más contenido relacionado

Was ist angesagt?(20)

An Introduction to Test Driven Development An Introduction to Test Driven Development
An Introduction to Test Driven Development
CodeOps Technologies LLP13.9K views
どうして昔の人は八進数でしゃべるのか?どうして昔の人は八進数でしゃべるのか?
どうして昔の人は八進数でしゃべるのか?
たけおか しょうぞう2.2K views
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
Engenharia de Software Ágil544 views
웹을 지탱하는 기술웹을 지탱하는 기술
웹을 지탱하는 기술
JungHyuk Kwon24.9K views
LaravelとテストについてLaravelとテストについて
Laravelとテストについて
Takeo Noda6.7K views

Destacado(20)

Similar a C++ 코드 품질 관리 비법(20)

소스리딩워크샵 - NHN NEXT소스리딩워크샵 - NHN NEXT
소스리딩워크샵 - NHN NEXT
Minsuk Lee1.6K views
초보개발자의 TDD 체험기초보개발자의 TDD 체험기
초보개발자의 TDD 체험기
Sehun Kim3.7K views
SW Maestro 1-1 Project KeynoteSW Maestro 1-1 Project Keynote
SW Maestro 1-1 Project Keynote
진수 한717 views
ecdevday7ecdevday7
ecdevday7
Kenu, GwangNam Heo1.9K views
3주차 language3주차 language
3주차 language
준혁 이470 views
Code Review - DevOn2013Code Review - DevOn2013
Code Review - DevOn2013
호정 이7.8K views

C++ 코드 품질 관리 비법