60
API Design for C++ Chapter 8. 버전 관리 아꿈사 김희섭 2014.03.08

API Design for C++, Chapter 8. Versioning

Embed Size (px)

DESCRIPTION

C++ API 디자인 한국어판 Chapter 8. 버전 관리. 추가 : git에 관한 설명 https://www.atlassian.com/git/ 내용이 괜찮은것 같아요.

Citation preview

Page 1: API Design for C++, Chapter 8. Versioning

API Design for C++Chapter 8. 버전관리

아꿈사김희섭

2014.03.08

Page 2: API Design for C++, Chapter 8. Versioning

Chapter 8. 버전관리

8.1 버전번호

8.2 소프트웨어브랜치전략

8.3 API의수명주기

8.4 호환성수준

8.5 하위호환성유지

8.6 API 리뷰

Page 3: API Design for C++, Chapter 8. Versioning

Chapter 8. 버전관리

하위호환성은필수,

코드의안정성과견고함은덤

(이아니라성패를좌우할수도있다)

Page 4: API Design for C++, Chapter 8. Versioning

Chapter 8. 버전관리Case Study : the Bad

https://github.com/cocos2d/cocos2d-x/blob/develop/CHANGELOG

(기억과달리그렇게나쁘진않네요⋯, 죄송, ??? 하지만기억엔…)

http://www.cocos2d-x.org/forums/6/topics/33692?r=33864

(너네너무한다,증말~)

Page 5: API Design for C++, Chapter 8. Versioning

Chapter 8. 버전관리Case Study : the Bad

Refactor #1565: remove VS2008 support

Page 6: API Design for C++, Chapter 8. Versioning

Chapter 8. 버전관리Case Study : the Bad

Refactor #1565: remove VS2008 support

(발표주제와크게상관은없지만,

당시나를가장화나게했던것)

Page 7: API Design for C++, Chapter 8. Versioning

버전번호, 의미 / 규칙 / 버전API

유니크한식별자가필요하다!

일반적인의미Major - remarkable/

incompatible

Minor - functionality /backward compatible

Patch - bug / security fix

Main – Feature – Build/Revision

일부만아는버전규칙TeX

Visual Studio / FIFA / Ubuntu

Linux Kernel / Second Life Server

http://semver.org

Page 8: API Design for C++, Chapter 8. Versioning

버전번호, 의미 / 규칙 / 버전API

34 (2014.03.08)

It’s meaningless!

Page 9: API Design for C++, Chapter 8. Versioning

Version Aversion

잠시만요!

잠깐쉬었다가실게요~

Page 10: API Design for C++, Chapter 8. Versioning

버전번호, 의미 / 규칙 / 버전API

버전 API 생성…

Page 11: API Design for C++, Chapter 8. Versioning

버전번호, 의미 / 규칙 / 버전API

버전 API 생성…

Page 12: API Design for C++, Chapter 8. Versioning

버전번호, 의미 / 규칙 / 버전API

OpenGL!

(WebGL)

Page 13: API Design for C++, Chapter 8. Versioning

버전번호, 의미 / 규칙 / 버전API

Windows!

Page 14: API Design for C++, Chapter 8. Versioning

버전번호, 의미 / 규칙 / 버전API

Windows!

DEPRECATED

Page 15: API Design for C++, Chapter 8. Versioning

버전번호, 의미 / 규칙 / 버전API

Windows!

Special Thanks to …

Page 16: API Design for C++, Chapter 8. Versioning

버전번호, 의미 / 규칙 / 버전API

Direct X!

Page 17: API Design for C++, Chapter 8. Versioning

브랜치, 전략 / 정책 / 병렬브랜치

http://www.slideshare.net/innover/70-20109362

Page 18: API Design for C++, Chapter 8. Versioning

브랜치, 전략 / 정책 / 병렬브랜치

http://www.slideshare.net/innover/70-20109362각자의상황에맞춰…, 장기프로젝트의경우개발브랜치는트렁크에서분리를권장

Page 19: API Design for C++, Chapter 8. Versioning

브랜치, 전략 / 정책 / 병렬브랜치http://www.tigris.org/scdocs/SVNTips.html

Page 20: API Design for C++, Chapter 8. Versioning

브랜치, 전략 / 정책 / 병렬브랜치http://nvie.com/posts/a-successful-git-branching-model/

Special Thanks to …

Page 21: API Design for C++, Chapter 8. Versioning

브랜치, 전략 / 정책 / 병렬브랜치http://nvie.com/posts/a-successful-git-branching-model/

Page 22: API Design for C++, Chapter 8. Versioning

브랜치, 전략 / 정책/(API와) 병렬브랜치

순차적이고하위호환성을유지하며릴리즈를이어가야한다

대규모소프트웨어프로젝트에서는많은개발자들이동시에여러개의브랜치를생성해서작업하기때문에, 동시다발적인 API 릴리즈를지원하기도한다.

(대규모프로젝트, Always Branch System쪽으로얘기하고있는듯)

•대상개발브랜치

•빈번한트렁크병합

•리뷰프로세스

Page 23: API Design for C++, Chapter 8. Versioning

브랜치, 파일포맷과병렬제품

3.X (Basic)

4.X (Advanced)

5.X (Basic)

6.X (Advanced)

7.X (Basic)

8.X (Advanced)

Page 24: API Design for C++, Chapter 8. Versioning

브랜치, 파일포맷과병렬제품

Page 25: API Design for C++, Chapter 8. Versioning

브랜치, 파일포맷과병렬제품

14.03.08 Basic(same manner) (Identifier)

14.03.08 Advanced

Page 26: API Design for C++, Chapter 8. Versioning

API의수명주기

사전릴리즈 –유지보수 –완료 –폐기예약

계획수립 –요구분석 –설계 –개발/구현 –테스트-유지보수

After release, you can evolve an API but not change it.

Page 27: API Design for C++, Chapter 8. Versioning

호환성수준, 하위/기능적/소스/이진/상위

하위호환성 이전버전의 API와같은기능을제공한다.

기능적호환성소스호환성이진호환성클라이언트 / 서버호환성파일포맷호환성

Page 28: API Design for C++, Chapter 8. Versioning

호환성수준, 하위/기능적/소스/이진/상위

기능적호환성

“API는기능적호환성의관점에서 100% 하위호환성을유지하지못한다“ –자로슬라브툴라크

•기능의변화는있지만버그수정이라는유용한예

•기능적호환성은 100% 유지하며내부동작만바뀌는예

Page 29: API Design for C++, Chapter 8. Versioning

호환성수준, 하위/기능적/소스/이진/상위

소스호환성 : 유지 -> 새로운버전출시-클라이언트재컴파일필요

하위호환성을넓은의미에서해석한말.

Page 30: API Design for C++, Chapter 8. Versioning

호환성수준, 하위/기능적/소스/이진/상위

소스호환성 : 유지 -> 새로운버전출시-클라이언트재컴파일필요

하위호환성을넓은의미에서해석한말.

?

Page 31: API Design for C++, Chapter 8. Versioning

호환성수준, 하위/기능적/소스/이진/상위

소스호환성 : 유지 -> 새로운버전출시-클라이언트재컴파일필요

하위호환성을넓은의미에서해석한말.

Page 32: API Design for C++, Chapter 8. Versioning

호환성수준, 하위/기능적/소스/이진/상위

이진호환성 : 새버전 API 정적라이브러리를링크 /혹은 (dll)간단히교체도가능.

API 에서발생하는모든변경사항은라이브러리파일안에있는모든클래스와메서드또는함수의표현형태에영향을미쳐서는안된다. 모든 API의이진형상은모든함수의타입이나크기정렬구조, 기호를동일하게유지해야한다.

:: ABI(Application Binary Interface)

Page 33: API Design for C++, Chapter 8. Versioning

호환성수준, 하위/기능적/소스/이진/상위

이진호환성이유지되지않는 API 변경

Page 34: API Design for C++, Chapter 8. Versioning

호환성수준, 하위/기능적/소스/이진/상위

이진호환성이유지되지않는 API 변경

• 클래스, 메서드혹은함수삭제

• 클래스에멤버변수를추가혹은삭제또는클래스에서멤버변수의순서를다시정렬

• 클래스에서기본클래스추가혹은삭제

• 멤버변수의타입변경

• 어떤경우에서든기존메서드의기호변경

• 템플릿파라미터의추가혹은삭제또는재정렬

• 비인라인메서드를인라인메서드로변경. 그반대의경우도동일

• 가상메서드의순서변경

• 가상메서드가없었던클래스에새로운가상메서드추가

• 새로운가상메서드추가

• 가상메서드오버라이드

Page 35: API Design for C++, Chapter 8. Versioning

호환성수준, 하위/기능적/소스/이진/상위

이진호환성이유지되는 API 변경

Page 36: API Design for C++, Chapter 8. Versioning

호환성수준, 하위/기능적/소스/이진/상위

이진호환성이유지되는 API 변경

• 새로운클래스, 비가상메서드또는자유함수의추가

• 클래스에 새로운정적변수추가

• private 정적변수삭제(인라인메서드에서참조하지않는경우)

• 비가상 private 메서드삭제(…)

• 인라인메서드의구현코드변경(…)

• 인라인메서드를비인라인메서드로변경(…)

• 메서드의기본파라미터변경(…)

• 클래스에서프렌즈선언을추가혹은삭제

• 클래스에새열거형추가

•기존열거형에새요소추가

•비트필드에서사용되지않는존비트의사용

Page 37: API Design for C++, Chapter 8. Versioning

호환성수준, 하위/기능적/소스/이진/상위

상위호환성 : 최신 API를사용해만든코드가아무런변경없이이전버전의 API를적용해서도컴파일될수있다.

Page 38: API Design for C++, Chapter 8. Versioning

호환성수준, 하위/기능적/소스/이진/상위

상위호환성 : 이전버전의 API로다운그레이드할수있으며다운그레이드해도아무런변경필요없이정상작동

•특정메서드에파라미터추가필요 –첫번째예제

•내장형데이터타입변경필요 – typedef, 불투명포인터

•데이터주도 API 설계방법 – ArgList컨테이너를파라미터로

Page 39: API Design for C++, Chapter 8. Versioning

하위호환성유지기능추가 : 는일반적으로별무리없는작업

이진호환성?

Page 40: API Design for C++, Chapter 8. Versioning

하위호환성유지기능변경 : 소스호환성만생각하면 OK / But …

소스호환성? 선택적파라미터, 기존함수에접미어추가

새로운함수로대체, 템플릿

이진호환성? 함수오버로딩(only way)

Page 41: API Design for C++, Chapter 8. Versioning

하위호환성유지기능변경 : 소스호환성만생각하면 OK / But …

함수의기호를변경하지않고 API의행동을변경할수있는보편적인방법

Opt-in

Page 42: API Design for C++, Chapter 8. Versioning

하위호환성유지기능교체 : 새로운함수를개발해서기존함수를대체

보안취약점강화, 좀더강력한기능추가, API 간결화등

~~~ deprecated ~~~ 어쩌고저쩌고하는 warning

해당함수/영향받는함수의명세에도해당내용을추가

Page 43: API Design for C++, Chapter 8. Versioning

하위호환성유지기능제거 : 제거 (보안이슈, 지원불가, API 개선걸림돌)

금지표시 + 경고메시지 --------------------> 제거

급진적인선택이지만불가피할경우에는허용되어야한다

API 기능을제거하되기존사용자들이제거된기능을사용할수있도록하는방법도있다 – e.g Qt라이브러리

Page 44: API Design for C++, Chapter 8. Versioning
Page 45: API Design for C++, Chapter 8. Versioning

API 리뷰http://simpleprogrammer.com/2010/06/09/dont-snub-the-code-review/

Page 46: API Design for C++, Chapter 8. Versioning

API 리뷰, 목적 / 사전릴리즈리뷰 / 사전커밋리뷰

API 리뷰의목적

•하위호환성유지

•설계의일관성유지

•변경관리

•미래를대비한개선준비

•해결방법의재검토

http://www.datamation.com/news/tech-comics-software-development-2.html

Page 47: API Design for C++, Chapter 8. Versioning

API 리뷰, 목적 / 사전릴리즈리뷰 / 사전커밋리뷰

Page 48: API Design for C++, Chapter 8. Versioning

API 리뷰, 목적 / 사전릴리즈리뷰 / 사전커밋리뷰

사전릴리즈리뷰 : 최종릴리즈이전, 대부분릴리즈이전에잘못된것들을바로잡기위한활동들을수행하며대부분좋은결과를만들어낸다. 최종방어선

•제품소유자

•기술리더

•문서화리더

Page 49: API Design for C++, Chapter 8. Versioning

API 리뷰, 목적 / 사전릴리즈리뷰 / 사전커밋리뷰

Focus on the interface being delivered.

DOCUMENTATION

Page 50: API Design for C++, Chapter 8. Versioning

API 리뷰, 목적 / 사전릴리즈리뷰 / 사전커밋리뷰

Focus on the interface being delivered.

은이것의짝퉁?

자기비판과회의에빠졌을때들러봤던곳

http://programming-motherfucker.com/

Page 51: API Design for C++, Chapter 8. Versioning

API 리뷰, 목적 / 사전릴리즈리뷰 / 사전커밋리뷰

api diff http://www.apidiff.com/

Page 52: API Design for C++, Chapter 8. Versioning

API 리뷰, 목적 / 사전릴리즈리뷰 / 사전커밋리뷰

체크리스트 : 이변경사항이…

• 하위호환성을훼손하는가?

• 이진호환성을훼손하는가(그리고그것지목적에부합하는가)?

• 충분히문서화돼있는가?

• 향후개선방향과도어울리는가?

• 성능을떨어뜨리는가?

• 아키텍처모델을따르고있는가?

• API 코딩표준을준수하고있는가?

• 코드내에서순환의존성을만들고있는가?

• 클라이언트가변경된 API를쉽게적용할수있도록 API가업그레이드스크립트또는데이터파일을제공하는가?

• 변경된코드의기능적호환성을검증하기위한자동화된테스트코드가존재하는가?

• 자동화테스트가필요한가? 마련되어있는가?

• 우리가릴리즈하고자했던것이맞는가?

• 새로운 API를테스트로실행해볼수있는예제코드가제공되는가?

Page 53: API Design for C++, Chapter 8. Versioning

API 리뷰, 목적 / 사전릴리즈리뷰 / 사전커밋리뷰

Page 54: API Design for C++, Chapter 8. Versioning

API 리뷰, 목적 / 사전릴리즈리뷰 / 사전커밋리뷰

사전커밋리뷰 : 개발프로세스에서부터경계를!

http://www.kaczanowscy.pl/tomek/2012-08/code-reviews-mindmap

Page 55: API Design for C++, Chapter 8. Versioning

API 리뷰, 목적 / 사전릴리즈리뷰 / 사전커밋리뷰

사전커밋리뷰 : 개발프로세스에서부터경계를!

http://www.methodsandtools.com/archive/archive.php?id=66

Page 56: API Design for C++, Chapter 8. Versioning

epilogue

미흡했던점, 용서를…

Page 57: API Design for C++, Chapter 8. Versioning

QEUSTIONS?

Page 58: API Design for C++, Chapter 8. Versioning

THANKS!

Page 59: API Design for C++, Chapter 8. Versioning

References +α

https://svn.apache.org/repos/asf/subversion/svn-logos/logo.html

http://perforce.com/

http://planetozh.com/blog/2012/11/got-git-tshirts/

http://git-scm.com/downloads/logos

http://www.gamecodi.com/board/zboard.php?id=GAMECODI_Talkdev&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=cocos&select_arrange=headnum&desc=asc&no=1836

http://www.firstever.eu/en/google-chrome-goes-64-bit-in-2014/

http://www.tomshardware.com/news/google-chrome-update-download-browser,14249.html

https://news.ycombinator.com/item?id=2189307

http://googlesystem.blogspot.kr/2010/11/google-chromes-version-number-is.html

http://cacm.acm.org/magazines/2010/10/99497-version-aversion/fulltext α는없어요!

빼먹은것이있다면, 용서를…

Page 60: API Design for C++, Chapter 8. Versioning

http://mozilla.github.io/process-releases/draft/development_overview/

http://www.slideshare.net/innover/70-20109362

http://www.tigris.org/scdocs/SVNTips

http://nvie.com/posts/a-successful-git-branching-model/

https://developer.mozilla.org/en-US/docs/Web/WebGL/Using_Extensions

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724832(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724832(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/apps/hh994923.aspx

α는없어요!

-끄읕 -

References +α