SlideShare a Scribd company logo
Submit Search
Upload
Login
Signup
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
Report
Esun Kim
Follow
Software Engineer at Google
Apr. 26, 2012
•
0 likes
•
20,847 views
1
of
98
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
Apr. 26, 2012
•
0 likes
•
20,847 views
Download Now
Download to read offline
Report
Technology
Esun Kim
Follow
Software Engineer at Google
Recommended
Next-generation MMORPG service architecture
Jongwon Kim
7.1K views
•
44 slides
온라인 게임 처음부터 끝까지 동적언어로 만들기
Seungjae Lee
7.6K views
•
62 slides
코드 생성을 사용해 개발 속도 높이기 NDC2011
Esun Kim
6.3K views
•
83 slides
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
Esun Kim
21.1K views
•
137 slides
장재화, Replay system, NDC2011
재화 장
3K views
•
75 slides
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Esun Kim
8.6K views
•
78 slides
More Related Content
What's hot
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
devCAT Studio, NEXON
16K views
•
53 slides
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
min woog kim
3.2K views
•
78 slides
[160404] 유니티 apk 용량 줄이기
MinGeun Park
30.3K views
•
18 slides
MMOG Server-Side 충돌 및 이동처리 설계와 구현
YEONG-CHEON YOU
1.4K views
•
74 slides
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
Heungsub Lee
50K views
•
152 slides
임태현, MMO 서버 개발 포스트 모템, NDC2012
devCAT Studio, NEXON
6K views
•
141 slides
What's hot
(20)
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
devCAT Studio, NEXON
•
16K views
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
min woog kim
•
3.2K views
[160404] 유니티 apk 용량 줄이기
MinGeun Park
•
30.3K views
MMOG Server-Side 충돌 및 이동처리 설계와 구현
YEONG-CHEON YOU
•
1.4K views
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
Heungsub Lee
•
50K views
임태현, MMO 서버 개발 포스트 모템, NDC2012
devCAT Studio, NEXON
•
6K views
Multiplayer Game Sync Techniques through CAP theorem
Seungmo Koo
•
11.7K views
Windows Registered I/O (RIO) vs IOCP
Seungmo Koo
•
28.6K views
게임 프로그래밍 기초 공부법
Chris Ohk
•
60.2K views
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
Heungsub Lee
•
13.4K views
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
MinGeun Park
•
16.6K views
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
devCAT Studio, NEXON
•
5.9K views
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
Kiyoung Moon
•
13.3K views
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
Amazon Web Services Korea
•
3.9K views
[NDC16] Effective Git
Chanwoong Kim
•
28.8K views
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)
Suhyun Park
•
29.8K views
NDC 11 자이언트 서버의 비밀
승명 양
•
4.2K views
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
Chanwoong Kim
•
2.4K views
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
MinGeun Park
•
14.1K views
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
ChangKyu Song
•
12.2K views
Viewers also liked
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
Lee Dustin
7.2K views
•
55 slides
Deep learning as_WaveExtractor
동윤 이
2.9K views
•
23 slides
영상 데이터의 처리와 정보의 추출
동윤 이
15.2K views
•
48 slides
Custom fabric shader for unreal engine 4
동석 김
22.3K views
•
25 slides
게임회사 취업을 위한 현실적인 전략 3가지
Harns (Nak-Hyoung) Kim
16.1K views
•
29 slides
Profiling - 실시간 대화식 프로파일러
Heungsub Lee
9.7K views
•
137 slides
Viewers also liked
(20)
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
Lee Dustin
•
7.2K views
Deep learning as_WaveExtractor
동윤 이
•
2.9K views
영상 데이터의 처리와 정보의 추출
동윤 이
•
15.2K views
Custom fabric shader for unreal engine 4
동석 김
•
22.3K views
게임회사 취업을 위한 현실적인 전략 3가지
Harns (Nak-Hyoung) Kim
•
16.1K views
Profiling - 실시간 대화식 프로파일러
Heungsub Lee
•
9.7K views
NDC16 스매싱더배틀 1년간의 개발일지
Daehoon Han
•
10.9K views
Luigi presentation NYC Data Science
Erik Bernhardsson
•
60.2K views
Developing Success in Mobile with Unreal Engine 4 | David Stelzer
Jessica Tams
•
1.2K views
김병관 성공캠프 SNS팀 자원봉사 후기
Harns (Nak-Hyoung) Kim
•
5.5K views
Docker
Huey Park
•
1.1K views
8년동안 테라에서 배운 8가지 교훈
Harns (Nak-Hyoung) Kim
•
24.2K views
Online game server on Akka.NET (NDC2016)
Esun Kim
•
7.5K views
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
Sumin Byeon
•
8.9K views
Re:Zero부터 시작하지 않는 오픈소스 개발
Chris Ohk
•
3.4K views
NDC17 게임 디자이너 커리어 포스트모템: 8년, 3개의 회사, 4개의 게임
Imseong Kang
•
12.1K views
Behavior Tree in Unreal engine 4
Huey Park
•
7.3K views
PyCon 2017 프로그래머가 이사하는 법 2 [천원경매]
Sumin Byeon
•
2.6K views
Approximate nearest neighbor methods and vector models – NYC ML meetup
Erik Bernhardsson
•
22K views
버텍스 셰이더로 하는 머리카락 애니메이션
동석 김
•
3.7K views
Similar to 자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
Android Native Module 안정적으로 개발하기
hanbeom Park
88 views
•
39 slides
Windows Debugging Technique #3
Wooseok Seo
724 views
•
59 slides
코드리뷰 짝 매칭 프로그램 구현기
Yong Hoon Kim
3.4K views
•
20 slides
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
beom kyun choi
10.3K views
•
33 slides
Frontend testing
Kihoon Kim
1K views
•
67 slides
당신의 디버깅에 니코니코니
Lusain Kim
7.9K views
•
45 slides
Similar to 자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
(20)
Android Native Module 안정적으로 개발하기
hanbeom Park
•
88 views
Windows Debugging Technique #3
Wooseok Seo
•
724 views
코드리뷰 짝 매칭 프로그램 구현기
Yong Hoon Kim
•
3.4K views
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
beom kyun choi
•
10.3K views
Frontend testing
Kihoon Kim
•
1K views
당신의 디버깅에 니코니코니
Lusain Kim
•
7.9K views
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
ChangKyu Song
•
3.2K views
Working Effectively With Legacy Code - xp2005
Ryan Park
•
1.1K views
[232] 성능어디까지쥐어짜봤니 송태웅
NAVER D2
•
18.1K views
레가시 프로젝트의 빌드 자동화
Jaehoon Choi
•
3.6K views
테스트수행사례 W통합보안솔루션
SangIn Choung
•
1.3K views
NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은
Sung Eun Kim
•
347 views
컴포넌트 관점에서 개발하기
우영 주
•
5.4K views
처음 시작하는 라라벨
KwangSeob Jeong
•
5.4K views
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XpressEngine
•
2.5K views
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
Jinuk Kim
•
5.4K views
20170813 django api server unit test and remote debugging
Jongwon Han
•
1.3K views
Windows Debugging Technique #2
Wooseok Seo
•
430 views
Node.js 기본
Han Jung Hyun
•
54.3K views
Project anarchy로 3d 게임 만들기 part_2_vforge피하기
Dong Chan Shin
•
515 views
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
1.
자동화된 소스 분석,
처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 김이선 veblush@[nexon|gmail]
2.
버블파이터 BNB
카트라이더 프로토타입 에버플래닛 던전엔파이터 GTR 프로그래머 리드 프로그래머 리드 프로그래머 리드 프로그래머 테크니컬 디렉터 프로그래머 게임 프로그래밍 11년차
3.
프로젝트 소스 코드의 유지보수성
(Maintainability) 관리가 중요!
4.
[던전엔 파이터] 에서
했던 코드 관리 중 하나인 불필요한 #if - #endif 제거 작업
5.
도입
결과 결론 분석 처리 검증
6.
오늘 알아볼 코드 [던전엔
파이터]
7.
“퀘스트 시스템”
추가 작업
8.
Flags.h 1단계
// 김철수: 퀘스트 시스템 구현 플래그 정의 //#define _QUEST_SYSTEM
9.
*
#ifdef _QUEST_SYSTEM ui.questWnd.setButton(…); 2단계 ui.questWnd.setEvent(…); 기능 구현 #else ui.questWnd.setDisable(); #endif
10.
Flags.h
3단계 // 김철수: 퀘스트 시스템 구현 기능 플래그 켬 #define _QUEST_SYSTEM
11.
작업 중인 코드가
다른 작업자, 라이브 코드에 영향을 주지 않음 (장기간 작업, 빠른 롤백, 이벤트)
12.
국가별 소스 코드
공유에 도움 (국가별 플래그, …)
13.
간단한 작업 방식 (교육
비용이 낮음)
14.
플래그 켬/끔이 Rebuild
를 초래 (Flags.h 파일을 모든 파일이 #include 하므로)
15.
코드가 점차 읽기
어렵고 수정하기 어려워짐 (#ifdef - #endif 블록이 코드에 가득 차기 시작함)
16.
코드가 점차 읽기
어렵고 수정하기 어려워짐 (#ifdef - #endif 블록이 코드에 가득 차기 시작함)
17.
죽은 코드가 생겨남 (꺼진
플래그나 #else 에 묶엔 코드들)
18.
그럼 플래그가 얼마나?
20.
5400 개 +1500 /1yr
2015 년 10000 개
21.
플래그 개수가 늘어남에
따라 발생하는 추가적인 문제!
22.
#ifdef _EVENT_2006
ui.notice.setText(“월드컵 이벤트!”); 문제 1 ui.notice.setVisible(1); 죽은 코드 ui.notice.setEventHandler(…); #endif
23.
#ifdef _NEW_UI_COMPONENT
ui.notice.setText(“…”); ui.notice.setVisible(1); 문제 2 #else 중복 코드 set(UI_NOTICE, TEXT, “…”); set(UI_NOTICE, VISIBLE, 1); #endif
24.
플래그 작업 방식은
유지하되 불필요하게 늘어난 플래그 개수를 줄여보자
25.
불필요한 플래그 제거!
26.
#ifdef _QUEST_SYSTEM
ui.quest.setVisible(1); 플래그 켜서 제거 ui.quest.setEventHandler(…); #endif
27.
ui.quest.setVisible(1); 플래그 켜서 제거
ui.quest.setEventHandler(…);
28.
#ifdef _EVENT_2006
ui.notice.setText(“월드컵 이벤트!”); 플래그 꺼서 제거 ui.notice.setVisible(1); ui.notice.setEventHandler(…); #endif
29.
플래그 꺼서 제거
30.
#define _NEW_QUEST
#ifdef _NEW_QUEST # define _NEW_QUEST_FIX #endif 플래그 병합 #ifdef _NEW_QUEST 제거 ui.event.setText(…); # ifdef _NEW_QUEST_FIX ui.event.setPos(…); # endif #endif
31.
#define _NEW_QUEST 플래그 병합
#ifdef _NEW_QUEST 제거 ui.event.setText(…); ui.event.setPos(…); #endif
32.
개운하다!
33.
제거할
소스에서 테스트 플래그 선택 플래그 제거
34.
수천개를 수작업으로?
Image: http://www.flickr.com/photos/15271532@N00/1172675049
35.
리팩토링 딜레마!
실수하면? 누가하지?
36.
자동화
Image: http://www.enggtechsolutions.com/?page_id=5
37.
제거할
소스에서 테스트 플래그 선택 플래그 제거 선택 제거 검증 자동화 자동화 자동화
38.
도입
결과 결론 분석 처리 검증
39.
플래그에 대한 정보
얻기 (삭제할 플래그를 추리기 위해)
40.
소스 파일
41.
#define F |
#undef F #ifdef F | #ifndef F | #if defined(F)
42.
국가별 Flags.h 파일에
정의된 플래그 추리기
43.
#define 뒤에 있는
주석도 가져오기
44.
Subversion Log
45.
모든 커밋의
Rev#, 날짜, 작성자, 로그 변경한 파일에 포함된 플래그 목록
46.
사용:
날짜: 주석: 한국, 중국 2008-06-21 김철수, 퀘스트! _QUEST_SYSTEM 플래그 정보 SVN: 파일: #29110, ironwater Interface/QuestWindow.h Interface/QuestWindow.cpp “[추가] 퀘스트 시스템 System/Quest.h 1차 작업” System/Quest.cpp
47.
판단을 내릴 정보
가공! (단순한 정보 나열을 구체화)
48.
플래그 정보
쿼리 결과 DB 테이블 쿼리 수행
49.
DB 를 통해
유연한 분석 가능
50.
국가별 / 연도별
플래그 등장 표
51.
DB: 큰 그림
분석 시간별 증감 추이 국가별 사용 현황 작업자별 플래그 추가 파일별 플래그 추이 플래그 영향력
52.
DB: 오류 분석
정의만 되고 사용되지 않음 (버려짐?) 정의는 없고 사용만 있음 (오타?) 정의가 여러 곳에 있음 (응?) 정의가 여러 곳에 있으면서 값이 다름 (으악!)
53.
모두 켜거나 끈
플래그 목록 추리기
54.
모든
작성자 및 국가에서 상급자에게 피드백을 켜고 끈 삭제 리뷰 받아 진행 플래그 수집 요청
55.
도입
결과 결론 분석 처리 검증
56.
제거할 플래그를 소스에서
제거
57.
#define _QUEST_SYSTEM //
퀘스트 플래그 켜서 #ifdef _QUEST_SYSTEM 제거 ui.quest.appendMsg(“…”); questDlg.show(); #endif
58.
플래그 켜서
제거 ui.quest.appendMsg(“…”); questDlg.show();
59.
#ifdef _EVENT_2008 //
2008 설 이벤트 ui.event.setText(…); ui.event.show(); 플래그 꺼서 #else 제거 ui.event.setVisible(0); #endif
60.
플래그 꺼서
제거 ui.event.setVisible(0);
61.
#define _NEW_QUEST
#ifdef _NEW_QUEST # define _NEW_QUEST_FIX #endif 플래그 병합 #ifdef _NEW_QUEST 제거 ui.event.setText(…); # ifdef _NEW_QUEST_FIX ui.event.setPos(…); # endif #endif
62.
#define _NEW_QUEST 플래그 병합
#ifdef _NEW_QUEST 제거 ui.event.setText(…); ui.event.setPos(…); #endif
63.
http://dotat.at/prog/unifdef
64.
Unifdef 가 기본적인
기능은 잘 해줌
65.
다만 부분 평가는
해주지 않음 #if defined(A) && defined(B) A=켬|끔 B=그냥둠 ↓ #if 1|0 && defined(B)
66.
병합 제거는 따로
구현 #ifdef A #ifdef A # ifdef A_fix … … # endif #endif #endif
67.
작업 흐름
부분 평가 원시소스 unifdef 결과소스 병합 제거 제거 플래그 리스트
68.
도입
결과 결론 분석 처리 검증
69.
원시소스
처리 결과소스 원시EXE = 결과EXE
70.
동일한 소스를 두
번 빌드 후 EXE 빌드시간, 디버그 정보 등이 EXE 에 포함
71.
동일한 소스를 두
번 빌드 후 OBJ 디버그 정보가 OBJ 에 포함
72.
#
name #1 .drectve #2 .debug$S #3 .text 비교할 때 OBJ #4 .debug$S debug 섹션은 #5 .rdata 제외! #6 .text #7 .debug$S #8 .debug$T
73.
원시소스
처리 결과소스 원시OBJ = 결과OBJ
74.
원시OBJ
≠ 결과OBJ DUMPBIN
75.
같음 원시소스
처리 비교 OK 다름
76.
플래그 켬/끔
오류 다른 함수 원인 파악 툴 버그 찾기 소스 문제
77.
오류의 예 #include “show.h” //#include
“Flags.h” void show() { #ifdef _QUEST_SYSTEM ui.quest.print(…); ui.questDlg.show(); #endif }
78.
__LINE__
ASSERT 매크로 등에 있음! 검증 단계의 unifdef 는 행을 유지하도록. __TIME__ 작업 전에만 지웠다가 다시 살림.
79.
도입
결과 결론 분석 처리 검증
80.
제거 플래그
작업자의 처리 / 검증 / 커밋 후보 선택 리뷰 자동화 자동화
81.
작업자 리뷰에 시간이
들기 때문에 리뷰 플래그 개수를 한번에 300~500 개로 유지
82.
6 번의 플래그
제거 작업 총 2,107 개의 플래그 제거
84.
2,309 파일에서 191,979 라인
제거
85.
라인 10%
코드 제거 90%
86.
작성한 툴 분석
Track 소스 & SVN 에서 정보 수집 Uniform Unifdef + 추가 소스 처리 처리 CompareBin OBJ 파일 동일 검사 검증 BatchRun 플래그 제거 및 검증을 일괄 실행
87.
작성한 툴 분석
Track 소스 & SVN 에서 정보 수집 Uniform 총 Unifdef + 추가 소스 처리 LOC: 처리 CompareBin 1500 동일 검사 OBJ 파일 검증 BatchRun 플래그 제거 및 검증을 일괄 실행
90.
도입
결과 결론 분석 처리 검증
91.
불필요한 #if -
#endif 제거는 소스 코드를 깔끔하게 유지하는데 도움!
92.
소스의 유지보수성을 확보하는
작업을 자동화 시키고 신뢰성 있게 만드는 것이 중요!
93.
자동화된 솔루션은 반복해서
사용할 수 있어 계속해서 도움을 받을 수 있음!
94.
분석은 처리 뿐
아니라 대상을 바라보는 다른 관점을 제시하는 데에도 도움을 줌!
95.
분석, 수행, 검증의
틀을 코드 / 데이터를 개선하는데 사용해보자!
96.
자동화된 Rename 리팩토링
? 문제되는 소스에서 빌드 이름 추리기 자동 변경 테스트
97.
여러분들도!
98.
감사합니다!