Enviar pesquisa
Carregar
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
•
62 gostaram
•
20,880 visualizações
Esun Kim
Seguir
Tecnologia
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 98
Baixar agora
Baixar para ler offline
Recomendados
코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011
Esun Kim
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
Esun Kim
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
ChangKyu Song
NDC 2015 삼시세끼 빌드만들기
NDC 2015 삼시세끼 빌드만들기
Hyunsuk Ahn
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
Seungmo Koo
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
devCAT Studio, NEXON
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
devCAT Studio, NEXON
게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가
Seungmo Koo
Recomendados
코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011
Esun Kim
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
Esun Kim
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
ChangKyu Song
NDC 2015 삼시세끼 빌드만들기
NDC 2015 삼시세끼 빌드만들기
Hyunsuk Ahn
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
Seungmo Koo
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
devCAT Studio, NEXON
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
devCAT Studio, NEXON
게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가
Seungmo Koo
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
devCAT Studio, NEXON
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
devCAT Studio, NEXON
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
영욱 오
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
devCAT Studio, NEXON
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기
Yongha Kim
Windows system - memory개념잡기
Windows system - memory개념잡기
ChangKyu Song
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
noerror
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
Jaeseung Ha
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
Heungsub Lee
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
Jaeseung Ha
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
Sang Heon Lee
GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자
TonyCms
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
Esun Kim
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
devCAT Studio, NEXON
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
iFunFactory Inc.
Python과 Git으로 만드는 모바일 게임 패치 시스템
Python과 Git으로 만드는 모바일 게임 패치 시스템
Youngtaek Oh
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
Chris Ohk
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
YEONG-CHEON YOU
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
devCAT Studio, NEXON
[NDC16] Effective Git
[NDC16] Effective Git
Chanwoong Kim
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
Lee Dustin
Deep learning as_WaveExtractor
Deep learning as_WaveExtractor
동윤 이
Mais conteúdo relacionado
Mais procurados
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
devCAT Studio, NEXON
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
devCAT Studio, NEXON
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
영욱 오
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
devCAT Studio, NEXON
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기
Yongha Kim
Windows system - memory개념잡기
Windows system - memory개념잡기
ChangKyu Song
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
noerror
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
Jaeseung Ha
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
Heungsub Lee
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
Jaeseung Ha
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
Sang Heon Lee
GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자
TonyCms
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
Esun Kim
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
devCAT Studio, NEXON
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
iFunFactory Inc.
Python과 Git으로 만드는 모바일 게임 패치 시스템
Python과 Git으로 만드는 모바일 게임 패치 시스템
Youngtaek Oh
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
Chris Ohk
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
YEONG-CHEON YOU
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
devCAT Studio, NEXON
[NDC16] Effective Git
[NDC16] Effective Git
Chanwoong Kim
Mais procurados
(20)
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기
Windows system - memory개념잡기
Windows system - memory개념잡기
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
Python과 Git으로 만드는 모바일 게임 패치 시스템
Python과 Git으로 만드는 모바일 게임 패치 시스템
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
[NDC16] Effective Git
[NDC16] Effective Git
Destaque
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
Lee Dustin
Deep learning as_WaveExtractor
Deep learning as_WaveExtractor
동윤 이
영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출
동윤 이
Custom fabric shader for unreal engine 4
Custom fabric shader for unreal engine 4
동석 김
게임회사 취업을 위한 현실적인 전략 3가지
게임회사 취업을 위한 현실적인 전략 3가지
Harns (Nak-Hyoung) Kim
Profiling - 실시간 대화식 프로파일러
Profiling - 실시간 대화식 프로파일러
Heungsub Lee
NDC16 스매싱더배틀 1년간의 개발일지
NDC16 스매싱더배틀 1년간의 개발일지
Daehoon Han
Luigi presentation NYC Data Science
Luigi presentation NYC Data Science
Erik Bernhardsson
Developing Success in Mobile with Unreal Engine 4 | David Stelzer
Developing Success in Mobile with Unreal Engine 4 | David Stelzer
Jessica Tams
김병관 성공캠프 SNS팀 자원봉사 후기
김병관 성공캠프 SNS팀 자원봉사 후기
Harns (Nak-Hyoung) Kim
Docker
Docker
Huey Park
8년동안 테라에서 배운 8가지 교훈
8년동안 테라에서 배운 8가지 교훈
Harns (Nak-Hyoung) Kim
Online game server on Akka.NET (NDC2016)
Online game server on Akka.NET (NDC2016)
Esun Kim
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
Sumin Byeon
Re:Zero부터 시작하지 않는 오픈소스 개발
Re:Zero부터 시작하지 않는 오픈소스 개발
Chris Ohk
NDC17 게임 디자이너 커리어 포스트모템: 8년, 3개의 회사, 4개의 게임
NDC17 게임 디자이너 커리어 포스트모템: 8년, 3개의 회사, 4개의 게임
Imseong Kang
Behavior Tree in Unreal engine 4
Behavior Tree in Unreal engine 4
Huey Park
PyCon 2017 프로그래머가 이사하는 법 2 [천원경매]
PyCon 2017 프로그래머가 이사하는 법 2 [천원경매]
Sumin Byeon
Approximate nearest neighbor methods and vector models – NYC ML meetup
Approximate nearest neighbor methods and vector models – NYC ML meetup
Erik Bernhardsson
버텍스 셰이더로 하는 머리카락 애니메이션
버텍스 셰이더로 하는 머리카락 애니메이션
동석 김
Destaque
(20)
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
Deep learning as_WaveExtractor
Deep learning as_WaveExtractor
영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출
Custom fabric shader for unreal engine 4
Custom fabric shader for unreal engine 4
게임회사 취업을 위한 현실적인 전략 3가지
게임회사 취업을 위한 현실적인 전략 3가지
Profiling - 실시간 대화식 프로파일러
Profiling - 실시간 대화식 프로파일러
NDC16 스매싱더배틀 1년간의 개발일지
NDC16 스매싱더배틀 1년간의 개발일지
Luigi presentation NYC Data Science
Luigi presentation NYC Data Science
Developing Success in Mobile with Unreal Engine 4 | David Stelzer
Developing Success in Mobile with Unreal Engine 4 | David Stelzer
김병관 성공캠프 SNS팀 자원봉사 후기
김병관 성공캠프 SNS팀 자원봉사 후기
Docker
Docker
8년동안 테라에서 배운 8가지 교훈
8년동안 테라에서 배운 8가지 교훈
Online game server on Akka.NET (NDC2016)
Online game server on Akka.NET (NDC2016)
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
Re:Zero부터 시작하지 않는 오픈소스 개발
Re:Zero부터 시작하지 않는 오픈소스 개발
NDC17 게임 디자이너 커리어 포스트모템: 8년, 3개의 회사, 4개의 게임
NDC17 게임 디자이너 커리어 포스트모템: 8년, 3개의 회사, 4개의 게임
Behavior Tree in Unreal engine 4
Behavior Tree in Unreal engine 4
PyCon 2017 프로그래머가 이사하는 법 2 [천원경매]
PyCon 2017 프로그래머가 이사하는 법 2 [천원경매]
Approximate nearest neighbor methods and vector models – NYC ML meetup
Approximate nearest neighbor methods and vector models – NYC ML meetup
버텍스 셰이더로 하는 머리카락 애니메이션
버텍스 셰이더로 하는 머리카락 애니메이션
Semelhante a 자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기
hanbeom Park
Windows Debugging Technique #3
Windows Debugging Technique #3
Wooseok Seo
코드리뷰 짝 매칭 프로그램 구현기
코드리뷰 짝 매칭 프로그램 구현기
Yong Hoon Kim
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
beom kyun choi
당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니
Lusain Kim
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
ChangKyu Song
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
Ryan Park
[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅
NAVER D2
레가시 프로젝트의 빌드 자동화
레가시 프로젝트의 빌드 자동화
Jaehoon Choi
테스트수행사례 W통합보안솔루션
테스트수행사례 W통합보안솔루션
SangIn Choung
NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은
NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은
Sung Eun Kim
2023 GDG Sondo DevFest - Flutter/ Flavor, PlatformChannel, Environment variab...
2023 GDG Sondo DevFest - Flutter/ Flavor, PlatformChannel, Environment variab...
MaRoKim4
컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기
우영 주
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XpressEngine
처음 시작하는 라라벨
처음 시작하는 라라벨
KwangSeob Jeong
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
Jinuk Kim
20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging
Jongwon Han
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
min woog kim
Windows Debugging Technique #2
Windows Debugging Technique #2
Wooseok Seo
Node.js 기본
Node.js 기본
Han Jung Hyun
Semelhante a 자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
(20)
Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기
Windows Debugging Technique #3
Windows Debugging Technique #3
코드리뷰 짝 매칭 프로그램 구현기
코드리뷰 짝 매칭 프로그램 구현기
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅
레가시 프로젝트의 빌드 자동화
레가시 프로젝트의 빌드 자동화
테스트수행사례 W통합보안솔루션
테스트수행사례 W통합보안솔루션
NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은
NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은
2023 GDG Sondo DevFest - Flutter/ Flavor, PlatformChannel, Environment variab...
2023 GDG Sondo DevFest - Flutter/ Flavor, PlatformChannel, Environment variab...
컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
처음 시작하는 라라벨
처음 시작하는 라라벨
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
Windows Debugging Technique #2
Windows Debugging Technique #2
Node.js 기본
Node.js 기본
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #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.
그럼 플래그가 얼마나?
19.
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 개의 플래그 제거
83.
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 플래그 제거 및 검증을 일괄 실행
88.
89.
90.
도입
결과 결론 분석 처리 검증
91.
불필요한 #if -
#endif 제거는 소스 코드를 깔끔하게 유지하는데 도움!
92.
소스의 유지보수성을 확보하는
작업을 자동화 시키고 신뢰성 있게 만드는 것이 중요!
93.
자동화된 솔루션은 반복해서
사용할 수 있어 계속해서 도움을 받을 수 있음!
94.
분석은 처리 뿐
아니라 대상을 바라보는 다른 관점을 제시하는 데에도 도움을 줌!
95.
분석, 수행, 검증의
틀을 코드 / 데이터를 개선하는데 사용해보자!
96.
자동화된 Rename 리팩토링
? 문제되는 소스에서 빌드 이름 추리기 자동 변경 테스트
97.
여러분들도!
98.
감사합니다!
Baixar agora