open source engineering

158
Open Source Engineering fHalo

Upload: youngsu-son

Post on 16-Apr-2017

2.058 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Open source engineering

Open Source Engineering fHalo

Page 2: Open source engineering

신재명 , 오유환 , 강미경 , 김영호

fHalo 팀

손영수

Page 3: Open source engineering

오픈소스 란 .

Page 4: Open source engineering

3 명의 거장 .

Richard Stall-man

Linus Torvalds Eric S. Ray-mond

Page 5: Open source engineering

처음 시작과 달리 현재의 오픈 소스는 ...

Page 6: Open source engineering

인류애의 사랑 그리고 기업들의 총성 없는 전쟁이 공존하는 곳

Page 7: Open source engineering

애플이 바라보는 Open Source

소프트웨어 자산 나쁜 마켓 쉐어링 Half-Open/Half-Close

Page 8: Open source engineering

구글이 바라보는 Open Source

소프트웨어 자산 Free Outsourcing(EcoSystem 구축 )

표준화 및 비 표준화

Page 9: Open source engineering

재미난 Web 브라우저 시장

Page 10: Open source engineering

Google 이 잘될수 밖에 없는 이유 ..

• CanvasGL – a GPU-accelerated We-bkit

Page 11: Open source engineering

1. 라이선스 조사

Page 12: Open source engineering

Open Source License

Page 13: Open source engineering

주요 License 비교GPL LGPL MIT BSD Apach

e

저작권 보호 기능 O O O O O

상용 SW 사용 가능 O O O O O

기능 확장 공개 의무 O O X X X

특허권 행사 가능 X X X X O

독점 프로그램에서 사용 가능 여부 X O O O O

라이선스 전파 여부 O O X X X

Page 14: Open source engineering

Open Source License

출처 http://bit.ly/JqfTFz , 2008 년

Open Source License 통계는 ?

GPL LGPL

BSD MIT

기타

GPL (60%)

LGPL (7%)BSD (6%)MIT (2%)

Page 15: Open source engineering

Open Source License

MPL (4%)BSD (64%)GPL (32%)

GPL BSD

MPL 기타

그리고 , 현재는 ?SourceForge, Code Complex, Google Code, Savannah, RubyForge, GitHub.

출처 , http://bit.ly/K8dZtU , 2011 년

Page 16: Open source engineering

주요 License 특허권 행사GPL LGPL MIT BSD Apach

e

저작권 보호 기능 O O O O O

상용 SW 사용 가능 O O O O O

기능 확장 공개 의무 O O X X X

특허권 행사 가능 X X X X O

독점 프로그램에서 사용 가능 여부 X O O O O

라이선스 전파 여부 O O X X X

Page 17: Open source engineering

주요 오픈소스 SW 사례

Page 18: Open source engineering

오픈 소스 라이선스 위반

오픈 소스 라이선스 분쟁

Page 19: Open source engineering

오픈 소스 라이선스 위반 사례

Page 20: Open source engineering

2. Committer & Reviewer Policy

Page 21: Open source engineering

OSP 의 방향을 좌우 하는자 Committer & Reviewer..

• 정부 주도형 – Webinos (EU 에서 주관 )

• 기업 컨소시엄 주도형– Webkit ( Apple + Google)

• 폐쇄형– jQuery ( 개인마음대로 -> Boarding 맴버 선정 )

Page 22: Open source engineering

3. 공개 이전에 사용부터 .Android 의 문제를 오픈소스로 ..

Page 23: Open source engineering

3.1 REST 의 귀찮음 .

Page 24: Open source engineering

Stub

Proxy

DAOCon-troller

REST

GETDTO

Page 25: Open source engineering

AfterRefactoringCustomer

+AmountInvoicedIn(Period: DateRange)+AmountRecievedIn(Period: DateRange)+AmountOverDueIn(Period: DateRange)

BeforeReactoringCustomer

+AmountInvoicedIn(start: Date, end: Date)+AmountRecievedIn(start: Date, end: Date)+AmountOverDueIn(start: Date, end: Date)

같이 뭉쳐 다니는 파라메터는 ParameterObject 로 묶어라 !

Page 26: Open source engineering

XML 파싱 이렇게 ??

Page 27: Open source engineering

Simple Framework 를 이용하세요 .

http://simple.source-forge.net/

Page 28: Open source engineering

이렇게 됩니다 .

Page 29: Open source engineering

3.2 아직도 Logcat?

Page 30: Open source engineering

여러분이 만든 시스템이 죽었다 .

미국에서… .

Page 31: Open source engineering

Logcat 보러 출장 ?

Page 32: Open source engineering

새로운 log..

4

Page 33: Open source engineering

먼저 Log Management 패턴부터…

Page 34: Open source engineering

log4xxx

Page 35: Open source engineering

Microlog4android 사용법• http://code.google.com/p/microlog4android/down-

loads/ 에서 microlog4android-1.0.0.jar 다운• Android 프로젝트에 jar 추가• AndroidManifest.xml 에

android.permission.WRITE_EXTERNAL_STORAG E 추가

Page 36: Open source engineering
Page 37: Open source engineering

로그를 Network 서버로 보내는

Appender 도 있으나약간의 코딩이 필요 .

Page 38: Open source engineering

4. Open Source Engineer-ing

Page 39: Open source engineering

4.1 Facebook 의 가치 그리고 문제점 ..

Page 40: Open source engineering

세계에서 가장 큰 서비스?

854,750,780( 약 8 억 5 천만 )

Page 41: Open source engineering

가장 오랜시간 이용하는 서비스?

Page 42: Open source engineering

Social Plugin ?Open Graph ?Social Channels ?Authentication ?Graph API ?

을 개발하려면… 너무 많은 것을 알아야 한다 .

Page 43: Open source engineering

batchFB

facebook SDK for AndroidzendFBlibfacebook-AWD

facebook SDK for .net

을 개발하려면… 쓸만한 녀석이 없다 ..

Page 44: Open source engineering

확장성 편의성 사용성 안정성

Framework 의 문제점 ..

?기존

Page 45: Open source engineering

framework

facebook framework Project

그래서 우리는 ..

를 시작했습니다 .

Page 46: Open source engineering

4.2 Facebook 기본 개념

Page 47: Open source engineering

47

소셜 그래프

Page 48: Open source engineering

48

About Graph API• Graph API

– 소셜 그래프의 Object( 친구 , 페이지 , 사진 등 ) 를 다루는 API

• Graph API 의 구조– https://graph.facebook.com/OBJECT_ID/

CONNECTION_TYPE

• ID 는 사용자 , 페이지 , 이벤트 , 사진 등의 Object ID– 약 20 개의 Object 를 지원– 모든 Object 의 ID 는 unique 하다– JSON 형태로 응답을 받는다

Page 49: Open source engineering

49

Graph API Example• https://graph.facebook.com/100001066448386/

• https://graph.facebook.com/40796308305/

신재명 ID

코카콜라 페이지 ID

Page 50: Open source engineering

50

Graph API - Connection• Graph API 의 구조

– https://graph.facebook.com/OBJECT_ID/CONNECTION_TYPE

• Connection 이란 ?– Object 의 연관 ( 관계 ) 개념

• User object 의 Connection 종류– Family, friends, album, likes, posts …– User object 경우 약 25 개의 Connection 을 제공– https://developers.facebook.com/docs/reference/api/user/ 참고

Page 51: Open source engineering

51

Connection - Example• Graph API 예시

– https://graph.facebook.com/100001066448386/friends

그럼 보안문제는 ???

Page 52: Open source engineering

52

Access Token• 페이스북 API 를 사용하기 위해 Access Token(인증 ) 이 필요하다 .

• Graph API Explorer 를 통하여 쉽게 Access To-ken 을 받아올 수 있음

Page 53: Open source engineering

53

About Graph API• Graph API Explorer

– Access Token 받을 수 있다– 각종 Graph API 를 테스트 해볼 수 있다

https://developers.facebook.com/tools/explorer#!/tools/explorer

Page 54: Open source engineering

4.3 Facebook 개발 도구에 대한 문제인식

Page 55: Open source engineering

Graph API 를 이용하여 친구리스트를 가져오는 소스자신의 친구리스트를 가져오는 그래프 API 를 호출한 다음반환 값인 JSON 데이터를 일일이 파싱하는 과정을 거침

try{URL url = new URL("https://graph.facebook.com/friends?access_token=ACCESS_TOKEN");connection = (HttpsURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setRequestProperty("Content-Type" , "application/x-www-form-urlencoded");connection.connect();InputStreamReader reader = new InputStreamReader(connection.getInputStream());bufferedReader = new BufferedReader(reader);String temp = null;StringBuffer buffer = new StringBuffer();while ((temp = bufferedReader.readLine()) != null) {

buffer.append(temp);}JsonObject json = new JsonObject(buffer.toString());JsonArray jsonArray = json.getJsonArray(“data”);For(int i=0;i<jsonArray.length();i++){

JsonObject jsonObject = jsonArray.getJsonObject(i);System.out.println(“My friends : " + json.get("name"));

}}connection.disconnect();

간단한 것 하나 하려고 해도코드를 길게… ..

그리고 너무 복잡하다 .

Page 56: Open source engineering

타 framework 의 문제점

안정적이지 못한 구조 , Circular dependency 발생facebook SDK for Android

Page 57: Open source engineering

높은 오염도 내포 , 다양한 문제요소

Tangled

Pollution : 4.19 Pollution : 2.18

facebook SDK for Android

타 framework 의 문제점

Page 58: Open source engineering

4.4 Facebook 프레임워크 개발하기

Page 59: Open source engineering

먼저 프로젝트 목표 ( 품질 ) 설정• Framework 의 80 대 20 법칙• 높은 사용성 확보 . ( 쉬운 개발 )• 튼튼한 아키텍처 확보• 오픈 소스를 통한 공유와 확장

Page 60: Open source engineering

4.4.1 팀원의 크기에 맞게 운용

Small Team Large Team

Page 61: Open source engineering

Framework 를 구축하는 팀원이 작으면 ..

Small Team

Simple Design

Consistency Design

Focus on 80/20 Rules

Page 62: Open source engineering

Large Team

Framework 를 구축하는 팀원이 매우 많다면 ..

Powerful Design

Lack Consistency

Remove Requirements

Page 63: Open source engineering

Framework 핵심 기능 찾기내가 만들 FB App 에 필요한 기능들 추출 ..

Page 64: Open source engineering

분류화 시키기 Framework 핵심 기능 찾기

Page 65: Open source engineering

20/80 Rule 에 의거한 기능 추출Framework 핵심 기능 찾기

Page 66: Open source engineering

우리가 만든 오픈소스 (프레임워크 )를 과연 다른 개발자가 쓸까?

사막을 달리고 있지 않나요 ?

4.4.2 높은 사용성 확보

Page 67: Open source engineering

You need Feedback.

Page 68: Open source engineering

DO design APIs by first writing code samples for the main scenarios and then defining the object model to support the code sam-

ples.

Page 69: Open source engineering

Code Samples

Page 70: Open source engineering

Read Filestatic void Main(string[] args) { StreamReader sr =

File.OpenText("MyFile.txt"); string s = sr.ReadLine();

while (s != null) { s = sr.ReadLine(); Console.WriteLine(s); } }

Page 71: Open source engineering

static void Main(string[] args){ foreach (string s in

File.ReadAllLines("MyFiles.text")) { Console.WriteLine(s); }}

Feedback (Read File)

Page 72: Open source engineering

Object Model Listing

Page 73: Open source engineering

framework 사용자 시나리오 산출

Page 74: Open source engineering

framework 사용자 시나리오 산출

Page 75: Open source engineering

framework 사용자 시나리오 산출

Page 76: Open source engineering

framework 사용자 시나리오 산출

Page 77: Open source engineering

친구 리스트 가져오기 ( 페이스북 API)

Page 78: Open source engineering

친구 리스트 가져오기– Rest FB

• Connection<User> myFriends = facebookClien-t.fetchConnection("me/friends", User.class);

– fHalo• Connection<Friends> friends =

user.friends();

Page 79: Open source engineering

피드 올리기 ( 페이스북 API)

Page 80: Open source engineering

피드 올리기– Rest FB

• FacebookType publishMessageResponse =facebookClient.publish("me/feed", FacebookType.-class,Parameter.with("message", "RestFB test"), Parame-ter.with(“caption", “caption test"), Parameter.with(“description", “description test"),);

– fHalo• Feed feed = new feed();

feed.setMessage("Message Test"); feed.setCaption("Caption Test"); feed.setDescription("Description Test"); user.publishFeed(me, feed);

Page 81: Open source engineering

4.4.3 튼튼한 아키텍쳐

Page 82: Open source engineering

튼튼한 아키텍쳐의 중요성 ..그리고 어떻게 파악하지 ?

Page 83: Open source engineering

왜 오픈소스에서 아키텍쳐가 중요한가 ?

Page 84: Open source engineering

높이 (30000 feet) 봐야 할까 ?

Page 85: Open source engineering

높이 봐야 할까 ?

Page 86: Open source engineering

자세히 (0 feet) 봐야 할까 ?

Page 87: Open source engineering

자세히 봐야 할까 ?

Page 88: Open source engineering

3 만 피트 vs 0 피트의 뷰 .3 만 피트• 다이어그램의 Line 의 의미는 ?

• 의존성 ?• 데이터 흐름 ?• 버스와 같은 공유자원 ?

0 피트• 너무 상세한 정보임 .• 전체적인 구조를 보지 못함 .

Page 89: Open source engineering

해결책은 ..적절한 1000 피트의 뷰

Page 90: Open source engineering
Page 91: Open source engineering

xDepend (Ndepend, Xdepend, CDepend)

NDepend - http://www.xdepend.com

Page 92: Open source engineering

또 하나의 도구 – Code Metrics

Demo

Page 93: Open source engineering

STAN (Structure Analysis for Java)

STAN - http://stan4j.com/eclipse/eclipse-integration.html

Demo

Page 94: Open source engineering

Robert C. Martin 의 그래프

Page 95: Open source engineering

Instability•패키지의 안정성을 측정•다른 패키지에 영향을 미치지 않고 , 해당 패키지를 쉽게 변경 수 있는가 ?

•Instability I = Ce / (Ca+Ce)

•Ce = Efferent Coupling (Outgoing Dependencies)•Ca = Afferent Coupling (Ingoing Dependencies )

Page 96: Open source engineering

Instability

Instability I = Ce / (Ca+Ce)당신의 패키지가 다른 사람이 많이 쓴다면, 즉 Outgoing, Ce가 많다면, 여러분의 패키지는 변경하기 어렵다.

반대로 Outgoing하는 Ce가 적다면, 여러분의 패키지는 쉽게 변경해도 된다.즉 0.0에서 0.3이면 안정적인 버전, 0.7에서 1.0이면 불안정적인 상태다

당신의 패키지를 누군가 많이 쓰고 있다면

바꾸기 쉽지 않다 .

Page 97: Open source engineering

AbstractnessInterface(Abstract) 와 Concrete Class를 비교

A = (#abstract classes / total # of classes)

•Abstract class = interface, abstract 다 포함•Total # class = abstract class + concrete class

•0 이면 concrete class 만 있다 . •1 이면 abstract class 만 있다 .

Page 98: Open source engineering

다시 보는 그래프

조금 더 ab-stract 를 높여야 돼 !

Page 99: Open source engineering

그 외 용어•Tangled Complexity

• 순환 참조가 있어 Boundary 를 깰 때•Cyclomatic Complexity

• 분기 문이 많아 hotspot 이 될 가망성이 높은 곳

Page 100: Open source engineering

경고 !!!환자의 외부 증상만 고치는 의사가 되지 말자 !!

이러한 정보는 좋은 가이드일뿐 !! 숫자에 의존하다가 오히려 아키텍쳐가 무너진다 .

Page 101: Open source engineering

4.4.4 fHalo 아키텍쳐 리팩토링

Page 102: Open source engineering

아키텍쳐 구조도 및 오염도 1. facebook SDK for Android

Page 103: Open source engineering

아키텍쳐 구조도 및 오염도 2. restFB

Tangled

Page 104: Open source engineering

RestFB Refactoring• STEP 1. 구조 분석하기

Page 105: Open source engineering

RestFB Refactoring 전• STEP 2. 문제 원인 분석하기

Page 106: Open source engineering

fHalo Refactoring 결과• STEP 2. 문제 원인 분석하기

Page 107: Open source engineering

fHalo Refactoring 결과• STEP 3. 패키지 분리

Wrapper Facade

Page 108: Open source engineering

RestFB Refactoring 전• STEP 4. 가독성있는 네이밍 정의

어떻게 써야하지 ?

Page 109: Open source engineering

fHalo Refactoring 결과• STEP 4. 가독성있는 네이밍 정의

Page 110: Open source engineering

아키텍쳐 구조 – fHalo Framework

Page 111: Open source engineering

아키텍쳐 오염도

fHalo Framework

Pollution : 0.97

Page 112: Open source engineering

- Gof 디자인 패턴의 저자 / 프레임워크의 대가 Ralph Johnson

“ 안정화된 framework 을 얻기 위해 최소 3 번의 target application 을 기반으로 만들어진 framework 여야 된다 .”

- Gof 디자인 패턴의 저자 / 프레임워크의 창시자 Ralph Johnson

1. 자체적인 Target Application 개발2. 페이스북을 활용하는 ‘ Yellow Ribbon’ 팀과의 협력3. 페이스북 헤카톤으로 또 한번의 검증

4.4.5 3 Example 로 품질 확보하기

Page 113: Open source engineering

Target Application - enjoybazaar

Page 114: Open source engineering

Target Application – Yellow Ribbon

Page 115: Open source engineering

Target Application – Promise Mind

Page 116: Open source engineering

4.4.6 외부로 오픈하기

Page 117: Open source engineering

Project Page Open! – jQuery Page

Page 118: Open source engineering

Project Page Open!

Page 119: Open source engineering

github Repository Open Page Open!

Page 120: Open source engineering

Step by Step Tutorial

Step1Import fHalo.jar

Step2Get access token

Step3Create instance

Step4Using API

Page 121: Open source engineering

Video Tutorial

Page 122: Open source engineering

Video Tutorial 동영상 통계자료

Page 123: Open source engineering

Video Tutorial – Feedback 1

Page 124: Open source engineering

- jQuery, Spring 과 같이 성공한 OpenSource 로 발전

- 타임라인 / 크레딧 등 페이스북에서 제공되는 신규 기능들을 꾸준히반영하여 All in One SDK 로 발전

- 페이스북의 Meta Data 를 활용할 수 있는 DA(Data Analysis) 와

DV(Data Visualization) 를 제공하는 SDK 발전 , 페이스북 개발자 생태계에 좋은 영향을 제공

- 현재 진행한 프로젝트는 다양한 세미나 주제 발표와 월간 ‘마이크로 소프트웨어’에 3~4 개월여에 걸쳐 기고 하여 , 널리 알리고 공유할 예정 .

fHalo 향후 발전방향

Page 125: Open source engineering

- 오픈소스 SW 의 탄생부터 현재까지의 역사를 한눈에 보여주는 박물관

- 오픈소스 SW 의 개발과 진화과정을 추적하고 공개하는 사이트

- 품질을 평가할 수 있는 다양한 지표들을 제공

Ohloh.net

Page 126: Open source engineering

5. Git & GitHub

Page 127: Open source engineering

127

버전 관리 시스템• 프로젝트 파일의 변경사항을 추적하는 시스템• 버전 컨트롤 자동화 , 간편한 소스 변경이력 관리• 손쉬운 협업 , roll back, 병렬작업

Page 128: Open source engineering

128

중앙 집중식 버전관리• CVS(Concurrent Version System),

SVN(Subversion)• 소스변경 이력을 보려면 중앙 저장소에 접근 .

Page 129: Open source engineering

129

분산 버전관리• Git 자신만의 로컬저장소를 가진다• Linux Kernel, Android, Ruby on Rails – Git 이용 예

Page 130: Open source engineering

130

Git 주요 용어

Com-mit

Push

Pull

Client

Server Server Repository

Local Reposi-tory

Page 131: Open source engineering

131

Git 주요 용어• Branch

– 작업 트리중 하나의 가지

– 후에 master branch 와 합치거나 실험해 본 후 삭제• Merge

– Branch 를 합침

Page 132: Open source engineering

132

Git 사용법• Repository

– Github– 네이버개발자센터– Bitbucket

• Github 사용– http://github.com

• Git download– http://help.github.com/win-set-up-git/

Page 133: Open source engineering

133

Git Bash

Page 134: Open source engineering

134

SSH key 생성• SSH key 생성

– ssh-keygen –t rsa –c “[email protected]”– ~.ssh\id_rsa.pub 에서 확인

Page 135: Open source engineering

135

SSH Key 등록

Page 136: Open source engineering

136

Git 기본 환경설정• 기본 환경설정 (Git bash)

– Command 창 에서 이름과 메일을 입력Git config --global user.name “Jaemyung Shin”Git config --global user.mail “[email protected]

Page 137: Open source engineering

137

Git 설정• Git init 을 통해 로컬 저장소 생성

• Git add < 파일명 > 을 통해 파일 추가

1.Git 설정 2.Commit 3.Push 4.Pull

Page 138: Open source engineering

138

Commit• 변경 사항들을 로컬저장소에 저장• Git commit –m “commit log”

1.Git 설정 2.Commit 3.Push 4.Pull

Page 139: Open source engineering

139

Push• 로컬저장소의 파일을 원격저장소에 저장 • Git push < 원격저장소 URL>

1.Git 설정 2.Commit 3.Push 4.Pull

Page 140: Open source engineering

140

GitHub Repository• Create repository

• 원격 저장소 주소 필요 [email protected]:fHalo/test.git

원격저장소 URL

Page 141: Open source engineering

141

Push 후 GitHub Repository

Page 142: Open source engineering

142

Pull• 원격저장소의 파일을 로컬저장소로 가져옴• Git pull < 원격지 URL>

1.Git 설정 2.Commit 3.Push 4.Pull

Page 143: Open source engineering

143

Egit(Eclipse Git)• Eclipse plug-in 으로 간편히 제공• Help Install New Software Add(http://www.jgit.org/up-

dates)

Page 144: Open source engineering

144

원격 프로젝트 생성• Import Git

– Local : 로컬에있는 Git 프로젝트로 생성– URI : 원격지에 있는 Git 프로젝트 다운 (Pull)

Page 145: Open source engineering

145

원격 프로젝트 생성• URI, Authentication 채우기

– URI : 저장소 주소– Authentication : github ID, PW

Page 146: Open source engineering

146

Egit 사용법• Git project 생성 후

Page 147: Open source engineering

147

Egit 을 이용한 Commit

Page 148: Open source engineering

148

Egit 을 이용한 Commit 이력 보기• Show history

– Commit 이력보기

Page 149: Open source engineering

149

Egit 을 통한 Push• 로컬저장소의 내용을 원격저장소로 전송

Page 150: Open source engineering

150

Egit 을 이용한 Pull• 충돌없을경우 Pull 성공• 충돌할경우 충돌로그

소스구분선

Page 151: Open source engineering

151

Egit 을 통한 roll back• 예전 코드로 복원하기

– Revert commit

Page 152: Open source engineering

6. 마무리 및 참고자료

Page 153: Open source engineering

요약 오픈 소스는 인류애적인 사랑과 밴더들의 전쟁이 공존하는 곳 . 오픈 소스는 소프트웨어 개발에 중요한 Asset 이다 . 사용하든 , 배포하든 라이선스를 주의해라 . 배포시 Committer & Reviewer Policy 를 주의해라 . 외부의 도움 ( 아웃 소싱 ) 을 받기 위해선 구조적 설계가 중요 . 엔지니어링 기법 소개

Git & GitHub 사용법

fHalo Project

Page 154: Open source engineering

참고 자료• License 분류 참고 자료

– http://bit.ly/KkPDBP

• Open Source License 통계– http://bit.ly/JqfTFz – http://bit.ly/K8dZtU

Page 155: Open source engineering

• Github Wiki page – https://github.com/fHalo/fHalo/wiki

참고 자료

Page 156: Open source engineering

• fHalo web site– http://fhalo.org/index.html

참고 자료

Page 157: Open source engineering

• 구글독스를 통한 사용성 회의– goo.gl/WhABe

참고 자료

Page 158: Open source engineering

Q&A